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