select.c revision a5c23ccce0db4cb0f6f4c2e7dd6f002d71875137
8326d453818c9fb78ac1670cf49d26fa4da15003venki * CDDL HEADER START
8326d453818c9fb78ac1670cf49d26fa4da15003venki * The contents of this file are subject to the terms of the
8326d453818c9fb78ac1670cf49d26fa4da15003venki * Common Development and Distribution License (the "License").
8326d453818c9fb78ac1670cf49d26fa4da15003venki * You may not use this file except in compliance with the License.
8326d453818c9fb78ac1670cf49d26fa4da15003venki * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
8326d453818c9fb78ac1670cf49d26fa4da15003venki * See the License for the specific language governing permissions
8326d453818c9fb78ac1670cf49d26fa4da15003venki * and limitations under the License.
8326d453818c9fb78ac1670cf49d26fa4da15003venki * When distributing Covered Code, include this CDDL HEADER in each
8326d453818c9fb78ac1670cf49d26fa4da15003venki * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
8326d453818c9fb78ac1670cf49d26fa4da15003venki * If applicable, add the following below this CDDL HEADER, with the
8326d453818c9fb78ac1670cf49d26fa4da15003venki * fields enclosed by brackets "[]" replaced with your own identifying
8326d453818c9fb78ac1670cf49d26fa4da15003venki * information: Portions Copyright [yyyy] [name of copyright owner]
8326d453818c9fb78ac1670cf49d26fa4da15003venki * CDDL HEADER END
8326d453818c9fb78ac1670cf49d26fa4da15003venki * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
8326d453818c9fb78ac1670cf49d26fa4da15003venki * Use is subject to license terms.
8326d453818c9fb78ac1670cf49d26fa4da15003venki#pragma ident "%Z%%M% %I% %E% SMI"
8326d453818c9fb78ac1670cf49d26fa4da15003venki/* Copyright (c) 1988 AT&T */
8326d453818c9fb78ac1670cf49d26fa4da15003venki/* All Rights Reserved */
8326d453818c9fb78ac1670cf49d26fa4da15003venki * Emulation of select() system call using poll() system call.
8326d453818c9fb78ac1670cf49d26fa4da15003venki * Assumptions:
8326d453818c9fb78ac1670cf49d26fa4da15003venki * polling for input only is most common.
8326d453818c9fb78ac1670cf49d26fa4da15003venki * polling for exceptional conditions is very rare.
8326d453818c9fb78ac1670cf49d26fa4da15003venki * Note that is it not feasible to emulate all error conditions,
8326d453818c9fb78ac1670cf49d26fa4da15003venki * in particular conditions that would return EFAULT are far too
8326d453818c9fb78ac1670cf49d26fa4da15003venki * difficult to check for in a library routine.
8326d453818c9fb78ac1670cf49d26fa4da15003venkipselect(int nfds, fd_set *in0, fd_set *out0, fd_set *ex0,
8326d453818c9fb78ac1670cf49d26fa4da15003venki int j; /* loop counter */
8326d453818c9fb78ac1670cf49d26fa4da15003venki /* "zero" is read-only, it could go in the text segment */
8326d453818c9fb78ac1670cf49d26fa4da15003venki * Check for invalid conditions at outset.
8326d453818c9fb78ac1670cf49d26fa4da15003venki * Required for spec1170.
8326d453818c9fb78ac1670cf49d26fa4da15003venki * SUSV3: We must behave as a cancellation point even if we fail early.
8326d453818c9fb78ac1670cf49d26fa4da15003venki return (-1);
8326d453818c9fb78ac1670cf49d26fa4da15003venki p = pfd = (struct pollfd *)alloca(nfds * sizeof (struct pollfd));
8326d453818c9fb78ac1670cf49d26fa4da15003venki /* check timespec validity */
8326d453818c9fb78ac1670cf49d26fa4da15003venki return (-1);
8326d453818c9fb78ac1670cf49d26fa4da15003venki * If any input args are null, point them at the null array.
8326d453818c9fb78ac1670cf49d26fa4da15003venki * For each fd, if any bits are set convert them into
8326d453818c9fb78ac1670cf49d26fa4da15003venki * the appropriate pollfd struct.
8326d453818c9fb78ac1670cf49d26fa4da15003venki if (b & 1) {
8326d453818c9fb78ac1670cf49d26fa4da15003venki p->fd = n + j;
goto done;
p->events = 0;
if (*in & m)
if (*out & m)
if (*ex & m)
in++;
out++;
ex++;
done:
return (rv);
if (rv == 0) {
*in++ = 0;
*out++ = 0;
*ex++ = 0;
for (p = pfd, j = n; j-- > 0; p++) {
rv = 0;
for (p = pfd; n-- > 0; p++) {
if (j != lastj) {
*in = 0;
*out = 0;
*ex = 0;
lastj = j;
if (p->revents) {
*in |= m;
rv++;
*out |= m;
rv++;
*ex |= m;
rv++;
if ((*in & m) == 0)
*in |= m;
if ((*out & m) == 0)
*out |= m;
if ((*ex & m) == 0)
*ex |= m;
return (rv);