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#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! */
  14int 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_perror_msg("poll");
  31                return n;
  32        }
  33}
  34