Contents of /tags/mkinitrd-6_1_2/busybox/libbb/safe_poll.c
Parent Directory | Revision Log
Revision 844 -
(show annotations)
(download)
Mon May 4 17:23:09 2009 UTC (15 years, 4 months ago) by niro
File MIME type: text/plain
File size: 870 byte(s)
Mon May 4 17:23:09 2009 UTC (15 years, 4 months ago) by niro
File MIME type: text/plain
File size: 870 byte(s)
tagged 'mkinitrd-6_1_2'
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 FAST_FUNC 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 | } |