busybox/libbb/safe_poll.c
<<
>>
Prefs
   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
  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! */
  15int 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}
  35