Initial public busybox upstream commit
[busybox4maemo] / 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 tarball for details.
8  */
9
10 #include "libbb.h"
11
12 /* Wrapper which restarts poll on EINTR or ENOMEM.
13  * On other errors does perror("poll") and returns.
14  * Warning! May take longer than timeout_ms to return! */
15 int safe_poll(struct pollfd *ufds, nfds_t nfds, int timeout)
16 {
17         while (1) {
18                 int n = poll(ufds, nfds, timeout);
19                 if (n >= 0)
20                         return n;
21                 /* Make sure we inch towards completion */
22                 if (timeout > 0)
23                         timeout--;
24                 /* E.g. strace causes poll to return this */
25                 if (errno == EINTR)
26                         continue;
27                 /* Kernel is very low on memory. Retry. */
28                 /* I doubt many callers would handle this correctly! */
29                 if (errno == ENOMEM)
30                         continue;
31                 bb_perror_msg("poll");
32                 return n;
33         }
34 }