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 >= NOFILE (param.h). 82 */ 83 #ifndef FD_SETSIZE 84 #ifdef _LP64 85 #define FD_SETSIZE 65536 86 #else 87 #define FD_SETSIZE 1024 88 #endif /* _LP64 */ 89 #elif FD_SETSIZE > 1024 && !defined(_LP64) 90 #ifdef __PRAGMA_REDEFINE_EXTNAME 91 #pragma redefine_extname select select_large_fdset 92 #if !defined(__XOPEN_OR_POSIX) || defined(_XPG6) || defined(__EXTENSIONS__) 93 #pragma redefine_extname pselect pselect_large_fdset 94 #endif 95 #else /* __PRAGMA_REDEFINE_EXTNAME */ 96 #define select select_large_fdset 97 #if !defined(__XOPEN_OR_POSIX) || defined(_XPG6) || defined(__EXTENSIONS__) 98 #define pselect pselect_large_fdset 99 #endif 100 #endif /* __PRAGMA_REDEFINE_EXTNAME */ 101 #endif /* FD_SETSIZE */ 102 103 #if !defined(_XPG4_2) || defined(__EXTENSIONS__) 104 typedef long fd_mask; 105 #endif 106 typedef long fds_mask; 107 108 /* 109 * The value of _NBBY needs to be consistant with the value 110 * of NBBY in <sys/param.h>. 111 */ 112 #define _NBBY 8 113 #if !defined(_XPG4_2) || defined(__EXTENSIONS__) 114 #ifndef NBBY /* number of bits per byte */ 115 #define NBBY _NBBY 116 #endif 117 #endif /* !defined(_XPG4_2) || defined(__EXTENSIONS__) */ 118 119 #if !defined(_XPG4_2) || defined(__EXTENSIONS__) 120 #define NFDBITS (sizeof (fd_mask) * NBBY) /* bits per mask */ 121 #endif 122 #define FD_NFDBITS (sizeof (fds_mask) * _NBBY) /* bits per mask */ 123 124 #define __howmany(__x, __y) (((__x)+((__y)-1))/(__y)) 125 #if !defined(_XPG4_2) || defined(__EXTENSIONS__) 126 #ifndef howmany 127 #define howmany(x, y) (((x)+((y)-1))/(y)) 128 #endif 129 #endif /* !defined(_XPG4_2) || defined(__EXTENSIONS__) */ 130 131 #if !defined(_XPG4_2) || defined(__EXTENSIONS__) 132 typedef struct fd_set { 133 #else 134 typedef struct __fd_set { 135 #endif 136 long fds_bits[__howmany(FD_SETSIZE, FD_NFDBITS)]; 137 } fd_set; 138 139 #define FD_SET(__n, __p) ((__p)->fds_bits[(__n)/FD_NFDBITS] |= \ 140 (1ul << ((__n) % FD_NFDBITS))) 141 142 #define FD_CLR(__n, __p) ((__p)->fds_bits[(__n)/FD_NFDBITS] &= \ 143 ~(1ul << ((__n) % FD_NFDBITS))) 144 145 #define FD_ISSET(__n, __p) (((__p)->fds_bits[(__n)/FD_NFDBITS] & \ 146 (1ul << ((__n) % FD_NFDBITS))) != 0l) 147 148 #ifdef _KERNEL 149 #define FD_ZERO(p) bzero((p), sizeof (*(p))) 150 #else 151 #define FD_ZERO(__p) (void) memset((__p), 0, sizeof (*(__p))) 152 #endif /* _KERNEL */ 153 154 #ifndef _KERNEL 155 #ifdef __STDC__ 156 extern int select(int, fd_set *_RESTRICT_KYWD, fd_set *_RESTRICT_KYWD, 157 fd_set *_RESTRICT_KYWD, struct timeval *_RESTRICT_KYWD); 158 159 #if !defined(__XOPEN_OR_POSIX) || defined(_XPG6) || defined(__EXTENSIONS__) 160 extern int pselect(int, fd_set *_RESTRICT_KYWD, fd_set *_RESTRICT_KYWD, 161 fd_set *_RESTRICT_KYWD, const struct timespec *_RESTRICT_KYWD, 162 const sigset_t *_RESTRICT_KYWD); 163 #endif 164 165 #else 166 extern int select(); 167 #if !defined(__XOPEN_OR_POSIX) || defined(_XPG6) || defined(__EXTENSIONS__) 168 extern int pselect(); 169 #endif 170 #endif /* __STDC__ */ 171 #endif /* _KERNEL */ 172 173 #ifdef __cplusplus 174 } 175 #endif 176 177 #endif /* _SYS_SELECT_H */ 178