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! */
safe_poll(struct pollfd * ufds,nfds_t nfds,int timeout)14 int 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