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