1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 28 /* All Rights Reserved */ 29 30 /* 31 * University Copyright- Copyright (c) 1982, 1986, 1988 32 * The Regents of the University of California 33 * All Rights Reserved 34 * 35 * University Acknowledgment- Portions of this document are derived from 36 * software developed by the University of California, Berkeley, and its 37 * contributors. 38 */ 39 40 #ifndef _SYS_SELECT_H 41 #define _SYS_SELECT_H 42 43 #include <sys/feature_tests.h> 44 45 #ifndef _KERNEL 46 #if !defined(__XOPEN_OR_POSIX) || defined(_XPG6) || defined(__EXTENSIONS__) 47 #include <sys/time_impl.h> 48 #endif 49 #include <sys/time.h> 50 #endif /* _KERNEL */ 51 52 #ifdef __cplusplus 53 extern "C" { 54 #endif 55 56 57 #if !defined(__XOPEN_OR_POSIX) || defined(_XPG6) || defined(__EXTENSIONS__) 58 /* 59 * The sigset_t type is defined in <sys/signal.h> and duplicated 60 * in <sys/ucontext.h> as a result of XPG4v2 requirements. XPG6 61 * now allows the visibility of signal.h in this header, however 62 * an order of inclusion problem occurs as a result of inclusion 63 * of <sys/select.h> in <signal.h> under certain conditions. 64 * Rather than include <sys/signal.h> here, we've duplicated 65 * the sigset_t type instead. This type is required for the XPG6 66 * introduced pselect() function also declared in this header. 67 */ 68 #ifndef _SIGSET_T 69 #define _SIGSET_T 70 typedef struct { /* signal set type */ 71 unsigned int __sigbits[4]; 72 } sigset_t; 73 #endif /* _SIGSET_T */ 74 75 #endif /* #if !defined(__XOPEN_OR_POSIX) || defined(_XPG6) ... */ 76 77 /* 78 * Select uses bit masks of file descriptors in longs. 79 * These macros manipulate such bit fields. 80 * FD_SETSIZE may be defined by the user, but the default here 81 * should be >= RLIM_FD_MAX. 82 */ 83 #ifndef FD_SETSIZE 84 #define FD_SETSIZE 65536 85 #endif /* FD_SETSIZE */ 86 87 #if !defined(_XPG4_2) || defined(__EXTENSIONS__) 88 typedef long fd_mask; 89 #endif 90 typedef long fds_mask; 91 92 /* 93 * The value of _NBBY needs to be consistant with the value 94 * of NBBY in <sys/param.h>. 95 */ 96 #define _NBBY 8 97 #if !defined(_XPG4_2) || defined(__EXTENSIONS__) 98 #ifndef NBBY /* number of bits per byte */ 99 #define NBBY _NBBY 100 #endif 101 #endif /* !defined(_XPG4_2) || defined(__EXTENSIONS__) */ 102 103 #if !defined(_XPG4_2) || defined(__EXTENSIONS__) 104 #define NFDBITS (sizeof (fd_mask) * NBBY) /* bits per mask */ 105 #endif 106 #define FD_NFDBITS (sizeof (fds_mask) * _NBBY) /* bits per mask */ 107 108 #define __howmany(__x, __y) (((__x)+((__y)-1))/(__y)) 109 #if !defined(_XPG4_2) || defined(__EXTENSIONS__) 110 #ifndef howmany 111 #define howmany(x, y) (((x)+((y)-1))/(y)) 112 #endif 113 #endif /* !defined(_XPG4_2) || defined(__EXTENSIONS__) */ 114 115 #if !defined(_XPG4_2) || defined(__EXTENSIONS__) 116 typedef struct fd_set { 117 #else 118 typedef struct __fd_set { 119 #endif 120 long fds_bits[__howmany(FD_SETSIZE, FD_NFDBITS)]; 121 } fd_set; 122 123 #define FD_SET(__n, __p) ((__p)->fds_bits[(__n)/FD_NFDBITS] |= \ 124 (1ul << ((__n) % FD_NFDBITS))) 125 126 #define FD_CLR(__n, __p) ((__p)->fds_bits[(__n)/FD_NFDBITS] &= \ 127 ~(1ul << ((__n) % FD_NFDBITS))) 128 129 #define FD_ISSET(__n, __p) (((__p)->fds_bits[(__n)/FD_NFDBITS] & \ 130 (1ul << ((__n) % FD_NFDBITS))) != 0l) 131 132 #ifdef _KERNEL 133 #define FD_ZERO(p) bzero((p), sizeof (*(p))) 134 #else 135 #define FD_ZERO(__p) (void) memset((__p), 0, sizeof (*(__p))) 136 #endif /* _KERNEL */ 137 138 #ifndef _KERNEL 139 #ifdef __STDC__ 140 extern int select(int, fd_set *_RESTRICT_KYWD, fd_set *_RESTRICT_KYWD, 141 fd_set *_RESTRICT_KYWD, struct timeval *_RESTRICT_KYWD); 142 143 #if !defined(__XOPEN_OR_POSIX) || defined(_XPG6) || defined(__EXTENSIONS__) 144 extern int pselect(int, fd_set *_RESTRICT_KYWD, fd_set *_RESTRICT_KYWD, 145 fd_set *_RESTRICT_KYWD, const struct timespec *_RESTRICT_KYWD, 146 const sigset_t *_RESTRICT_KYWD); 147 #endif 148 149 #else 150 extern int select(); 151 #if !defined(__XOPEN_OR_POSIX) || defined(_XPG6) || defined(__EXTENSIONS__) 152 extern int pselect(); 153 #endif 154 #endif /* __STDC__ */ 155 #endif /* _KERNEL */ 156 157 #ifdef __cplusplus 158 } 159 #endif 160 161 #endif /* _SYS_SELECT_H */