blob: a07e785f31b84cede187d6c3ca93d762296354b6 [file] [log] [blame]
Denis Vlasenko5d61e712007-09-27 10:09:59 +00001/* vi: set sw=4 ts=4: */
2/*
3 * Utility routines.
4 *
5 * Copyright (C) 2007 by Denys Vlasenko <vda.linux@googlemail.com>
6 *
Denys Vlasenko0ef64bd2010-08-16 20:14:46 +02007 * Licensed under GPLv2, see file LICENSE in this source tree.
Denis Vlasenko5d61e712007-09-27 10:09:59 +00008 */
Denis Vlasenko5d61e712007-09-27 10:09:59 +00009#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! */
Denis Vlasenkodefc1ea2008-06-27 02:52:20 +000014int FAST_FUNC safe_poll(struct pollfd *ufds, nfds_t nfds, int timeout)
Denis Vlasenko5d61e712007-09-27 10:09:59 +000015{
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;
James Byrne69374872019-07-02 11:35:03 +020030 bb_simple_perror_msg("poll");
Denis Vlasenko5d61e712007-09-27 10:09:59 +000031 return n;
32 }
33}