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 2014 Garrett D'Amore <garrett@damore.org> 24 * 25 * Copyright 2013 Nexenta Systems, Inc. All rights reserved. 26 * 27 * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 28 * Use is subject to license terms. 29 */ 30 31 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 32 /* All Rights Reserved */ 33 34 /* 35 * University Copyright- Copyright (c) 1982, 1986, 1988 36 * The Regents of the University of California 37 * All Rights Reserved 38 * 39 * University Acknowledgment- Portions of this document are derived from 40 * software developed by the University of California, Berkeley, and its 41 * contributors. 42 */ 43 44 #ifndef _SYS_SELECT_H 45 #define _SYS_SELECT_H 46 47 #include <sys/feature_tests.h> 48 49 #if !defined(_KERNEL) && !defined(_FAKE_KERNEL) 50 #if !defined(__XOPEN_OR_POSIX) || defined(_XPG6) || defined(__EXTENSIONS__) 51 #include <sys/time_impl.h> 52 #endif 53 #include <sys/time.h> 54 #endif /* !_KERNEL */ 55 56 #ifdef __cplusplus 57 extern "C" { 58 #endif 59 60 61 #if !defined(__XOPEN_OR_POSIX) || defined(_XPG6) || defined(__EXTENSIONS__) 62 /* 63 * The sigset_t type is defined in <sys/signal.h> and duplicated 64 * in <sys/ucontext.h> as a result of XPG4v2 requirements. XPG6 65 * now allows the visibility of signal.h in this header, however 66 * an order of inclusion problem occurs as a result of inclusion 67 * of <sys/select.h> in <signal.h> under certain conditions. 68 * Rather than include <sys/signal.h> here, we've duplicated 69 * the sigset_t type instead. This type is required for the XPG6 70 * introduced pselect() function also declared in this header. 71 */ 72 #ifndef _SIGSET_T 73 #define _SIGSET_T 74 typedef struct { /* signal set type */ 75 unsigned int __sigbits[4]; 76 } sigset_t; 77 #endif /* _SIGSET_T */ 78 79 #endif /* #if !defined(__XOPEN_OR_POSIX) || defined(_XPG6) ... */ 80 81 /* 82 * Select uses bit masks of file descriptors in longs. 83 * These macros manipulate such bit fields. 84 * FD_SETSIZE may be defined by the user, but the default here 85 * should be >= NOFILE (param.h). 86 */ 87 #ifndef FD_SETSIZE 88 #ifdef _LP64 89 #define FD_SETSIZE 65536 90 #else 91 #define FD_SETSIZE 1024 92 #endif /* _LP64 */ 93 #elif FD_SETSIZE > 1024 && !defined(_LP64) 94 #ifdef __PRAGMA_REDEFINE_EXTNAME 95 #pragma redefine_extname select select_large_fdset 96 #if !defined(__XOPEN_OR_POSIX) || defined(_XPG6) || defined(__EXTENSIONS__) 97 #pragma redefine_extname pselect pselect_large_fdset 98 #endif 99 #else /* __PRAGMA_REDEFINE_EXTNAME */ 100 #define select select_large_fdset 101 #if !defined(__XOPEN_OR_POSIX) || defined(_XPG6) || defined(__EXTENSIONS__) 102 #define pselect pselect_large_fdset 103 #endif 104 #endif /* __PRAGMA_REDEFINE_EXTNAME */ 105 #endif /* FD_SETSIZE */ 106 107 #if !defined(_XPG4_2) || defined(__EXTENSIONS__) 108 typedef long fd_mask; 109 #endif 110 typedef long fds_mask; 111 112 /* 113 * The value of _NBBY needs to be consistant with the value 114 * of NBBY in <sys/param.h>. 115 */ 116 #define _NBBY 8 117 #if !defined(_XPG4_2) || defined(__EXTENSIONS__) 118 #ifndef NBBY /* number of bits per byte */ 119 #define NBBY _NBBY 120 #endif 121 #endif /* !defined(_XPG4_2) || defined(__EXTENSIONS__) */ 122 123 #if !defined(_XPG4_2) || defined(__EXTENSIONS__) 124 #define NFDBITS (sizeof (fd_mask) * NBBY) /* bits per mask */ 125 #endif 126 #define FD_NFDBITS (sizeof (fds_mask) * _NBBY) /* bits per mask */ 127 128 #define __howmany(__x, __y) (((__x)+((__y)-1))/(__y)) 129 #if !defined(_XPG4_2) || defined(__EXTENSIONS__) 130 #ifndef howmany 131 #define howmany(x, y) (((x)+((y)-1))/(y)) 132 #endif 133 #endif /* !defined(_XPG4_2) || defined(__EXTENSIONS__) */ 134 135 #if !defined(_XPG4_2) || defined(__EXTENSIONS__) 136 typedef struct fd_set { 137 #else 138 typedef struct __fd_set { 139 #endif 140 long fds_bits[__howmany(FD_SETSIZE, FD_NFDBITS)]; 141 } fd_set; 142 143 #define FD_SET(__n, __p) ((__p)->fds_bits[(__n)/FD_NFDBITS] |= \ 144 (1ul << ((__n) % FD_NFDBITS))) 145 146 #define FD_CLR(__n, __p) ((__p)->fds_bits[(__n)/FD_NFDBITS] &= \ 147 ~(1ul << ((__n) % FD_NFDBITS))) 148 149 #define FD_ISSET(__n, __p) (((__p)->fds_bits[(__n)/FD_NFDBITS] & \ 150 (1ul << ((__n) % FD_NFDBITS))) != 0l) 151 152 #if defined(_KERNEL) || defined(_FAKE_KERNEL) 153 #define FD_ZERO(p) bzero((p), sizeof (*(p))) 154 #else 155 #define FD_ZERO(__p) (void) memset((__p), 0, sizeof (*(__p))) 156 #endif /* _KERNEL */ 157 158 #if !defined(_KERNEL) && !defined(_FAKE_KERNEL) 159 extern int select(int, fd_set *_RESTRICT_KYWD, fd_set *_RESTRICT_KYWD, 160 fd_set *_RESTRICT_KYWD, struct timeval *_RESTRICT_KYWD); 161 162 #if !defined(__XOPEN_OR_POSIX) || defined(_XPG6) || defined(__EXTENSIONS__) 163 extern int pselect(int, fd_set *_RESTRICT_KYWD, fd_set *_RESTRICT_KYWD, 164 fd_set *_RESTRICT_KYWD, const struct timespec *_RESTRICT_KYWD, 165 const sigset_t *_RESTRICT_KYWD); 166 #endif 167 168 #endif /* _KERNEL */ 169 170 #ifdef __cplusplus 171 } 172 #endif 173 174 #endif /* _SYS_SELECT_H */