1/* vi: set sw=4 ts=4: */ 2/* 3 * Utility routines. 4 * 5 * Copyright (C) 2007 by Denys Vlasenko <vda.linux@googlemail.com> 6 * 7 * Licensed under GPLv2, see file LICENSE in this source tree. 8 */ 9#include "libbb.h" 10 11/* Wrapper which restarts poll on EINTR or ENOMEM. 12 * On other errors does perror("poll") and returns. 13 * Warning! May take longer than timeout_ms to return! */ 14int FAST_FUNC safe_poll(struct pollfd *ufds, nfds_t nfds, int timeout) 15{ 16 while (1) { 17 int n = poll(ufds, nfds, timeout); 18 if (n >= 0) 19 return n; 20 /* Make sure we inch towards completion */ 21 if (timeout > 0) 22 timeout--; 23 /* E.g. strace causes poll to return this */ 24 if (errno == EINTR) 25 continue; 26 /* Kernel is very low on memory. Retry. */ 27 /* I doubt many callers would handle this correctly! */ 28 if (errno == ENOMEM) 29 continue; 30 bb_simple_perror_msg("poll"); 31 return n; 32 } 33} 34