1/**
2 * This file has no copyright assigned and is placed in the Public Domain.
3 * This file is part of the mingw-w64 runtime package.
4 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
5 */
6
7#ifndef ___WSA_FD_TYPES_H
8#define ___WSA_FD_TYPES_H
9
10#include <psdk_inc/_socket_types.h>
11
12#ifndef FD_SETSIZE
13#define FD_SETSIZE	64
14#endif
15
16#ifndef _SYS_TYPES_FD_SET
17/* fd_set may have been defined by the newlib <sys/types.h>
18 * if  __USE_W32_SOCKETS not defined.
19 */
20
21typedef struct fd_set
22{
23	u_int	fd_count;
24	SOCKET	fd_array[FD_SETSIZE];
25} fd_set;
26
27#ifdef __cplusplus
28extern "C" {
29#endif
30
31int WINAPI __WSAFDIsSet(SOCKET,fd_set *);
32
33#ifdef __cplusplus
34}
35#endif
36
37#ifndef FD_CLR
38#define FD_CLR(fd,set)							\
39  do {									\
40	u_int __i;							\
41	for(__i = 0; __i < ((fd_set *)(set))->fd_count; __i++) {	\
42		if (((fd_set *)(set))->fd_array[__i] == fd) {		\
43			while (__i < ((fd_set *)(set))->fd_count - 1) {	\
44				((fd_set *)(set))->fd_array[__i] =	\
45				 ((fd_set *)(set))->fd_array[__i + 1];	\
46				__i++;					\
47			}						\
48			((fd_set *)(set))->fd_count--;			\
49			break;						\
50		}							\
51	}								\
52  } while(0)
53#endif /* !FD_CLR */
54
55#ifndef FD_ZERO
56#define FD_ZERO(set)		(((fd_set *)(set))->fd_count = 0)
57#endif /* !FD_ZERO */
58
59#ifndef FD_ISSET
60#define FD_ISSET(fd,set)	__WSAFDIsSet((SOCKET)(fd),(fd_set *)(set))
61#endif /* !FD_ISSET */
62
63/* FD_SET is differently implement in winsock.h and winsock2.h.  If we
64   encounter that we are going to redefine it, and if the original definition
65   is from winsock.h, make sure to undef FD_SET so it can be redefined to
66   the winsock2.h version. */
67#ifdef _FD_SET_WINSOCK_DEFINED
68#undef _FD_SET_WINSOCK_DEFINED
69#undef FD_SET
70#endif
71#ifndef FD_SET
72#ifdef _WINSOCK2API_
73#define FD_SET(fd,set)							\
74  do {									\
75	u_int __i;							\
76	for(__i = 0; __i < ((fd_set *)(set))->fd_count; __i++) {	\
77		if (((fd_set *)(set))->fd_array[__i] == (fd)) {		\
78			break;						\
79		}							\
80	}								\
81	if (__i == ((fd_set *)(set))->fd_count) {			\
82		if (((fd_set *)(set))->fd_count < FD_SETSIZE) {		\
83			((fd_set *)(set))->fd_array[__i] = (fd);	\
84			((fd_set *)(set))->fd_count++;			\
85		}							\
86	}								\
87  } while(0)
88#else
89#define _FD_SET_WINSOCK_DEFINED
90#define FD_SET(fd,set)							\
91  do {									\
92	if (((fd_set *)(set))->fd_count < FD_SETSIZE)			\
93	    ((fd_set *)(set))->fd_array[((fd_set *)(set))->fd_count++] =\
94								   (fd);\
95  } while(0)
96#endif /* _WINSOCK2API_ */
97#endif /* !FD_SET */
98
99#elif !defined(USE_SYS_TYPES_FD_SET)
100#warning "fd_set and associated macros have been defined in sys/types.  \
101    This can cause runtime problems with W32 sockets"
102#endif /* !_SYS_TYPES_FD_SET */
103
104typedef struct fd_set	FD_SET;
105typedef struct fd_set	*PFD_SET;
106typedef struct fd_set	*LPFD_SET;
107
108#endif /* ___WSA_FD_TYPES_H */
109
110