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 */