master
  1/*	$NetBSD: fd_set.h,v 1.7 2018/06/24 12:05:40 kamil 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_LEN(a)	(((a) + (__NFDBITS - 1)) / __NFDBITS)
 63#define	__NFD_SIZE	__NFD_LEN(FD_SETSIZE)
 64#define	__NFD_BYTES(a)	(__NFD_LEN(a) * sizeof(__fd_mask))
 65
 66typedef	struct fd_set {
 67	__fd_mask	fds_bits[__NFD_SIZE];
 68} fd_set;
 69
 70#define	FD_SET(n, p)	\
 71    ((p)->fds_bits[(unsigned)(n) >> __NFDSHIFT] |= (1U << ((n) & __NFDMASK)))
 72#define	FD_CLR(n, p)	\
 73    ((p)->fds_bits[(unsigned)(n) >> __NFDSHIFT] &= ~(1U << ((n) & __NFDMASK)))
 74#define	FD_ISSET(n, p)	\
 75    ((p)->fds_bits[(unsigned)(n) >> __NFDSHIFT] & (1U << ((n) & __NFDMASK)))
 76#if __GNUC_PREREQ__(2, 95)
 77#define	FD_ZERO(p)	(void)__builtin_memset((p), 0, sizeof(*(p)))
 78#else
 79#define	FD_ZERO(p)	do {						\
 80	fd_set *__fds = (p);						\
 81	unsigned int __i;						\
 82	for (__i = 0; __i < __NFD_SIZE; __i++)				\
 83		__fds->fds_bits[__i] = 0;				\
 84	} while (/* CONSTCOND */ 0)
 85#endif /* GCC 2.95 */
 86
 87/*
 88 * Expose our internals if we are not required to hide them.
 89 */
 90#if defined(_NETBSD_SOURCE)
 91
 92#define	fd_mask		__fd_mask
 93#define	NFDBITS		__NFDBITS
 94
 95#if __GNUC_PREREQ__(2, 95)
 96#define	FD_COPY(f, t)	(void)__builtin_memcpy((t), (f), sizeof(*(f)))
 97#else
 98#define	FD_COPY(f, t)	do {						\
 99	fd_set *__f = (f), *__t = (t);					\
100	unsigned int __i;						\
101	for (__i = 0; __i < __NFD_SIZE; __i++)				\
102		__t->fds_bits[__i] = __f->fds_bits[__i];		\
103	} while (/* CONSTCOND */ 0)
104#endif /* GCC 2.95 */
105
106#endif /* _NETBSD_SOURCE */
107
108#endif /* _SYS_FD_SET_H_ */