sys_select.in.h 12 KB

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