1 /*
2  * Copyright (c) 2006-2022, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2021-07-21     Meco Man     The first version
9  * 2021-12-25     Meco Man     Handle newlib 2.2.0 or lower version
10  */
11 
12 #ifndef __SYS_SELECT_H__
13 #define __SYS_SELECT_H__
14 
15 #include <rtconfig.h>
16 #include <sys/types.h>
17 #include <sys/time.h>
18 #include <string.h>
19 
20 #ifdef __cplusplus
21 extern "C" {
22 #endif
23 
24 #ifndef  FD_SETSIZE
25 #define  FD_SETSIZE  32
26 #endif
27 
28 #ifdef SAL_USING_POSIX
29 #ifdef FD_SETSIZE
30 #undef FD_SETSIZE
31 #endif
32 #define FD_SETSIZE      DFS_FD_MAX
33 #endif /* SAL_USING_POSIX */
34 
35 typedef long    fd_mask;
36 
37 #ifndef _SYS_TYPES_FD_SET /* Newlib 2.2.0 or lower version */
38 #define   NBBY    8       /* number of bits in a byte */
39 #define   NFDBITS (sizeof (fd_mask) * NBBY)   /* bits per mask */
40 #ifndef   howmany
41 #define   howmany(x,y)    (((x)+((y)-1))/(y))
42 #endif /* howmany */
43 
44 typedef struct _types_fd_set {
45     fd_mask fds_bits[howmany(FD_SETSIZE, NFDBITS)];
46 } _types_fd_set;
47 #define fd_set _types_fd_set
48 
49 #define FD_SET(n, p)    ((p)->fds_bits[(n)/NFDBITS] |= (1L << ((n) % NFDBITS)))
50 #define FD_CLR(n, p)    ((p)->fds_bits[(n)/NFDBITS] &= ~(1L << ((n) % NFDBITS)))
51 #define FD_ISSET(n, p)  ((p)->fds_bits[(n)/NFDBITS] & (1L << ((n) % NFDBITS)))
52 #define FD_ZERO(p)      memset((void*)(p), 0, sizeof(*(p)))
53 #endif /* _SYS_TYPES_FD_SET */
54 
55 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
56 
57 #ifdef __cplusplus
58 }
59 #endif
60 
61 #endif /* __SYS_SELECT_H__ */
62