1 /* Provide a sys/socket header file for systems lacking it (read: MinGW)
2    and for systems where it is incomplete.
3    Copyright (C) 2005-2017 Free Software Foundation, Inc.
4    Written by Simon Josefsson.
5 
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3, or (at your option)
9    any later version.
10 
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15 
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, see <http://www.gnu.org/licenses/>.  */
18 
19 /* This file is supposed to be used on platforms that lack <sys/socket.h>,
20    on platforms where <sys/socket.h> cannot be included standalone, and on
21    platforms where <sys/socket.h> does not provide all necessary definitions.
22    It is intended to provide definitions and prototypes needed by an
23    application.  */
24 
25 #if __GNUC__ >= 3
26 @PRAGMA_SYSTEM_HEADER@
27 #endif
28 @PRAGMA_COLUMNS@
29 
30 #if defined _GL_ALREADY_INCLUDING_SYS_SOCKET_H
31 /* Special invocation convention:
32    - On Cygwin 1.5.x we have a sequence of nested includes
33      <sys/socket.h> -> <cygwin/socket.h> -> <asm/socket.h> -> <cygwin/if.h>,
34      and the latter includes <sys/socket.h>.  In this situation, the functions
35      are not yet declared, therefore we cannot provide the C++ aliases.  */
36 
37 #@INCLUDE_NEXT@ @NEXT_SYS_SOCKET_H@
38 
39 #else
40 /* Normal invocation convention.  */
41 
42 #ifndef _@GUARD_PREFIX@_SYS_SOCKET_H
43 
44 #if @HAVE_SYS_SOCKET_H@
45 
46 # define _GL_ALREADY_INCLUDING_SYS_SOCKET_H
47 
48 /* On many platforms, <sys/socket.h> assumes prior inclusion of
49    <sys/types.h>.  */
50 # include <sys/types.h>
51 
52 /* On FreeBSD 6.4, <sys/socket.h> defines some macros that assume that NULL
53    is defined.  */
54 # include <stddef.h>
55 
56 /* The include_next requires a split double-inclusion guard.  */
57 # @INCLUDE_NEXT@ @NEXT_SYS_SOCKET_H@
58 
59 # undef _GL_ALREADY_INCLUDING_SYS_SOCKET_H
60 
61 #endif
62 
63 #ifndef _@GUARD_PREFIX@_SYS_SOCKET_H
64 #define _@GUARD_PREFIX@_SYS_SOCKET_H
65 
66 #ifndef _GL_INLINE_HEADER_BEGIN
67  #error "Please include config.h first."
68 #endif
69 _GL_INLINE_HEADER_BEGIN
70 #ifndef _GL_SYS_SOCKET_INLINE
71 # define _GL_SYS_SOCKET_INLINE _GL_INLINE
72 #endif
73 
74 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
75 
76 /* The definition of _GL_ARG_NONNULL is copied here.  */
77 
78 /* The definition of _GL_WARN_ON_USE is copied here.  */
79 
80 #if !@HAVE_SA_FAMILY_T@
81 # if !GNULIB_defined_sa_family_t
82 /* On OS/2 kLIBC, sa_family_t is unsigned char unless TCPV40HDRS is defined. */
83 #  if !defined __KLIBC__ || defined TCPV40HDRS
84 typedef unsigned short  sa_family_t;
85 #  else
86 typedef unsigned char   sa_family_t;
87 #  endif
88 #  define GNULIB_defined_sa_family_t 1
89 # endif
90 #endif
91 
92 #if @HAVE_STRUCT_SOCKADDR_STORAGE@
93 /* Make the 'struct sockaddr_storage' field 'ss_family' visible on AIX 7.1.  */
94 # if !@HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@
95 #  ifndef ss_family
96 #   define ss_family __ss_family
97 #  endif
98 # endif
99 #else
100 # include <stdalign.h>
101 /* Code taken from glibc sysdeps/unix/sysv/linux/bits/socket.h on
102    2009-05-08, licensed under LGPLv2.1+, plus portability fixes. */
103 # define __ss_aligntype unsigned long int
104 # define _SS_SIZE 256
105 # define _SS_PADSIZE \
106     (_SS_SIZE - ((sizeof (sa_family_t) >= alignof (__ss_aligntype)      \
107                   ? sizeof (sa_family_t)                                \
108                   : alignof (__ss_aligntype))                           \
109                  + sizeof (__ss_aligntype)))
110 
111 # if !GNULIB_defined_struct_sockaddr_storage
112 struct sockaddr_storage
113 {
114   sa_family_t ss_family;      /* Address family, etc.  */
115   __ss_aligntype __ss_align;  /* Force desired alignment.  */
116   char __ss_padding[_SS_PADSIZE];
117 };
118 #  define GNULIB_defined_struct_sockaddr_storage 1
119 # endif
120 
121 #endif
122 
123 /* Get struct iovec.  */
124 /* But avoid namespace pollution on glibc systems.  */
125 #if ! defined __GLIBC__
126 # include <sys/uio.h>
127 #endif
128 
129 #if @HAVE_SYS_SOCKET_H@
130 
131 /* A platform that has <sys/socket.h>.  */
132 
133 /* For shutdown().  */
134 # if !defined SHUT_RD
135 #  define SHUT_RD 0
136 # endif
137 # if !defined SHUT_WR
138 #  define SHUT_WR 1
139 # endif
140 # if !defined SHUT_RDWR
141 #  define SHUT_RDWR 2
142 # endif
143 
144 #else
145 
146 # ifdef __CYGWIN__
147 #  error "Cygwin does have a sys/socket.h, doesn't it?!?"
148 # endif
149 
150 /* A platform that lacks <sys/socket.h>.
151 
152    Currently only MinGW is supported.  See the gnulib manual regarding
153    Windows sockets.  MinGW has the header files winsock2.h and
154    ws2tcpip.h that declare the sys/socket.h definitions we need.  Note
155    that you can influence which definitions you get by setting the
156    WINVER symbol before including these two files.  For example,
157    getaddrinfo is only available if _WIN32_WINNT >= 0x0501 (that
158    symbol is set indirectly through WINVER).  You can set this by
159    adding AC_DEFINE(WINVER, 0x0501) to configure.ac.  Note that your
160    code may not run on older Windows releases then.  My Windows 2000
161    box was not able to run the code, for example.  The situation is
162    slightly confusing because
163    <http://msdn.microsoft.com/en-us/library/ms738520>
164    suggests that getaddrinfo should be available on all Windows
165    releases. */
166 
167 # if @HAVE_WINSOCK2_H@
168 #  include <winsock2.h>
169 # endif
170 # if @HAVE_WS2TCPIP_H@
171 #  include <ws2tcpip.h>
172 # endif
173 
174 /* For shutdown(). */
175 # if !defined SHUT_RD && defined SD_RECEIVE
176 #  define SHUT_RD SD_RECEIVE
177 # endif
178 # if !defined SHUT_WR && defined SD_SEND
179 #  define SHUT_WR SD_SEND
180 # endif
181 # if !defined SHUT_RDWR && defined SD_BOTH
182 #  define SHUT_RDWR SD_BOTH
183 # endif
184 
185 # if @HAVE_WINSOCK2_H@
186 /* Include headers needed by the emulation code.  */
187 #  include <sys/types.h>
188 #  include <io.h>
189 
190 #  if !GNULIB_defined_socklen_t
191 typedef int socklen_t;
192 #   define GNULIB_defined_socklen_t 1
193 #  endif
194 
195 # endif
196 
197 /* Rudimentary 'struct msghdr'; this works as long as you don't try to
198    access msg_control or msg_controllen.  */
199 struct msghdr {
200   void *msg_name;
201   socklen_t msg_namelen;
202   struct iovec *msg_iov;
203   int msg_iovlen;
204   int msg_flags;
205 };
206 
207 #endif
208 
209 /* Fix some definitions from <winsock2.h>.  */
210 
211 #if @HAVE_WINSOCK2_H@
212 
213 # if !GNULIB_defined_rpl_fd_isset
214 
215 /* Re-define FD_ISSET to avoid a WSA call while we are not using
216    network sockets.  */
217 _GL_SYS_SOCKET_INLINE int
218 rpl_fd_isset (SOCKET fd, fd_set * set)
219 {
220   u_int i;
221   if (set == NULL)
222     return 0;
223 
224   for (i = 0; i < set->fd_count; i++)
225     if (set->fd_array[i] == fd)
226       return 1;
227 
228   return 0;
229 }
230 
231 #  define GNULIB_defined_rpl_fd_isset 1
232 # endif
233 
234 # undef FD_ISSET
235 # define FD_ISSET(fd, set) rpl_fd_isset(fd, set)
236 
237 #endif
238 
239 /* Hide some function declarations from <winsock2.h>.  */
240 
241 #if @HAVE_WINSOCK2_H@
242 # if !defined _@GUARD_PREFIX@_UNISTD_H
243 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
244 #   undef close
245 #   define close close_used_without_including_unistd_h
246 #  else
247     _GL_WARN_ON_USE (close,
248                      "close() used without including <unistd.h>");
249 #  endif
250 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
251 #   undef gethostname
252 #   define gethostname gethostname_used_without_including_unistd_h
253 #  else
254     _GL_WARN_ON_USE (gethostname,
255                      "gethostname() used without including <unistd.h>");
256 #  endif
257 # endif
258 # if !defined _@GUARD_PREFIX@_SYS_SELECT_H
259 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
260 #   undef select
261 #   define select select_used_without_including_sys_select_h
262 #  else
263     _GL_WARN_ON_USE (select,
264                      "select() used without including <sys/select.h>");
265 #  endif
266 # endif
267 #endif
268 
269 /* Wrap everything else to use libc file descriptors for sockets.  */
270 
271 #if @GNULIB_SOCKET@
272 # if @HAVE_WINSOCK2_H@
273 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
274 #   undef socket
275 #   define socket rpl_socket
276 #  endif
277 _GL_FUNCDECL_RPL (socket, int, (int domain, int type, int protocol));
278 _GL_CXXALIAS_RPL (socket, int, (int domain, int type, int protocol));
279 # else
280 _GL_CXXALIAS_SYS (socket, int, (int domain, int type, int protocol));
281 # endif
282 _GL_CXXALIASWARN (socket);
283 #elif @HAVE_WINSOCK2_H@
284 # undef socket
285 # define socket socket_used_without_requesting_gnulib_module_socket
286 #elif defined GNULIB_POSIXCHECK
287 # undef socket
288 # if HAVE_RAW_DECL_SOCKET
289 _GL_WARN_ON_USE (socket, "socket is not always POSIX compliant - "
290                  "use gnulib module socket for portability");
291 # endif
292 #endif
293 
294 #if @GNULIB_CONNECT@
295 # if @HAVE_WINSOCK2_H@
296 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
297 #   undef connect
298 #   define connect rpl_connect
299 #  endif
300 _GL_FUNCDECL_RPL (connect, int,
301                   (int fd, const struct sockaddr *addr, socklen_t addrlen)
302                   _GL_ARG_NONNULL ((2)));
303 _GL_CXXALIAS_RPL (connect, int,
304                   (int fd, const struct sockaddr *addr, socklen_t addrlen));
305 # else
306 /* Need to cast, because on NonStop Kernel, the third parameter is
307                                                      size_t addrlen.  */
308 _GL_CXXALIAS_SYS_CAST (connect, int,
309                        (int fd,
310                         const struct sockaddr *addr, socklen_t addrlen));
311 # endif
312 _GL_CXXALIASWARN (connect);
313 #elif @HAVE_WINSOCK2_H@
314 # undef connect
315 # define connect socket_used_without_requesting_gnulib_module_connect
316 #elif defined GNULIB_POSIXCHECK
317 # undef connect
318 # if HAVE_RAW_DECL_CONNECT
319 _GL_WARN_ON_USE (connect, "connect is not always POSIX compliant - "
320                  "use gnulib module connect for portability");
321 # endif
322 #endif
323 
324 #if @GNULIB_ACCEPT@
325 # if @HAVE_WINSOCK2_H@
326 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
327 #   undef accept
328 #   define accept rpl_accept
329 #  endif
330 _GL_FUNCDECL_RPL (accept, int,
331                   (int fd, struct sockaddr *addr, socklen_t *addrlen));
332 _GL_CXXALIAS_RPL (accept, int,
333                   (int fd, struct sockaddr *addr, socklen_t *addrlen));
334 # else
335 /* Need to cast, because on Solaris 10 systems, the third parameter is
336                                                        void *addrlen.  */
337 _GL_CXXALIAS_SYS_CAST (accept, int,
338                        (int fd, struct sockaddr *addr, socklen_t *addrlen));
339 # endif
340 _GL_CXXALIASWARN (accept);
341 #elif @HAVE_WINSOCK2_H@
342 # undef accept
343 # define accept accept_used_without_requesting_gnulib_module_accept
344 #elif defined GNULIB_POSIXCHECK
345 # undef accept
346 # if HAVE_RAW_DECL_ACCEPT
347 _GL_WARN_ON_USE (accept, "accept is not always POSIX compliant - "
348                  "use gnulib module accept for portability");
349 # endif
350 #endif
351 
352 #if @GNULIB_BIND@
353 # if @HAVE_WINSOCK2_H@
354 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
355 #   undef bind
356 #   define bind rpl_bind
357 #  endif
358 _GL_FUNCDECL_RPL (bind, int,
359                   (int fd, const struct sockaddr *addr, socklen_t addrlen)
360                   _GL_ARG_NONNULL ((2)));
361 _GL_CXXALIAS_RPL (bind, int,
362                   (int fd, const struct sockaddr *addr, socklen_t addrlen));
363 # else
364 /* Need to cast, because on NonStop Kernel, the third parameter is
365                                                      size_t addrlen.  */
366 _GL_CXXALIAS_SYS_CAST (bind, int,
367                        (int fd,
368                         const struct sockaddr *addr, socklen_t addrlen));
369 # endif
370 _GL_CXXALIASWARN (bind);
371 #elif @HAVE_WINSOCK2_H@
372 # undef bind
373 # define bind bind_used_without_requesting_gnulib_module_bind
374 #elif defined GNULIB_POSIXCHECK
375 # undef bind
376 # if HAVE_RAW_DECL_BIND
377 _GL_WARN_ON_USE (bind, "bind is not always POSIX compliant - "
378                  "use gnulib module bind for portability");
379 # endif
380 #endif
381 
382 #if @GNULIB_GETPEERNAME@
383 # if @HAVE_WINSOCK2_H@
384 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
385 #   undef getpeername
386 #   define getpeername rpl_getpeername
387 #  endif
388 _GL_FUNCDECL_RPL (getpeername, int,
389                   (int fd, struct sockaddr *addr, socklen_t *addrlen)
390                   _GL_ARG_NONNULL ((2, 3)));
391 _GL_CXXALIAS_RPL (getpeername, int,
392                   (int fd, struct sockaddr *addr, socklen_t *addrlen));
393 # else
394 /* Need to cast, because on Solaris 10 systems, the third parameter is
395                                                        void *addrlen.  */
396 _GL_CXXALIAS_SYS_CAST (getpeername, int,
397                        (int fd, struct sockaddr *addr, socklen_t *addrlen));
398 # endif
399 _GL_CXXALIASWARN (getpeername);
400 #elif @HAVE_WINSOCK2_H@
401 # undef getpeername
402 # define getpeername getpeername_used_without_requesting_gnulib_module_getpeername
403 #elif defined GNULIB_POSIXCHECK
404 # undef getpeername
405 # if HAVE_RAW_DECL_GETPEERNAME
406 _GL_WARN_ON_USE (getpeername, "getpeername is not always POSIX compliant - "
407                  "use gnulib module getpeername for portability");
408 # endif
409 #endif
410 
411 #if @GNULIB_GETSOCKNAME@
412 # if @HAVE_WINSOCK2_H@
413 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
414 #   undef getsockname
415 #   define getsockname rpl_getsockname
416 #  endif
417 _GL_FUNCDECL_RPL (getsockname, int,
418                   (int fd, struct sockaddr *addr, socklen_t *addrlen)
419                   _GL_ARG_NONNULL ((2, 3)));
420 _GL_CXXALIAS_RPL (getsockname, int,
421                   (int fd, struct sockaddr *addr, socklen_t *addrlen));
422 # else
423 /* Need to cast, because on Solaris 10 systems, the third parameter is
424                                                        void *addrlen.  */
425 _GL_CXXALIAS_SYS_CAST (getsockname, int,
426                        (int fd, struct sockaddr *addr, socklen_t *addrlen));
427 # endif
428 _GL_CXXALIASWARN (getsockname);
429 #elif @HAVE_WINSOCK2_H@
430 # undef getsockname
431 # define getsockname getsockname_used_without_requesting_gnulib_module_getsockname
432 #elif defined GNULIB_POSIXCHECK
433 # undef getsockname
434 # if HAVE_RAW_DECL_GETSOCKNAME
435 _GL_WARN_ON_USE (getsockname, "getsockname is not always POSIX compliant - "
436                  "use gnulib module getsockname for portability");
437 # endif
438 #endif
439 
440 #if @GNULIB_GETSOCKOPT@
441 # if @HAVE_WINSOCK2_H@
442 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
443 #   undef getsockopt
444 #   define getsockopt rpl_getsockopt
445 #  endif
446 _GL_FUNCDECL_RPL (getsockopt, int, (int fd, int level, int optname,
447                                     void *optval, socklen_t *optlen)
448                                    _GL_ARG_NONNULL ((4, 5)));
449 _GL_CXXALIAS_RPL (getsockopt, int, (int fd, int level, int optname,
450                                     void *optval, socklen_t *optlen));
451 # else
452 /* Need to cast, because on Solaris 10 systems, the fifth parameter is
453                                                        void *optlen.  */
454 _GL_CXXALIAS_SYS_CAST (getsockopt, int, (int fd, int level, int optname,
455                                          void *optval, socklen_t *optlen));
456 # endif
457 _GL_CXXALIASWARN (getsockopt);
458 #elif @HAVE_WINSOCK2_H@
459 # undef getsockopt
460 # define getsockopt getsockopt_used_without_requesting_gnulib_module_getsockopt
461 #elif defined GNULIB_POSIXCHECK
462 # undef getsockopt
463 # if HAVE_RAW_DECL_GETSOCKOPT
464 _GL_WARN_ON_USE (getsockopt, "getsockopt is not always POSIX compliant - "
465                  "use gnulib module getsockopt for portability");
466 # endif
467 #endif
468 
469 #if @GNULIB_LISTEN@
470 # if @HAVE_WINSOCK2_H@
471 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
472 #   undef listen
473 #   define listen rpl_listen
474 #  endif
475 _GL_FUNCDECL_RPL (listen, int, (int fd, int backlog));
476 _GL_CXXALIAS_RPL (listen, int, (int fd, int backlog));
477 # else
478 _GL_CXXALIAS_SYS (listen, int, (int fd, int backlog));
479 # endif
480 _GL_CXXALIASWARN (listen);
481 #elif @HAVE_WINSOCK2_H@
482 # undef listen
483 # define listen listen_used_without_requesting_gnulib_module_listen
484 #elif defined GNULIB_POSIXCHECK
485 # undef listen
486 # if HAVE_RAW_DECL_LISTEN
487 _GL_WARN_ON_USE (listen, "listen is not always POSIX compliant - "
488                  "use gnulib module listen for portability");
489 # endif
490 #endif
491 
492 #if @GNULIB_RECV@
493 # if @HAVE_WINSOCK2_H@
494 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
495 #   undef recv
496 #   define recv rpl_recv
497 #  endif
498 _GL_FUNCDECL_RPL (recv, ssize_t, (int fd, void *buf, size_t len, int flags)
499                                  _GL_ARG_NONNULL ((2)));
500 _GL_CXXALIAS_RPL (recv, ssize_t, (int fd, void *buf, size_t len, int flags));
501 # else
502 _GL_CXXALIAS_SYS (recv, ssize_t, (int fd, void *buf, size_t len, int flags));
503 # endif
504 _GL_CXXALIASWARN (recv);
505 #elif @HAVE_WINSOCK2_H@
506 # undef recv
507 # define recv recv_used_without_requesting_gnulib_module_recv
508 #elif defined GNULIB_POSIXCHECK
509 # undef recv
510 # if HAVE_RAW_DECL_RECV
511 _GL_WARN_ON_USE (recv, "recv is not always POSIX compliant - "
512                  "use gnulib module recv for portability");
513 # endif
514 #endif
515 
516 #if @GNULIB_SEND@
517 # if @HAVE_WINSOCK2_H@
518 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
519 #   undef send
520 #   define send rpl_send
521 #  endif
522 _GL_FUNCDECL_RPL (send, ssize_t,
523                   (int fd, const void *buf, size_t len, int flags)
524                   _GL_ARG_NONNULL ((2)));
525 _GL_CXXALIAS_RPL (send, ssize_t,
526                   (int fd, const void *buf, size_t len, int flags));
527 # else
528 _GL_CXXALIAS_SYS (send, ssize_t,
529                   (int fd, const void *buf, size_t len, int flags));
530 # endif
531 _GL_CXXALIASWARN (send);
532 #elif @HAVE_WINSOCK2_H@
533 # undef send
534 # define send send_used_without_requesting_gnulib_module_send
535 #elif defined GNULIB_POSIXCHECK
536 # undef send
537 # if HAVE_RAW_DECL_SEND
538 _GL_WARN_ON_USE (send, "send is not always POSIX compliant - "
539                  "use gnulib module send for portability");
540 # endif
541 #endif
542 
543 #if @GNULIB_RECVFROM@
544 # if @HAVE_WINSOCK2_H@
545 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
546 #   undef recvfrom
547 #   define recvfrom rpl_recvfrom
548 #  endif
549 _GL_FUNCDECL_RPL (recvfrom, ssize_t,
550                   (int fd, void *buf, size_t len, int flags,
551                    struct sockaddr *from, socklen_t *fromlen)
552                   _GL_ARG_NONNULL ((2)));
553 _GL_CXXALIAS_RPL (recvfrom, ssize_t,
554                   (int fd, void *buf, size_t len, int flags,
555                    struct sockaddr *from, socklen_t *fromlen));
556 # else
557 /* Need to cast, because on Solaris 10 systems, the sixth parameter is
558                                                void *fromlen.  */
559 _GL_CXXALIAS_SYS_CAST (recvfrom, ssize_t,
560                        (int fd, void *buf, size_t len, int flags,
561                         struct sockaddr *from, socklen_t *fromlen));
562 # endif
563 _GL_CXXALIASWARN (recvfrom);
564 #elif @HAVE_WINSOCK2_H@
565 # undef recvfrom
566 # define recvfrom recvfrom_used_without_requesting_gnulib_module_recvfrom
567 #elif defined GNULIB_POSIXCHECK
568 # undef recvfrom
569 # if HAVE_RAW_DECL_RECVFROM
570 _GL_WARN_ON_USE (recvfrom, "recvfrom is not always POSIX compliant - "
571                  "use gnulib module recvfrom for portability");
572 # endif
573 #endif
574 
575 #if @GNULIB_SENDTO@
576 # if @HAVE_WINSOCK2_H@
577 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
578 #   undef sendto
579 #   define sendto rpl_sendto
580 #  endif
581 _GL_FUNCDECL_RPL (sendto, ssize_t,
582                   (int fd, const void *buf, size_t len, int flags,
583                    const struct sockaddr *to, socklen_t tolen)
584                   _GL_ARG_NONNULL ((2)));
585 _GL_CXXALIAS_RPL (sendto, ssize_t,
586                   (int fd, const void *buf, size_t len, int flags,
587                    const struct sockaddr *to, socklen_t tolen));
588 # else
589 /* Need to cast, because on NonStop Kernel, the sixth parameter is
590                                                    size_t tolen.  */
591 _GL_CXXALIAS_SYS_CAST (sendto, ssize_t,
592                        (int fd, const void *buf, size_t len, int flags,
593                         const struct sockaddr *to, socklen_t tolen));
594 # endif
595 _GL_CXXALIASWARN (sendto);
596 #elif @HAVE_WINSOCK2_H@
597 # undef sendto
598 # define sendto sendto_used_without_requesting_gnulib_module_sendto
599 #elif defined GNULIB_POSIXCHECK
600 # undef sendto
601 # if HAVE_RAW_DECL_SENDTO
602 _GL_WARN_ON_USE (sendto, "sendto is not always POSIX compliant - "
603                  "use gnulib module sendto for portability");
604 # endif
605 #endif
606 
607 #if @GNULIB_SETSOCKOPT@
608 # if @HAVE_WINSOCK2_H@
609 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
610 #   undef setsockopt
611 #   define setsockopt rpl_setsockopt
612 #  endif
613 _GL_FUNCDECL_RPL (setsockopt, int, (int fd, int level, int optname,
614                                     const void * optval, socklen_t optlen)
615                                    _GL_ARG_NONNULL ((4)));
616 _GL_CXXALIAS_RPL (setsockopt, int, (int fd, int level, int optname,
617                                     const void * optval, socklen_t optlen));
618 # else
619 /* Need to cast, because on NonStop Kernel, the fifth parameter is
620                                              size_t optlen.  */
621 _GL_CXXALIAS_SYS_CAST (setsockopt, int,
622                        (int fd, int level, int optname,
623                         const void * optval, socklen_t optlen));
624 # endif
625 _GL_CXXALIASWARN (setsockopt);
626 #elif @HAVE_WINSOCK2_H@
627 # undef setsockopt
628 # define setsockopt setsockopt_used_without_requesting_gnulib_module_setsockopt
629 #elif defined GNULIB_POSIXCHECK
630 # undef setsockopt
631 # if HAVE_RAW_DECL_SETSOCKOPT
632 _GL_WARN_ON_USE (setsockopt, "setsockopt is not always POSIX compliant - "
633                  "use gnulib module setsockopt for portability");
634 # endif
635 #endif
636 
637 #if @GNULIB_SHUTDOWN@
638 # if @HAVE_WINSOCK2_H@
639 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
640 #   undef shutdown
641 #   define shutdown rpl_shutdown
642 #  endif
643 _GL_FUNCDECL_RPL (shutdown, int, (int fd, int how));
644 _GL_CXXALIAS_RPL (shutdown, int, (int fd, int how));
645 # else
646 _GL_CXXALIAS_SYS (shutdown, int, (int fd, int how));
647 # endif
648 _GL_CXXALIASWARN (shutdown);
649 #elif @HAVE_WINSOCK2_H@
650 # undef shutdown
651 # define shutdown shutdown_used_without_requesting_gnulib_module_shutdown
652 #elif defined GNULIB_POSIXCHECK
653 # undef shutdown
654 # if HAVE_RAW_DECL_SHUTDOWN
655 _GL_WARN_ON_USE (shutdown, "shutdown is not always POSIX compliant - "
656                  "use gnulib module shutdown for portability");
657 # endif
658 #endif
659 
660 #if @GNULIB_ACCEPT4@
661 /* Accept a connection on a socket, with specific opening flags.
662    The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
663    and O_TEXT, O_BINARY (defined in "binary-io.h").
664    See also the Linux man page at
665    <http://www.kernel.org/doc/man-pages/online/pages/man2/accept4.2.html>.  */
666 # if @HAVE_ACCEPT4@
667 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
668 #   define accept4 rpl_accept4
669 #  endif
670 _GL_FUNCDECL_RPL (accept4, int,
671                   (int sockfd, struct sockaddr *addr, socklen_t *addrlen,
672                    int flags));
673 _GL_CXXALIAS_RPL (accept4, int,
674                   (int sockfd, struct sockaddr *addr, socklen_t *addrlen,
675                    int flags));
676 # else
677 _GL_FUNCDECL_SYS (accept4, int,
678                   (int sockfd, struct sockaddr *addr, socklen_t *addrlen,
679                    int flags));
680 _GL_CXXALIAS_SYS (accept4, int,
681                   (int sockfd, struct sockaddr *addr, socklen_t *addrlen,
682                    int flags));
683 # endif
684 _GL_CXXALIASWARN (accept4);
685 #elif defined GNULIB_POSIXCHECK
686 # undef accept4
687 # if HAVE_RAW_DECL_ACCEPT4
688 _GL_WARN_ON_USE (accept4, "accept4 is unportable - "
689                  "use gnulib module accept4 for portability");
690 # endif
691 #endif
692 
693 _GL_INLINE_HEADER_END
694 
695 #endif /* _@GUARD_PREFIX@_SYS_SOCKET_H */
696 #endif /* _@GUARD_PREFIX@_SYS_SOCKET_H */
697 #endif
698