1/*	$NetBSD: fd_set.h,v 1.4 2010/07/08 13:58:52 rmind Exp $	*/
2
3/*-
4 * Copyright (c) 1992, 1993
5 *	The Regents of the University of California.  All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the University nor the names of its contributors
16 *    may be used to endorse or promote products derived from this software
17 *    without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 *
31 *	from: @(#)types.h	8.4 (Berkeley) 1/21/94
32 */
33
34#ifndef _SYS_FD_SET_H_
35#define	_SYS_FD_SET_H_
36
37#include <sys/cdefs.h>
38#include <sys/featuretest.h>
39#include <machine/int_types.h>
40
41/*
42 * Implementation dependent defines, hidden from user space.
43 * POSIX does not specify them.
44 */
45
46typedef	__uint32_t	__fd_mask;
47
48/* 32 = 2 ^ 5 */
49#define	__NFDBITS	(32)
50#define	__NFDSHIFT	(5)
51#define	__NFDMASK	(__NFDBITS - 1)
52
53/*
54 * Select uses bit fields of file descriptors.  These macros manipulate
55 * such bit fields.  Note: FD_SETSIZE may be defined by the user.
56 */
57
58#ifndef	FD_SETSIZE
59#define	FD_SETSIZE	256
60#endif
61
62#define	__NFD_SIZE	(((FD_SETSIZE) + (__NFDBITS - 1)) / __NFDBITS)
63
64typedef	struct fd_set {
65	__fd_mask	fds_bits[__NFD_SIZE];
66} fd_set;
67
68#define	FD_SET(n, p)	\
69    ((p)->fds_bits[(unsigned)(n) >> __NFDSHIFT] |= (1 << ((n) & __NFDMASK)))
70#define	FD_CLR(n, p)	\
71    ((p)->fds_bits[(unsigned)(n) >> __NFDSHIFT] &= ~(1 << ((n) & __NFDMASK)))
72#define	FD_ISSET(n, p)	\
73    ((p)->fds_bits[(unsigned)(n) >> __NFDSHIFT] & (1 << ((n) & __NFDMASK)))
74#if __GNUC_PREREQ__(2, 95)
75#define	FD_ZERO(p)	(void)__builtin_memset((p), 0, sizeof(*(p)))
76#else
77#define	FD_ZERO(p)	do {						\
78	fd_set *__fds = (p);						\
79	unsigned int __i;						\
80	for (__i = 0; __i < __NFD_SIZE; __i++)				\
81		__fds->fds_bits[__i] = 0;				\
82	} while (/* CONSTCOND */ 0)
83#endif /* GCC 2.95 */
84
85/*
86 * Expose our internals if we are not required to hide them.
87 */
88#if defined(_NETBSD_SOURCE)
89
90#define	fd_mask		__fd_mask
91#define	NFDBITS		__NFDBITS
92
93#if __GNUC_PREREQ__(2, 95)
94#define	FD_COPY(f, t)	(void)__builtin_memcpy((t), (f), sizeof(*(f)))
95#else
96#define	FD_COPY(f, t)	do {						\
97	fd_set *__f = (f), *__t = (t);					\
98	unsigned int __i;						\
99	for (__i = 0; __i < __NFD_SIZE; __i++)				\
100		__t->fds_bits[__i] = __f->fds_bits[__i];		\
101	} while (/* CONSTCOND */ 0)
102#endif /* GCC 2.95 */
103
104#endif /* _NETBSD_SOURCE */
105
106#endif /* _SYS_FD_SET_H_ */
107