xref: /f-stack/freebsd/sys/select.h (revision 22ce4aff)
1a9643ea8Slogwang /*-
2*22ce4affSfengbojiang  * SPDX-License-Identifier: BSD-3-Clause
3*22ce4affSfengbojiang  *
4a9643ea8Slogwang  * Copyright (c) 1992, 1993
5a9643ea8Slogwang  *	The Regents of the University of California.  All rights reserved.
6a9643ea8Slogwang  *
7a9643ea8Slogwang  * Redistribution and use in source and binary forms, with or without
8a9643ea8Slogwang  * modification, are permitted provided that the following conditions
9a9643ea8Slogwang  * are met:
10a9643ea8Slogwang  * 1. Redistributions of source code must retain the above copyright
11a9643ea8Slogwang  *    notice, this list of conditions and the following disclaimer.
12a9643ea8Slogwang  * 2. Redistributions in binary form must reproduce the above copyright
13a9643ea8Slogwang  *    notice, this list of conditions and the following disclaimer in the
14a9643ea8Slogwang  *    documentation and/or other materials provided with the distribution.
15*22ce4affSfengbojiang  * 3. Neither the name of the University nor the names of its contributors
16a9643ea8Slogwang  *    may be used to endorse or promote products derived from this software
17a9643ea8Slogwang  *    without specific prior written permission.
18a9643ea8Slogwang  *
19a9643ea8Slogwang  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20a9643ea8Slogwang  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21a9643ea8Slogwang  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22a9643ea8Slogwang  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23a9643ea8Slogwang  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24a9643ea8Slogwang  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25a9643ea8Slogwang  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26a9643ea8Slogwang  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27a9643ea8Slogwang  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28a9643ea8Slogwang  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29a9643ea8Slogwang  * SUCH DAMAGE.
30a9643ea8Slogwang  *
31a9643ea8Slogwang  * $FreeBSD$
32a9643ea8Slogwang  */
33a9643ea8Slogwang 
34a9643ea8Slogwang #ifndef _SYS_SELECT_H_
35a9643ea8Slogwang #define	_SYS_SELECT_H_
36a9643ea8Slogwang 
37a9643ea8Slogwang #include <sys/cdefs.h>
38a9643ea8Slogwang #include <sys/_types.h>
39a9643ea8Slogwang 
40a9643ea8Slogwang #include <sys/_sigset.h>
41a9643ea8Slogwang #include <sys/_timeval.h>
42a9643ea8Slogwang #include <sys/timespec.h>
43a9643ea8Slogwang 
44a9643ea8Slogwang typedef	unsigned long	__fd_mask;
45a9643ea8Slogwang #if __BSD_VISIBLE
46a9643ea8Slogwang typedef	__fd_mask	fd_mask;
47a9643ea8Slogwang #endif
48a9643ea8Slogwang 
49a9643ea8Slogwang #ifndef _SIGSET_T_DECLARED
50a9643ea8Slogwang #define	_SIGSET_T_DECLARED
51a9643ea8Slogwang typedef	__sigset_t	sigset_t;
52a9643ea8Slogwang #endif
53a9643ea8Slogwang 
54a9643ea8Slogwang /*
55a9643ea8Slogwang  * Select uses bit masks of file descriptors in longs.  These macros
56a9643ea8Slogwang  * manipulate such bit fields (the filesystem macros use chars).
57a9643ea8Slogwang  * FD_SETSIZE may be defined by the user, but the default here should
58a9643ea8Slogwang  * be enough for most uses.
59a9643ea8Slogwang  */
60a9643ea8Slogwang #ifndef	FD_SETSIZE
61a9643ea8Slogwang #define	FD_SETSIZE	1024
62a9643ea8Slogwang #endif
63a9643ea8Slogwang 
64a9643ea8Slogwang #define	_NFDBITS	(sizeof(__fd_mask) * 8)	/* bits per mask */
65a9643ea8Slogwang #if __BSD_VISIBLE
66a9643ea8Slogwang #define	NFDBITS		_NFDBITS
67a9643ea8Slogwang #endif
68a9643ea8Slogwang 
69a9643ea8Slogwang #ifndef _howmany
70a9643ea8Slogwang #define	_howmany(x, y)	(((x) + ((y) - 1)) / (y))
71a9643ea8Slogwang #endif
72a9643ea8Slogwang 
73a9643ea8Slogwang typedef	struct fd_set {
74a9643ea8Slogwang 	__fd_mask	__fds_bits[_howmany(FD_SETSIZE, _NFDBITS)];
75a9643ea8Slogwang } fd_set;
76a9643ea8Slogwang #if __BSD_VISIBLE
77a9643ea8Slogwang #define	fds_bits	__fds_bits
78a9643ea8Slogwang #endif
79a9643ea8Slogwang 
80a9643ea8Slogwang #define	__fdset_mask(n)	((__fd_mask)1 << ((n) % _NFDBITS))
81a9643ea8Slogwang #define	FD_CLR(n, p)	((p)->__fds_bits[(n)/_NFDBITS] &= ~__fdset_mask(n))
82a9643ea8Slogwang #if __BSD_VISIBLE
83a9643ea8Slogwang #define	FD_COPY(f, t)	(void)(*(t) = *(f))
84a9643ea8Slogwang #endif
85a9643ea8Slogwang #define	FD_ISSET(n, p)	(((p)->__fds_bits[(n)/_NFDBITS] & __fdset_mask(n)) != 0)
86a9643ea8Slogwang #define	FD_SET(n, p)	((p)->__fds_bits[(n)/_NFDBITS] |= __fdset_mask(n))
87a9643ea8Slogwang #define	FD_ZERO(p) do {					\
88a9643ea8Slogwang 	fd_set *_p;					\
89a9643ea8Slogwang 	__size_t _n;					\
90a9643ea8Slogwang 							\
91a9643ea8Slogwang 	_p = (p);					\
92a9643ea8Slogwang 	_n = _howmany(FD_SETSIZE, _NFDBITS);		\
93a9643ea8Slogwang 	while (_n > 0)					\
94a9643ea8Slogwang 		_p->__fds_bits[--_n] = 0;		\
95a9643ea8Slogwang } while (0)
96a9643ea8Slogwang 
97a9643ea8Slogwang #ifndef _KERNEL
98a9643ea8Slogwang 
99a9643ea8Slogwang __BEGIN_DECLS
100a9643ea8Slogwang int pselect(int, fd_set *__restrict, fd_set *__restrict, fd_set *__restrict,
101a9643ea8Slogwang 	const struct timespec *__restrict, const sigset_t *__restrict);
102a9643ea8Slogwang #ifndef _SELECT_DECLARED
103a9643ea8Slogwang #define	_SELECT_DECLARED
104a9643ea8Slogwang /* XXX missing restrict type-qualifier */
105a9643ea8Slogwang int	select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
106a9643ea8Slogwang #endif
107a9643ea8Slogwang __END_DECLS
108a9643ea8Slogwang #endif /* !_KERNEL */
109a9643ea8Slogwang 
110a9643ea8Slogwang #endif /* _SYS_SELECT_H_ */
111