Start 1.33.0 development cycle
[oweals/busybox.git] / libbb / safe_poll.c
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! */
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 }