12345678910111213141516171819202122232425262728293031323334 |
- /* 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 FAST_FUNC 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;
- }
- }
|