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