4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Copyright (c) 1982, 1986, 1989, 1993
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * The Regents of the University of California. All rights reserved.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * (c) UNIX System Laboratories, Inc.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * All or some portions of this file are derived from material licensed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * to the University of California by American Telephone and Telegraph
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Co. or Unix System Laboratories, Inc. and are reproduced herein with
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * the permission of UNIX System Laboratories, Inc.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Portions copyright (c) 1999, 2000
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Intel Corporation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * All rights reserved.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Redistribution and use in source and binary forms, with or without
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * modification, are permitted provided that the following conditions
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * are met:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * 1. Redistributions of source code must retain the above copyright
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * notice, this list of conditions and the following disclaimer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * 2. Redistributions in binary form must reproduce the above copyright
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * notice, this list of conditions and the following disclaimer in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * documentation and/or other materials provided with the distribution.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * 3. All advertising materials mentioning features or use of this software
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * must display the following acknowledgement:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This product includes software developed by the University of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * California, Berkeley, Intel Corporation, and its contributors.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * 4. Neither the name of University, Intel Corporation, or their respective
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * contributors may be used to endorse or promote products derived from
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * this software without specific prior written permission.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * THIS SOFTWARE IS PROVIDED BY THE REGENTS, INTEL CORPORATION AND
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * INTEL CORPORATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * @(#)sys_generic.c 8.5 (Berkeley) 1/21/94
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * $Id: select.c,v 1.1.1.1 2003/11/19 01:50:30 kyu3 Exp $
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/UefiBootServicesTableLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <LibConfig.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <stdlib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <unistd.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <strings.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <sys/poll.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <sys/param.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <sys/time.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifndef KERNEL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define KERNEL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <errno.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#undef KERNEL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <errno.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef EFI_NT_EMULATOR
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define _SELECT_DELAY_ 10000
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define _SELECT_DELAY_ 1000
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define MAX_SLEEP_DELAY 0xfffffffe
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Sleep for the specified number of Microseconds.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Implements the usleep(3) function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Microseconds Number of microseconds to sleep.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval 0 Always returns zero.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncusleep( useconds_t Microseconds )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while ( MAX_SLEEP_DELAY < Microseconds ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->Stall ( MAX_SLEEP_DELAY );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Microseconds -= MAX_SLEEP_DELAY;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->Stall((UINTN)Microseconds );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncunsigned int
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncsleep( unsigned int Seconds )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (usleep( (useconds_t)(Seconds * 1000000) ));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic int
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncselscan(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fd_mask **ibits,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fd_mask **obits,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int nfd,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int *nselected
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int msk;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int j;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int fd;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int n;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync struct pollfd pfd;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int FdCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fd_mask bits;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* Note: backend also returns POLLHUP/POLLERR if appropriate. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static int16_t flag[3] = { POLLRDNORM, POLLWRNORM, POLLRDBAND };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (msk = 0, n = 0; msk < 3; msk++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ibits[msk] == NULL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i = 0; i < nfd; i += NFDBITS) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bits = ibits[ msk ][ i / NFDBITS ];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (( 0 != (j = ffs(bits))) && ((fd = i + --j) < nfd)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bits &= ~(1 << j);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pfd.fd = fd;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pfd.events = flag[msk];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pfd.revents = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FdCount = poll ( &pfd, 1, 0 );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( -1 == FdCount ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return errno;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( 0 != FdCount ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync obits[msk][(fd)/NFDBITS] |=
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (1 << ((fd) % NFDBITS));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync n++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *nselected = n;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncselect(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int nd,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fd_set *in,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fd_set *ou,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fd_set *ex,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync struct timeval *tv
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fd_mask *ibits[3], *obits[3], *selbits, *sbp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int error, forever, nselected;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync u_int nbufbytes, ncpbytes, nfdbits;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int64_t timo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (nd < 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EINVAL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Allocate just enough bits for the non-null fd_sets. Use the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * preallocated auto buffer if possible.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync nfdbits = roundup(nd, NFDBITS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ncpbytes = nfdbits / NBBY;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync nbufbytes = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (in != NULL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync nbufbytes += 2 * ncpbytes;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ou != NULL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync nbufbytes += 2 * ncpbytes;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ex != NULL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync nbufbytes += 2 * ncpbytes;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync selbits = malloc(nbufbytes);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Assign pointers into the bit buffers and fetch the input bits.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Put the output buffers together so that they can be bzeroed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * together.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sbp = selbits;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define getbits(name, x) \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do { \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (name == NULL) \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ibits[x] = NULL; \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else { \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ibits[x] = sbp + nbufbytes / 2 / sizeof *sbp; \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync obits[x] = sbp; \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sbp += ncpbytes / sizeof *sbp; \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bcopy(name, ibits[x], ncpbytes); \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync getbits(in, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync getbits(ou, 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync getbits(ex, 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#undef getbits
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (nbufbytes != 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync memset(selbits, 0, nbufbytes / 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (tv) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync timo = tv->tv_usec + (tv->tv_sec * 1000000);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync forever = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync timo = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync forever = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Poll for I/O events
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync nselected = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Scan for pending I/O
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync error = selscan(ibits, obits, nd, &nselected);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (error || nselected)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Adjust timeout is needed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (timo) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Give it a rest
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync usleep( _SELECT_DELAY_ );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync timo -= _SELECT_DELAY_;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (timo > 0 || forever);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* select is not restarted after signals... */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (error == ERESTART)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync error = EINTR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else if (error == EWOULDBLOCK)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync error = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define putbits(name, x) if (name) bcopy(obits[x], name, ncpbytes)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (error == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync putbits(in, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync putbits(ou, 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync putbits(ex, 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#undef putbits
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync errno = error;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync nselected = -1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync free( selbits );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ( nselected );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}