| /* vi: set sw=4 ts=4: */ |
| /* |
| * Utility routines. |
| * |
| * Copyright (C) 2007 by Denys Vlasenko <vda.linux@googlemail.com> |
| * |
| * Licensed under GPLv2, see file LICENSE in this tarball for details. |
| */ |
| |
| #include "libbb.h" |
| |
| /* Wrapper which restarts poll on EINTR or ENOMEM. |
| * On other errors does perror("poll") and returns. |
| * Warning! May take longer than timeout_ms to return! */ |
| int safe_poll(struct pollfd *ufds, nfds_t nfds, int timeout) |
| { |
| while (1) { |
| int n = poll(ufds, nfds, timeout); |
| if (n >= 0) |
| return n; |
| /* Make sure we inch towards completion */ |
| if (timeout > 0) |
| timeout--; |
| /* E.g. strace causes poll to return this */ |
| if (errno == EINTR) |
| continue; |
| /* Kernel is very low on memory. Retry. */ |
| /* I doubt many callers would handle this correctly! */ |
| if (errno == ENOMEM) |
| continue; |
| bb_perror_msg("poll"); |
| return n; |
| } |
| } |