sys_select.in.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. /* Substitute for <sys/select.h>.
  2. Copyright (C) 2007-2022 Free Software Foundation, Inc.
  3. This file is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU Lesser General Public License as
  5. published by the Free Software Foundation; either version 2.1 of the
  6. License, or (at your option) any later version.
  7. This file is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU Lesser General Public License for more details.
  11. You should have received a copy of the GNU Lesser General Public License
  12. along with this program. If not, see <https://www.gnu.org/licenses/>. */
  13. # if __GNUC__ >= 3
  14. @PRAGMA_SYSTEM_HEADER@
  15. # endif
  16. @PRAGMA_COLUMNS@
  17. /* On OSF/1 and Solaris 2.6, <sys/types.h> and <sys/time.h>
  18. both include <sys/select.h>.
  19. On Cygwin and OpenBSD, <sys/time.h> includes <sys/select.h>.
  20. Simply delegate to the system's header in this case. */
  21. #if (@HAVE_SYS_SELECT_H@ \
  22. && !defined _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TYPES_H \
  23. && ((defined __osf__ && defined _SYS_TYPES_H_ \
  24. && defined _OSF_SOURCE) \
  25. || (defined __sun && defined _SYS_TYPES_H \
  26. && (! (defined _XOPEN_SOURCE || defined _POSIX_C_SOURCE) \
  27. || defined __EXTENSIONS__))))
  28. # define _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TYPES_H
  29. # @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@
  30. #elif (@HAVE_SYS_SELECT_H@ \
  31. && (defined _CYGWIN_SYS_TIME_H \
  32. || (!defined _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TIME_H \
  33. && ((defined __osf__ && defined _SYS_TIME_H_ \
  34. && defined _OSF_SOURCE) \
  35. || (defined __OpenBSD__ && defined _SYS_TIME_H_) \
  36. || (defined __sun && defined _SYS_TIME_H \
  37. && (! (defined _XOPEN_SOURCE \
  38. || defined _POSIX_C_SOURCE) \
  39. || defined __EXTENSIONS__))))))
  40. # define _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TIME_H
  41. # @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@
  42. /* On IRIX 6.5, <sys/timespec.h> includes <sys/types.h>, which includes
  43. <sys/bsd_types.h>, which includes <sys/select.h>. At this point we cannot
  44. include <signal.h>, because that includes <internal/signal_core.h>, which
  45. gives a syntax error because <sys/timespec.h> has not been completely
  46. processed. Simply delegate to the system's header in this case. */
  47. #elif @HAVE_SYS_SELECT_H@ && defined __sgi && (defined _SYS_BSD_TYPES_H && !defined _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_BSD_TYPES_H)
  48. # define _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_BSD_TYPES_H
  49. # @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@
  50. /* On OpenBSD 5.0, <pthread.h> includes <sys/types.h>, which includes
  51. <sys/select.h>. At this point we cannot include <signal.h>, because that
  52. includes gnulib's pthread.h override, which gives a syntax error because
  53. /usr/include/pthread.h has not been completely processed. Simply delegate
  54. to the system's header in this case. */
  55. #elif @HAVE_SYS_SELECT_H@ && defined __OpenBSD__ && (defined _PTHREAD_H_ && !defined PTHREAD_MUTEX_INITIALIZER)
  56. # @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@
  57. #else
  58. #ifndef _@GUARD_PREFIX@_SYS_SELECT_H
  59. /* On many platforms, <sys/select.h> assumes prior inclusion of
  60. <sys/types.h>. Also, mingw defines sigset_t there, instead of
  61. in <signal.h> where it belongs. */
  62. #include <sys/types.h>
  63. #if @HAVE_SYS_SELECT_H@
  64. /* On OSF/1 4.0, <sys/select.h> provides only a forward declaration
  65. of 'struct timeval', and no definition of this type.
  66. Also, Mac OS X, AIX, HP-UX, IRIX, Solaris, Interix declare select()
  67. in <sys/time.h>.
  68. But avoid namespace pollution on glibc systems and "unknown type
  69. name" problems on Cygwin. */
  70. # if !(defined __GLIBC__ || defined __CYGWIN__)
  71. # include <sys/time.h>
  72. # endif
  73. /* On AIX 7 and Solaris 10, <sys/select.h> provides an FD_ZERO implementation
  74. that relies on memset(), but without including <string.h>.
  75. But in any case avoid namespace pollution on glibc systems. */
  76. # if (defined __OpenBSD__ || defined _AIX || defined __sun || defined __osf__ || defined __BEOS__) \
  77. && ! defined __GLIBC__
  78. # include <string.h>
  79. # endif
  80. /* The include_next requires a split double-inclusion guard. */
  81. # @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@
  82. #endif
  83. /* Get definition of 'sigset_t'.
  84. But avoid namespace pollution on glibc systems and "unknown type
  85. name" problems on Cygwin.
  86. On OS/2 kLIBC, sigset_t is defined in <sys/select.h>, too. In addition,
  87. if <sys/param.h> is included, <types.h> -> <sys/types.h> -> <sys/select.h>
  88. are included. Then <signal.h> -> <pthread.h> are included by GNULIB. By the
  89. way, <pthread.h> requires PAGE_SIZE defined in <sys/param.h>. However,
  90. <sys/param.h> has not been processed, yet. As a result, 'PAGE_SIZE'
  91. undeclared error occurs in <pthread.h>.
  92. Do this after the include_next (for the sake of OpenBSD 5.0) but before
  93. the split double-inclusion guard (for the sake of Solaris). */
  94. #if !((defined __GLIBC__ || defined __CYGWIN__ || defined __KLIBC__) \
  95. && !defined __UCLIBC__)
  96. # include <signal.h>
  97. #endif
  98. #ifndef _@GUARD_PREFIX@_SYS_SELECT_H
  99. #define _@GUARD_PREFIX@_SYS_SELECT_H
  100. #if !@HAVE_SYS_SELECT_H@
  101. /* A platform that lacks <sys/select.h>. */
  102. /* Get the 'struct timeval' and 'fd_set' types and the FD_* macros
  103. on most platforms. */
  104. # include <sys/time.h>
  105. /* On HP-UX 11, <sys/time.h> provides an FD_ZERO implementation
  106. that relies on memset(), but without including <string.h>. */
  107. # if defined __hpux
  108. # include <string.h>
  109. # endif
  110. /* On native Windows platforms:
  111. Get the 'fd_set' type.
  112. Get the close() declaration before we override it. */
  113. # if @HAVE_WINSOCK2_H@
  114. # if !defined _GL_INCLUDING_WINSOCK2_H
  115. # define _GL_INCLUDING_WINSOCK2_H
  116. # include <winsock2.h>
  117. # undef _GL_INCLUDING_WINSOCK2_H
  118. # endif
  119. # include <io.h>
  120. # endif
  121. #endif
  122. /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
  123. /* The definition of _GL_WARN_ON_USE is copied here. */
  124. /* Fix some definitions from <winsock2.h>. */
  125. #if @HAVE_WINSOCK2_H@
  126. # if !GNULIB_defined_rpl_fd_isset
  127. /* Re-define FD_ISSET to avoid a WSA call while we are not using
  128. network sockets. */
  129. static int
  130. rpl_fd_isset (SOCKET fd, fd_set * set)
  131. {
  132. u_int i;
  133. if (set == NULL)
  134. return 0;
  135. for (i = 0; i < set->fd_count; i++)
  136. if (set->fd_array[i] == fd)
  137. return 1;
  138. return 0;
  139. }
  140. # define GNULIB_defined_rpl_fd_isset 1
  141. # endif
  142. # undef FD_ISSET
  143. # define FD_ISSET(fd, set) rpl_fd_isset(fd, set)
  144. #endif
  145. /* Hide some function declarations from <winsock2.h>. */
  146. #if @HAVE_WINSOCK2_H@
  147. # if !defined _@GUARD_PREFIX@_UNISTD_H
  148. # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
  149. # undef close
  150. # define close close_used_without_including_unistd_h
  151. # elif !defined __clang__
  152. _GL_WARN_ON_USE (close,
  153. "close() used without including <unistd.h>");
  154. # endif
  155. # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
  156. # undef gethostname
  157. # define gethostname gethostname_used_without_including_unistd_h
  158. # elif !defined __clang__
  159. _GL_WARN_ON_USE (gethostname,
  160. "gethostname() used without including <unistd.h>");
  161. # endif
  162. # endif
  163. # if !defined _@GUARD_PREFIX@_SYS_SOCKET_H
  164. # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
  165. # undef socket
  166. # define socket socket_used_without_including_sys_socket_h
  167. # undef connect
  168. # define connect connect_used_without_including_sys_socket_h
  169. # undef accept
  170. # define accept accept_used_without_including_sys_socket_h
  171. # undef bind
  172. # define bind bind_used_without_including_sys_socket_h
  173. # undef getpeername
  174. # define getpeername getpeername_used_without_including_sys_socket_h
  175. # undef getsockname
  176. # define getsockname getsockname_used_without_including_sys_socket_h
  177. # undef getsockopt
  178. # define getsockopt getsockopt_used_without_including_sys_socket_h
  179. # undef listen
  180. # define listen listen_used_without_including_sys_socket_h
  181. # undef recv
  182. # define recv recv_used_without_including_sys_socket_h
  183. # undef send
  184. # define send send_used_without_including_sys_socket_h
  185. # undef recvfrom
  186. # define recvfrom recvfrom_used_without_including_sys_socket_h
  187. # undef sendto
  188. # define sendto sendto_used_without_including_sys_socket_h
  189. # undef setsockopt
  190. # define setsockopt setsockopt_used_without_including_sys_socket_h
  191. # undef shutdown
  192. # define shutdown shutdown_used_without_including_sys_socket_h
  193. # elif !defined __clang__
  194. _GL_WARN_ON_USE (socket,
  195. "socket() used without including <sys/socket.h>");
  196. _GL_WARN_ON_USE (connect,
  197. "connect() used without including <sys/socket.h>");
  198. _GL_WARN_ON_USE (accept,
  199. "accept() used without including <sys/socket.h>");
  200. _GL_WARN_ON_USE (bind,
  201. "bind() used without including <sys/socket.h>");
  202. _GL_WARN_ON_USE (getpeername,
  203. "getpeername() used without including <sys/socket.h>");
  204. _GL_WARN_ON_USE (getsockname,
  205. "getsockname() used without including <sys/socket.h>");
  206. _GL_WARN_ON_USE (getsockopt,
  207. "getsockopt() used without including <sys/socket.h>");
  208. _GL_WARN_ON_USE (listen,
  209. "listen() used without including <sys/socket.h>");
  210. _GL_WARN_ON_USE (recv,
  211. "recv() used without including <sys/socket.h>");
  212. _GL_WARN_ON_USE (send,
  213. "send() used without including <sys/socket.h>");
  214. _GL_WARN_ON_USE (recvfrom,
  215. "recvfrom() used without including <sys/socket.h>");
  216. _GL_WARN_ON_USE (sendto,
  217. "sendto() used without including <sys/socket.h>");
  218. _GL_WARN_ON_USE (setsockopt,
  219. "setsockopt() used without including <sys/socket.h>");
  220. _GL_WARN_ON_USE (shutdown,
  221. "shutdown() used without including <sys/socket.h>");
  222. # endif
  223. # endif
  224. #endif
  225. #if @GNULIB_PSELECT@
  226. # if @REPLACE_PSELECT@
  227. # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
  228. # undef pselect
  229. # define pselect rpl_pselect
  230. # endif
  231. _GL_FUNCDECL_RPL (pselect, int,
  232. (int, fd_set *restrict, fd_set *restrict, fd_set *restrict,
  233. struct timespec const *restrict, const sigset_t *restrict));
  234. _GL_CXXALIAS_RPL (pselect, int,
  235. (int, fd_set *restrict, fd_set *restrict, fd_set *restrict,
  236. struct timespec const *restrict, const sigset_t *restrict));
  237. # else
  238. # if !@HAVE_PSELECT@
  239. _GL_FUNCDECL_SYS (pselect, int,
  240. (int, fd_set *restrict, fd_set *restrict, fd_set *restrict,
  241. struct timespec const *restrict, const sigset_t *restrict));
  242. # endif
  243. /* Need to cast, because on AIX 7, the second, third, fourth argument may be
  244. void *restrict, void *restrict, void *restrict. */
  245. _GL_CXXALIAS_SYS_CAST (pselect, int,
  246. (int,
  247. fd_set *restrict, fd_set *restrict, fd_set *restrict,
  248. struct timespec const *restrict,
  249. const sigset_t *restrict));
  250. # endif
  251. _GL_CXXALIASWARN (pselect);
  252. #elif defined GNULIB_POSIXCHECK
  253. # undef pselect
  254. # if HAVE_RAW_DECL_PSELECT
  255. _GL_WARN_ON_USE (pselect, "pselect is not portable - "
  256. "use gnulib module pselect for portability");
  257. # endif
  258. #endif
  259. #if @GNULIB_SELECT@
  260. # if @REPLACE_SELECT@
  261. # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
  262. # undef select
  263. # define select rpl_select
  264. # endif
  265. _GL_FUNCDECL_RPL (select, int,
  266. (int, fd_set *restrict, fd_set *restrict, fd_set *restrict,
  267. struct timeval *restrict));
  268. _GL_CXXALIAS_RPL (select, int,
  269. (int, fd_set *restrict, fd_set *restrict, fd_set *restrict,
  270. timeval *restrict));
  271. # else
  272. _GL_CXXALIAS_SYS (select, int,
  273. (int, fd_set *restrict, fd_set *restrict, fd_set *restrict,
  274. timeval *restrict));
  275. # endif
  276. _GL_CXXALIASWARN (select);
  277. #elif @HAVE_WINSOCK2_H@
  278. # undef select
  279. # define select select_used_without_requesting_gnulib_module_select
  280. #elif defined GNULIB_POSIXCHECK
  281. # undef select
  282. # if HAVE_RAW_DECL_SELECT
  283. _GL_WARN_ON_USE (select, "select is not always POSIX compliant - "
  284. "use gnulib module select for portability");
  285. # endif
  286. #endif
  287. #endif /* _@GUARD_PREFIX@_SYS_SELECT_H */
  288. #endif /* _@GUARD_PREFIX@_SYS_SELECT_H */
  289. #endif /* OSF/1 */