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-2014 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
82typedef 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
107struct 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
186typedef 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.  */
194struct 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
213rpl_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