2 * D header file for POSIX.
4 * Copyright: Copyright Sean Kelly 2005 - 2009.
5 * License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
6 * Authors: Sean Kelly, Alex Rønne Petersen
7 * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
10 /* Copyright Sean Kelly 2005 - 2009.
11 * Distributed under the Boost Software License, Version 1.0.
12 * (See accompanying file LICENSE or copy at
13 * http://www.boost.org/LICENSE_1_0.txt)
15 module core
.sys
.posix
.sys
.socket
;
17 import core
.sys
.posix
.config
;
18 public import core
.sys
.posix
.sys
.types
; // for ssize_t
19 public import core
.sys
.posix
.sys
.uio
; // for iovec
27 else version (WatchOS
)
30 version (ARM
) version = ARM_Any
;
31 version (AArch64
) version = ARM_Any
;
32 version (HPPA
) version = HPPA_Any
;
33 version (MIPS32
) version = MIPS_Any
;
34 version (MIPS64
) version = MIPS_Any
;
35 version (PPC
) version = PPC_Any
;
36 version (PPC64
) version = PPC_Any
;
37 version (RISCV32
) version = RISCV_Any
;
38 version (RISCV64
) version = RISCV_Any
;
39 version (S390
) version = IBMZ_Any
;
40 version (SPARC
) version = SPARC_Any
;
41 version (SPARC64
) version = SPARC_Any
;
42 version (SystemZ
) version = IBMZ_Any
;
43 version (X86
) version = X86_Any
;
44 version (X86_64
) version = X86_Any
;
47 extern (C
) nothrow @nogc:
58 sa_family_t sa_family;
62 struct sockaddr_storage
64 sa_family_t ss_family;
70 socklen_t msg_namelen;
71 struct iovec* msg_iov;
74 socklen_t msg_controllen;
78 struct iovec {} // from core.sys.posix.sys.uio
90 CMSG_NXTHDR(mhdr,cmsg)
143 alias uint socklen_t
;
144 alias ushort sa_family_t
;
148 sa_family_t sa_family
;
152 private enum : size_t
155 _SS_PADSIZE
= _SS_SIZE
- c_ulong
.sizeof
- sa_family_t
.sizeof
158 struct sockaddr_storage
160 sa_family_t ss_family
;
161 byte[_SS_PADSIZE
] __ss_padding
;
168 socklen_t msg_namelen
;
172 size_t msg_controllen
;
188 extern (D
) inout(ubyte)* CMSG_DATA( return scope inout(cmsghdr
)* cmsg
) pure nothrow @nogc { return cast(ubyte*)( cmsg
+ 1 ); }
190 version (CRuntime_Musl
)
194 private size_t
__CMSG_LEN(inout(cmsghdr
)* cmsg
) pure nothrow @nogc
196 return (cmsg
.cmsg_len
+ size_t
.sizeof
-1) & cast(size_t
)(~(size_t
.sizeof
- 1));
199 private inout(cmsghdr
)* __CMSG_NEXT(inout(cmsghdr
)* cmsg
) pure nothrow @nogc
201 return cmsg
+ __CMSG_LEN(cmsg
);
204 private inout(msghdr
)* __MHDR_END(inout(msghdr
)* mhdr
) pure nothrow @nogc
206 return cast(inout(msghdr
)*)(mhdr
.msg_control
+ mhdr
.msg_controllen
);
209 inout(cmsghdr
)* CMSG_NXTHDR(inout(msghdr
)* msg
, inout(cmsghdr
)* cmsg
) pure nothrow @nogc
211 return cmsg
.cmsg_len
< cmsghdr
.sizeof ||
212 __CMSG_LEN(cmsg
) + cmsghdr
.sizeof
>= __MHDR_END(msg
) - cast(inout(msghdr
)*)(cmsg
)
213 ?
cast(inout(cmsghdr
)*) null : cast(inout(cmsghdr
)*) __CMSG_NEXT(cmsg
);
219 private inout(cmsghdr
)* __cmsg_nxthdr(inout(msghdr
)*, inout(cmsghdr
)*) pure nothrow @nogc;
220 extern (D
) inout(cmsghdr
)* CMSG_NXTHDR(inout(msghdr
)* msg
, inout(cmsghdr
)* cmsg
) pure nothrow @nogc
222 return __cmsg_nxthdr(msg
, cmsg
);
226 extern (D
) inout(cmsghdr
)* CMSG_FIRSTHDR( inout(msghdr
)* mhdr
) pure nothrow @nogc
228 return ( cast(size_t
)mhdr
.msg_controllen
>= cmsghdr
.sizeof
229 ?
cast(inout(cmsghdr
)*) mhdr
.msg_control
230 : cast(inout(cmsghdr
)*) null );
235 size_t
CMSG_ALIGN( size_t len
) pure nothrow @nogc
237 return (len
+ size_t
.sizeof
- 1) & cast(size_t
) (~(size_t
.sizeof
- 1));
240 size_t
CMSG_LEN( size_t len
) pure nothrow @nogc
242 return CMSG_ALIGN(cmsghdr
.sizeof
) + len
;
246 extern (D
) size_t
CMSG_SPACE(size_t len
) pure nothrow @nogc
248 return CMSG_ALIGN(len
) + CMSG_ALIGN(cmsghdr
.sizeof
);
292 else version (HPPA_Any
)
308 SO_ACCEPTCONN
= 0x401c,
309 SO_BROADCAST
= 0x0020,
311 SO_DONTROUTE
= 0x0010,
313 SO_KEEPALIVE
= 0x0008,
315 SO_OOBINLINE
= 0x0100,
317 SO_RCVLOWAT
= 0x1004,
318 SO_RCVTIMEO
= 0x1006,
319 SO_REUSEADDR
= 0x0004,
321 SO_SNDLOWAT
= 0x1003,
322 SO_SNDTIMEO
= 0x1005,
326 else version (MIPS_Any
)
342 SO_ACCEPTCONN
= 0x1009,
343 SO_BROADCAST
= 0x0020,
345 SO_DONTROUTE
= 0x0010,
347 SO_KEEPALIVE
= 0x0008,
349 SO_OOBINLINE
= 0x0100,
351 SO_RCVLOWAT
= 0x1004,
352 SO_RCVTIMEO
= 0x1006,
353 SO_REUSEADDR
= 0x0004,
355 SO_SNDLOWAT
= 0x1003,
356 SO_SNDTIMEO
= 0x1005,
360 else version (PPC_Any
)
394 else version (ARM_Any
)
429 else version (RISCV_Any
)
463 else version (SPARC_Any
)
497 else version (IBMZ_Any
)
531 else version (LoongArch64
)
566 static assert(0, "unimplemented");
568 version (CRuntime_Glibc
)
586 MSG_DONTROUTE
= 0x04,
592 MSG_NOSIGNAL
= 0x4000
602 PF_APPLETALK
= AF_APPLETALK
,
606 enum int SOCK_RDM
= 4;
615 else version (Darwin
)
617 alias uint socklen_t
;
618 alias ubyte sa_family_t
;
623 sa_family_t sa_family
;
627 private enum : size_t
629 _SS_PAD1
= long.sizeof
- ubyte.sizeof
- sa_family_t
.sizeof
,
630 _SS_PAD2
= 128 - ubyte.sizeof
- sa_family_t
.sizeof
- _SS_PAD1
- long.sizeof
633 struct sockaddr_storage
636 sa_family_t ss_family
;
637 byte[_SS_PAD1
] __ss_pad1
;
639 byte[_SS_PAD2
] __ss_pad2
;
645 socklen_t msg_namelen
;
649 socklen_t msg_controllen
;
663 socklen_t
CMSG_ALIGN(socklen_t len
) pure nothrow @nogc { return (len
+ socklen_t
.sizeof
- 1) & cast(socklen_t
) (~(socklen_t
.sizeof
- 1)); }
664 socklen_t
CMSG_SPACE(socklen_t len
) pure nothrow @nogc { return CMSG_ALIGN(len
) + CMSG_ALIGN(cmsghdr
.sizeof
); }
665 socklen_t
CMSG_LEN(socklen_t len
) pure nothrow @nogc { return CMSG_ALIGN(cmsghdr
.sizeof
) + len
; }
667 inout(ubyte)* CMSG_DATA( return scope inout(cmsghdr
)* cmsg
) pure nothrow @nogc { return cast(ubyte*)( cmsg
+ 1 ); }
669 inout(cmsghdr
)* CMSG_FIRSTHDR( inout(msghdr
)* mhdr
) pure nothrow @nogc
671 return ( cast(socklen_t
)mhdr
.msg_controllen
>= cmsghdr
.sizeof ?
cast(inout(cmsghdr
)*) mhdr
.msg_control
: cast(inout(cmsghdr
)*) null );
701 SO_ACCEPTCONN
= 0x0002,
702 SO_BROADCAST
= 0x0020,
704 SO_DONTROUTE
= 0x0010,
706 SO_KEEPALIVE
= 0x0008,
708 SO_NOSIGPIPE
= 0x1022, // non-standard
709 SO_OOBINLINE
= 0x0100,
711 SO_RCVLOWAT
= 0x1004,
712 SO_RCVTIMEO
= 0x1006,
713 SO_REUSEADDR
= 0x0004,
714 SO_REUSEPORT
= 0x0200,
716 SO_SNDLOWAT
= 0x1003,
717 SO_SNDTIMEO
= 0x1005,
744 PF_APPLETALK
= AF_APPLETALK
,
755 else version (FreeBSD
)
757 alias uint socklen_t
;
758 alias ubyte sa_family_t
;
763 sa_family_t sa_family
;
769 enum _SS_ALIGNSIZE
= long.sizeof
;
770 enum _SS_MAXSIZE
= 128;
771 enum _SS_PAD1SIZE
= _SS_ALIGNSIZE
- ubyte.sizeof
- sa_family_t
.sizeof
;
772 enum _SS_PAD2SIZE
= _SS_MAXSIZE
- ubyte.sizeof
- sa_family_t
.sizeof
- _SS_PAD1SIZE
- _SS_ALIGNSIZE
;
775 struct sockaddr_storage
778 sa_family_t ss_family
;
779 byte[_SS_PAD1SIZE
] __ss_pad1
;
781 byte[_SS_PAD2SIZE
] __ss_pad2
;
787 socklen_t msg_namelen
;
791 socklen_t msg_controllen
;
807 private // <machine/param.h>
809 enum _ALIGNBYTES
= /+c_int+/ int.sizeof
- 1;
810 extern (D
) size_t
_ALIGN( size_t p
) { return (p
+ _ALIGNBYTES
) & ~_ALIGNBYTES
; }
813 extern (D
) ubyte* CMSG_DATA( cmsghdr
* cmsg
)
815 return cast(ubyte*) cmsg
+ _ALIGN( cmsghdr
.sizeof
);
818 extern (D
) cmsghdr
* CMSG_NXTHDR( msghdr
* mhdr
, cmsghdr
* cmsg
)
822 return CMSG_FIRSTHDR( mhdr
);
826 if ( cast(ubyte*) cmsg
+ _ALIGN( cmsg
.cmsg_len
) + _ALIGN( cmsghdr
.sizeof
) >
827 cast(ubyte*) mhdr
.msg_control
+ mhdr
.msg_controllen
)
830 return cast(cmsghdr
*) (cast(ubyte*) cmsg
+ _ALIGN( cmsg
.cmsg_len
));
834 extern (D
) cmsghdr
* CMSG_FIRSTHDR( msghdr
* mhdr
)
836 return mhdr
.msg_controllen
>= cmsghdr
.sizeof ?
cast(cmsghdr
*) mhdr
.msg_control
: null;
860 SO_ACCEPTCONN
= 0x0002,
861 SO_BROADCAST
= 0x0020,
863 SO_DONTROUTE
= 0x0010,
865 SO_KEEPALIVE
= 0x0008,
867 SO_NOSIGPIPE
= 0x0800, // non-standard
868 SO_OOBINLINE
= 0x0100,
870 SO_RCVLOWAT
= 0x1004,
871 SO_RCVTIMEO
= 0x1006,
872 SO_REUSEADDR
= 0x0004,
873 SO_REUSEPORT
= 0x0200,
875 SO_SNDLOWAT
= 0x1003,
876 SO_SNDTIMEO
= 0x1005,
894 MSG_NOSIGNAL
= 0x20000
913 else version (NetBSD
)
915 alias uint socklen_t
;
916 alias ubyte sa_family_t
;
921 sa_family_t sa_family
;
927 enum _SS_ALIGNSIZE
= long.sizeof
;
928 enum _SS_MAXSIZE
= 128;
929 enum _SS_PAD1SIZE
= _SS_ALIGNSIZE
- ubyte.sizeof
- sa_family_t
.sizeof
;
930 enum _SS_PAD2SIZE
= _SS_MAXSIZE
- ubyte.sizeof
- sa_family_t
.sizeof
- _SS_PAD1SIZE
- _SS_ALIGNSIZE
;
933 struct sockaddr_storage
936 sa_family_t ss_family
;
937 byte[_SS_PAD1SIZE
] __ss_pad1
;
939 byte[_SS_PAD2SIZE
] __ss_pad2
;
945 socklen_t msg_namelen
;
949 socklen_t msg_controllen
;
965 private // <machine/param.h>
967 enum _ALIGNBYTES
= /+c_int+/ int.sizeof
- 1;
968 extern (D
) size_t
_ALIGN( size_t p
) { return (p
+ _ALIGNBYTES
) & ~_ALIGNBYTES
; }
971 extern (D
) ubyte* CMSG_DATA( cmsghdr
* cmsg
)
973 return cast(ubyte*) cmsg
+ _ALIGN( cmsghdr
.sizeof
);
976 extern (D
) cmsghdr
* CMSG_NXTHDR( msghdr
* mhdr
, cmsghdr
* cmsg
)
980 return CMSG_FIRSTHDR( mhdr
);
984 if ( cast(ubyte*) cmsg
+ _ALIGN( cmsg
.cmsg_len
) + _ALIGN( cmsghdr
.sizeof
) >
985 cast(ubyte*) mhdr
.msg_control
+ mhdr
.msg_controllen
)
988 return cast(cmsghdr
*) (cast(ubyte*) cmsg
+ _ALIGN( cmsg
.cmsg_len
));
992 extern (D
) cmsghdr
* CMSG_FIRSTHDR( msghdr
* mhdr
)
994 return mhdr
.msg_controllen
>= cmsghdr
.sizeof ?
cast(cmsghdr
*) mhdr
.msg_control
: null;
1018 SO_DEBUG
= 0x0001, /* turn on debugging info recording */
1019 SO_ACCEPTCONN
= 0x0002, /* socket has had listen() */
1020 SO_REUSEADDR
= 0x0004, /* allow local address reuse */
1021 SO_KEEPALIVE
= 0x0008, /* keep connections alive */
1022 SO_DONTROUTE
= 0x0010, /* just use interface addresses */
1023 SO_BROADCAST
= 0x0020, /* permit sending of broadcast msgs */
1024 SO_USELOOPBACK
= 0x0040, /* bypass hardware when possible */
1025 SO_LINGER
= 0x0080, /* linger on close if data present */
1026 SO_OOBINLINE
= 0x0100, /* leave received OOB data in line */
1027 SO_REUSEPORT
= 0x0200, /* allow local address & port reuse */
1028 /* SO_OTIMESTAMP 0x0400 */
1029 SO_NOSIGPIPE
= 0x0800, /* no SIGPIPE from EPIPE */
1030 SO_ACCEPTFILTER
= 0x1000, /* there is an accept filter */
1031 SO_TIMESTAMP
= 0x2000, /* timestamp received dgram traffic */
1034 * Additional options, not kept in so_options.
1036 SO_SNDBUF
= 0x1001, /* send buffer size */
1037 SO_RCVBUF
= 0x1002, /* receive buffer size */
1038 SO_SNDLOWAT
= 0x1003, /* send low-water mark */
1039 SO_RCVLOWAT
= 0x1004, /* receive low-water mark */
1040 /* SO_OSNDTIMEO 0x1005 */
1041 /* SO_ORCVTIMEO 0x1006 */
1042 SO_ERROR
= 0x1007, /* get error status and clear */
1043 SO_TYPE
= 0x1008, /* get socket type */
1044 SO_OVERFLOWED
= 0x1009, /* datagrams: return packets dropped */
1046 SO_NOHEADER
= 0x100a, /* user supplies no header to kernel;
1047 * kernel removes header and supplies
1050 SO_SNDTIMEO
= 0x100b, /* send timeout */
1051 SO_RCVTIMEO
= 0x100c /* receive timeout */
1062 MSG_OOB
= 0x0001, /* process out-of-band data */
1063 MSG_PEEK
= 0x0002, /* peek at incoming message */
1064 MSG_DONTROUTE
= 0x0004, /* send without using routing tables */
1065 MSG_EOR
= 0x0008, /* data completes record */
1066 MSG_TRUNC
= 0x0010, /* data discarded before delivery */
1067 MSG_CTRUNC
= 0x0020, /* control data lost before delivery */
1068 MSG_WAITALL
= 0x0040, /* wait for full request or error */
1069 MSG_DONTWAIT
= 0x0080, /* this message should be nonblocking */
1070 MSG_BCAST
= 0x0100, /* this message was rcvd using link-level brdcst */
1071 MSG_MCAST
= 0x0200, /* this message was rcvd using link-level mcast */
1072 MSG_NOSIGNAL
= 0x0400 /* do not generate SIGPIPE on EOF */
1091 else version (OpenBSD
)
1093 alias uint socklen_t
;
1094 alias ubyte sa_family_t
;
1099 sa_family_t sa_family
;
1103 struct sockaddr_storage
1106 sa_family_t ss_family
;
1109 ubyte[240] __ss_pad2
;
1115 socklen_t msg_namelen
;
1119 socklen_t msg_controllen
;
1133 SCM_TIMESTAMP
= 0x04
1136 private // <sys/_types.h>
1138 enum _ALIGNBYTES
= c_long
.sizeof
- 1;
1139 extern (D
) size_t
_ALIGN(size_t p
) pure nothrow @nogc
1141 return (p
+ _ALIGNBYTES
) & ~_ALIGNBYTES
;
1145 extern (D
) ubyte* CMSG_DATA(cmsghdr
* cmsg
) pure nothrow @nogc
1147 return cast(ubyte*) cmsg
+ _ALIGN(cmsghdr
.sizeof
);
1150 extern (D
) cmsghdr
* CMSG_NXTHDR(msghdr
* mhdr
, cmsghdr
* cmsg
) pure nothrow @nogc
1152 if (cast(ubyte*) cmsg
+ _ALIGN(cmsg
.cmsg_len
) + _ALIGN(cmsghdr
.sizeof
) >
1153 cast(ubyte*) mhdr
.msg_control
+ mhdr
.msg_controllen
)
1156 return cast(cmsghdr
*) (cast(ubyte*) cmsg
+ _ALIGN(cmsg
.cmsg_len
));
1159 extern (D
) cmsghdr
* CMSG_FIRSTHDR(msghdr
* mhdr
) pure nothrow @nogc
1161 return mhdr
.msg_controllen
>= cmsghdr
.sizeof ?
cast(cmsghdr
*) mhdr
.msg_control
: null;
1166 size_t
CMSG_LEN(size_t len
) pure nothrow @nogc
1168 return _ALIGN(cmsghdr
.sizeof
) + len
;
1172 extern (D
) size_t
CMSG_SPACE(size_t len
) pure nothrow @nogc
1174 return _ALIGN(cmsghdr
.sizeof
) + _ALIGN(len
);
1199 SO_ACCEPTCONN
= 0x0002,
1200 SO_REUSEADDR
= 0x0004,
1201 SO_KEEPALIVE
= 0x0008,
1202 SO_DONTROUTE
= 0x0010,
1203 SO_BROADCAST
= 0x0020,
1204 SO_USELOOPBACK
= 0x0040,
1206 SO_OOBINLINE
= 0x0100,
1207 SO_REUSEPORT
= 0x0200,
1208 SO_TIMESTAMP
= 0x0800,
1209 SO_BINDANY
= 0x1000,
1210 SO_ZEROSIZE
= 0x2000,
1214 SO_SNDLOWAT
= 0x1003,
1215 SO_RCVLOWAT
= 0x1004,
1216 SO_SNDTIMEO
= 0x1005,
1217 SO_RCVTIMEO
= 0x1006,
1220 SO_NETPROC
= 0x1020,
1222 SO_PEERCRED
= 0x1022,
1235 MSG_DONTROUTE
= 0x004,
1239 MSG_WAITALL
= 0x040,
1240 MSG_DONTWAIT
= 0x080,
1243 MSG_NOSIGNAL
= 0x400,
1244 MSG_CMSG_CLOEXEC
= 0x800,
1263 else version (DragonFlyBSD
)
1265 alias uint socklen_t
;
1266 alias ubyte sa_family_t
;
1272 //SOCK_RAW = 3, // defined below
1277 enum SOCK_CLOEXEC
= 0x10000000;
1278 enum SOCK_NONBLOCK
= 0x20000000;
1283 SO_ACCEPTCONN
= 0x0002,
1284 SO_REUSEADDR
= 0x0004,
1285 SO_KEEPALIVE
= 0x0008,
1286 SO_DONTROUTE
= 0x0010,
1287 SO_BROADCAST
= 0x0020,
1288 SO_USELOOPBACK
= 0x0040,
1290 SO_OOBINLINE
= 0x0100,
1291 SO_REUSEPORT
= 0x0200,
1292 SO_TIMESTAMP
= 0x0400,
1293 SO_NOSIGPIPE
= 0x0800, // non-standard
1294 SO_ACCEPTFILTER
= 0x1000,
1298 SO_SNDLOWAT
= 0x1003,
1299 SO_RCVLOWAT
= 0x1004,
1300 SO_SNDTIMEO
= 0x1005,
1301 SO_RCVTIMEO
= 0x1006,
1304 SO_SNDSPACE
= 0x100a, // get appr. send buffer free space
1305 SO_CPUHINT
= 0x1030, // get socket's owner cpuid hint
1314 struct accept_filter_arg
{
1316 byte[256-16] af_arg
;
1337 sa_family_t sa_family
;
1341 enum SOCK_MAXADDRLEN
= 255;
1350 enum _SS_ALIGNSIZE
= long.sizeof
;
1351 enum _SS_MAXSIZE
= 128;
1352 enum _SS_PAD1SIZE
= _SS_ALIGNSIZE
- ubyte.sizeof
- sa_family_t
.sizeof
;
1353 enum _SS_PAD2SIZE
= _SS_MAXSIZE
- ubyte.sizeof
- sa_family_t
.sizeof
- _SS_PAD1SIZE
- _SS_ALIGNSIZE
;
1356 struct sockaddr_storage
1359 sa_family_t ss_family
;
1360 byte[_SS_PAD1SIZE
] __ss_pad1
;
1362 byte[_SS_PAD2SIZE
] __ss_pad2
;
1368 socklen_t msg_namelen
;
1372 socklen_t msg_controllen
;
1376 enum SOMAXCONN
= 128;
1377 enum SOMAXOPT_SIZE
= 65536;
1378 enum SOMAXOPT_SIZE0
= (32 * 1024 * 1024);
1382 MSG_OOB
= 0x00000001,
1383 MSG_PEEK
= 0x00000002,
1384 MSG_DONTROUTE
= 0x00000004,
1385 MSG_EOR
= 0x00000008,
1386 MSG_TRUNC
= 0x00000010,
1387 MSG_CTRUNC
= 0x00000020,
1388 MSG_WAITALL
= 0x00000040,
1389 MSG_DONTWAIT
= 0x00000080,
1390 MSG_EOF
= 0x00000100,
1391 MSG_UNUSED09
= 0x00000200,
1392 MSG_NOSIGNAL
= 0x00000400,
1393 MSG_SYNC
= 0x00000800,
1394 MSG_CMSG_CLOEXEC
= 0x00001000,
1395 /* These override FIONBIO. MSG_FNONBLOCKING is functionally equivalent to MSG_DONTWAIT.*/
1396 MSG_FBLOCKING
= 0x00010000,
1397 MSG_FNONBLOCKING
= 0x00020000,
1398 MSG_FMASK
= 0xFFFF0000,
1408 enum CMGROUP_MAX
= 16;
1415 short cmcred_ngroups
;
1416 gid_t
[CMGROUP_MAX
] cmcred_groups
;
1424 private // <machine/param.h>
1426 enum _ALIGNBYTES
= /+c_int+/ int.sizeof
- 1;
1427 extern (D
) size_t
_ALIGN( size_t p
) { return (p
+ _ALIGNBYTES
) & ~_ALIGNBYTES
; }
1430 extern (D
) ubyte* CMSG_DATA( cmsghdr
* cmsg
)
1432 return cast(ubyte*) cmsg
+ _ALIGN( cmsghdr
.sizeof
);
1435 extern (D
) cmsghdr
* CMSG_NXTHDR( msghdr
* mhdr
, cmsghdr
* cmsg
)
1439 return CMSG_FIRSTHDR( mhdr
);
1443 if ( cast(ubyte*) cmsg
+ _ALIGN( cmsg
.cmsg_len
) + _ALIGN( cmsghdr
.sizeof
) >
1444 cast(ubyte*) mhdr
.msg_control
+ mhdr
.msg_controllen
)
1447 return cast(cmsghdr
*) (cast(ubyte*) cmsg
+ _ALIGN( cmsg
.cmsg_len
));
1451 extern (D
) cmsghdr
* CMSG_FIRSTHDR( msghdr
* mhdr
)
1453 return mhdr
.msg_controllen
>= cmsghdr
.sizeof ?
cast(cmsghdr
*) mhdr
.msg_control
: null;
1463 else version (Solaris
)
1465 alias uint socklen_t
;
1466 alias ushort sa_family_t
;
1470 sa_family_t sa_family
;
1471 char[14] sa_data
= 0;
1474 alias double sockaddr_maxalign_t
;
1478 enum _SS_ALIGNSIZE
= sockaddr_maxalign_t
.sizeof
;
1479 enum _SS_MAXSIZE
= 256;
1480 enum _SS_PAD1SIZE
= _SS_ALIGNSIZE
- sa_family_t
.sizeof
;
1481 enum _SS_PAD2SIZE
= _SS_MAXSIZE
- sa_family_t
.sizeof
+ _SS_PAD1SIZE
+ _SS_ALIGNSIZE
;
1484 struct sockaddr_storage
1486 sa_family_t ss_family
;
1487 char[_SS_PAD1SIZE
] _ss_pad1
= void;
1488 sockaddr_maxalign_t _ss_align
;
1489 char[_SS_PAD2SIZE
] _ss_pad2
= void;
1495 socklen_t msg_namelen
;
1499 socklen_t msg_controllen
;
1515 // FIXME: CMSG_DATA, CMSG_NXTHDR, CMSG_FIRSTHDR missing
1538 SO_ACCEPTCONN
= 0x0002,
1539 SO_BROADCAST
= 0x0020,
1541 SO_DONTROUTE
= 0x0010,
1543 SO_KEEPALIVE
= 0x0008,
1545 SO_OOBINLINE
= 0x0100,
1547 SO_RCVLOWAT
= 0x1004,
1548 SO_RCVTIMEO
= 0x1006,
1549 SO_REUSEADDR
= 0x0004,
1551 SO_SNDLOWAT
= 0x1003,
1552 SO_SNDTIMEO
= 0x1005,
1555 SO_USELOOPBACK
= 0x0040, // non-standard
1556 SO_DGRAM_ERRIND
= 0x0200, // non-standard
1557 SO_RECVUCRED
= 0x0400, // non-standard
1568 MSG_DONTROUTE
= 0x4,
1594 static assert(false, "Unsupported platform");
1598 int accept(int, sockaddr*, socklen_t*);
1599 int bind(int, const scope sockaddr*, socklen_t);
1600 int connect(int, const scope sockaddr*, socklen_t);
1601 int getpeername(int, sockaddr*, socklen_t*);
1602 int getsockname(int, sockaddr*, socklen_t*);
1603 int getsockopt(int, int, int, void*, socklen_t*);
1604 int listen(int, int);
1605 ssize_t recv(int, void*, size_t, int);
1606 ssize_t recvfrom(int, void*, size_t, int, sockaddr*, socklen_t*);
1607 ssize_t recvmsg(int, msghdr*, int);
1608 ssize_t send(int, const scope void*, size_t, int);
1609 ssize_t sendmsg(int, const scope msghdr*, int);
1610 ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
1611 int setsockopt(int, int, int, const scope void*, socklen_t);
1612 int shutdown(int, int);
1613 int socket(int, int, int);
1614 int sockatmark(int);
1615 int socketpair(int, int, int, ref int[2]);
1618 version (CRuntime_Glibc
)
1620 int accept(int, scope sockaddr
*, scope socklen_t
*);
1621 int bind(int, const scope sockaddr
*, socklen_t
);
1622 int connect(int, const scope sockaddr
*, socklen_t
);
1623 int getpeername(int, scope sockaddr
*, scope socklen_t
*);
1624 int getsockname(int, scope sockaddr
*, scope socklen_t
*);
1625 int getsockopt(int, int, int, scope void*, scope socklen_t
*);
1626 int listen(int, int) @safe;
1627 ssize_t
recv(int, scope void*, size_t
, int);
1628 ssize_t
recvfrom(int, scope void*, size_t
, int, scope sockaddr
*, scope socklen_t
*);
1629 ssize_t
recvmsg(int, scope msghdr
*, int);
1630 ssize_t
send(int, const scope void*, size_t
, int);
1631 ssize_t
sendmsg(int, const scope msghdr
*, int);
1632 ssize_t
sendto(int, const scope void*, size_t
, int, const scope sockaddr
*, socklen_t
);
1633 int setsockopt(int, int, int, const scope void*, socklen_t
);
1634 int shutdown(int, int) @safe;
1635 int socket(int, int, int) @safe;
1636 int sockatmark(int) @safe;
1637 int socketpair(int, int, int, ref int[2]) @safe;
1639 else version (Darwin
)
1641 int accept(int, scope sockaddr
*, scope socklen_t
*);
1642 int bind(int, const scope sockaddr
*, socklen_t
);
1643 int connect(int, const scope sockaddr
*, socklen_t
);
1644 int getpeername(int, scope sockaddr
*, scope socklen_t
*);
1645 int getsockname(int, scope sockaddr
*, scope socklen_t
*);
1646 int getsockopt(int, int, int, scope void*, scope socklen_t
*);
1647 int listen(int, int) @safe;
1648 ssize_t
recv(int, scope void*, size_t
, int);
1649 ssize_t
recvfrom(int, scope void*, size_t
, int, scope sockaddr
*, scope socklen_t
*);
1650 ssize_t
recvmsg(int, scope msghdr
*, int);
1651 ssize_t
send(int, const scope void*, size_t
, int);
1652 ssize_t
sendmsg(int, const scope msghdr
*, int);
1653 ssize_t
sendto(int, const scope void*, size_t
, int, const scope sockaddr
*, socklen_t
);
1654 int setsockopt(int, int, int, const scope void*, socklen_t
);
1655 int shutdown(int, int) @safe;
1656 int socket(int, int, int) @safe;
1657 int sockatmark(int) @safe;
1658 int socketpair(int, int, int, ref int[2]) @safe;
1660 else version (FreeBSD
)
1662 int accept(int, scope sockaddr
*, scope socklen_t
*);
1663 int bind(int, const scope sockaddr
*, socklen_t
);
1664 int connect(int, const scope sockaddr
*, socklen_t
);
1665 int getpeername(int, scope sockaddr
*, scope socklen_t
*);
1666 int getsockname(int, scope sockaddr
*, scope socklen_t
*);
1667 int getsockopt(int, int, int, scope void*, scope socklen_t
*);
1668 int listen(int, int) @safe;
1669 ssize_t
recv(int, scope void*, size_t
, int);
1670 ssize_t
recvfrom(int, scope void*, size_t
, int, scope sockaddr
*, scope socklen_t
*);
1671 ssize_t
recvmsg(int, scope msghdr
*, int);
1672 ssize_t
send(int, const scope void*, size_t
, int);
1673 ssize_t
sendmsg(int, const scope msghdr
*, int);
1674 ssize_t
sendto(int, const scope void*, size_t
, int, const scope sockaddr
*, socklen_t
);
1675 int setsockopt(int, int, int, const scope void*, socklen_t
);
1676 int shutdown(int, int) @safe;
1677 int socket(int, int, int) @safe;
1678 int sockatmark(int) @safe;
1679 int socketpair(int, int, int, ref int[2]) @safe;
1681 else version (NetBSD
)
1683 int accept(int, scope sockaddr
*, scope socklen_t
*);
1684 int bind(int, const scope sockaddr
*, socklen_t
);
1685 int connect(int, const scope sockaddr
*, socklen_t
);
1686 int getpeername(int, scope sockaddr
*, scope socklen_t
*);
1687 int getsockname(int, scope sockaddr
*, scope socklen_t
*);
1688 int getsockopt(int, int, int, scope void*, scope socklen_t
*);
1689 int listen(int, int) @safe;
1690 ssize_t
recv(int, scope void*, size_t
, int);
1691 ssize_t
recvfrom(int, scope void*, size_t
, int, scope sockaddr
*, scope socklen_t
*);
1692 ssize_t
recvmsg(int, scope msghdr
*, int);
1693 ssize_t
send(int, const scope void*, size_t
, int);
1694 ssize_t
sendmsg(int, const scope msghdr
*, int);
1695 ssize_t
sendto(int, const scope void*, size_t
, int, const scope sockaddr
*, socklen_t
);
1696 int setsockopt(int, int, int, const scope void*, socklen_t
);
1697 int shutdown(int, int) @safe;
1698 int socket(int, int, int) @safe;
1699 int sockatmark(int) @safe;
1700 int socketpair(int, int, int, ref int[2]) @safe;
1702 else version (OpenBSD
)
1704 int accept(int, scope sockaddr
*, scope socklen_t
*);
1705 int bind(int, const scope sockaddr
*, socklen_t
);
1706 int connect(int, const scope sockaddr
*, socklen_t
);
1707 int getpeername(int, scope sockaddr
*, scope socklen_t
*);
1708 int getsockname(int, scope sockaddr
*, scope socklen_t
*);
1709 int getsockopt(int, int, int, scope void*, scope socklen_t
*);
1710 int listen(int, int) @safe;
1711 ssize_t
recv(int, scope void*, size_t
, int);
1712 ssize_t
recvfrom(int, scope void*, size_t
, int, scope sockaddr
*, scope socklen_t
*);
1713 ssize_t
recvmsg(int, scope msghdr
*, int);
1714 ssize_t
send(int, const scope void*, size_t
, int);
1715 ssize_t
sendmsg(int, const scope msghdr
*, int);
1716 ssize_t
sendto(int, const scope void*, size_t
, int, const scope sockaddr
*, socklen_t
);
1717 int setsockopt(int, int, int, const scope void*, socklen_t
);
1718 int shutdown(int, int) @safe;
1719 int socket(int, int, int) @safe;
1720 int sockatmark(int) @safe;
1721 int socketpair(int, int, int, ref int[2]) @safe;
1723 else version (DragonFlyBSD
)
1725 int accept(int, sockaddr
*, socklen_t
*);
1726 // int accept4(int, sockaddr*, socklen_t*, int);
1727 int bind(int, const scope sockaddr
*, socklen_t
);
1728 int connect(int, const scope sockaddr
*, socklen_t
);
1729 // int extconnect(int, int, sockaddr*, socklen_t);
1730 int getpeername(int, sockaddr
*, socklen_t
*);
1731 int getsockname(int, sockaddr
*, socklen_t
*);
1732 int getsockopt(int, int, int, void*, socklen_t
*);
1733 int listen(int, int);
1734 ssize_t
recv(int, void*, size_t
, int);
1735 ssize_t
recvfrom(int, void*, size_t
, int, sockaddr
*, socklen_t
*);
1736 ssize_t
recvmsg(int, msghdr
*, int);
1737 ssize_t
send(int, const scope void*, size_t
, int);
1738 ssize_t
sendto(int, const scope void*, size_t
, int, const scope sockaddr
*, socklen_t
);
1739 ssize_t
sendmsg(int, const scope msghdr
*, int);
1740 // int sendfile(int, int, off_t, size_t, sf_hdtr *, off_t *, int);
1741 int setsockopt(int, int, int, const scope void*, socklen_t
);
1742 int shutdown(int, int);
1743 int sockatmark(int);
1744 int socket(int, int, int);
1745 int socketpair(int, int, int, ref int[2]);
1746 // void pfctlinput(int, struct sockaddr *);
1748 else version (Solaris
)
1750 int accept(int, scope sockaddr
*, scope socklen_t
*);
1751 int bind(int, const scope sockaddr
*, socklen_t
);
1752 int connect(int, const scope sockaddr
*, socklen_t
);
1753 int getpeername(int, scope sockaddr
*, scope socklen_t
*);
1754 int getsockname(int, scope sockaddr
*, scope socklen_t
*);
1755 int getsockopt(int, int, int, scope void*, scope socklen_t
*);
1756 int listen(int, int) @safe;
1757 ssize_t
recv(int, scope void*, size_t
, int);
1758 ssize_t
recvfrom(int, scope void*, size_t
, int, scope sockaddr
*, scope socklen_t
*);
1759 ssize_t
recvmsg(int, scope msghdr
*, int);
1760 ssize_t
send(int, const scope void*, size_t
, int);
1761 ssize_t
sendmsg(int, const scope msghdr
*, int);
1762 ssize_t
sendto(int, const scope void*, size_t
, int, const scope sockaddr
*, socklen_t
);
1763 int setsockopt(int, int, int, const scope void*, socklen_t
);
1764 int shutdown(int, int) @safe;
1765 int socket(int, int, int) @safe;
1766 int sockatmark(int) @safe;
1767 int socketpair(int, int, int, ref int[2]) @safe;
1769 else version (CRuntime_Bionic
)
1771 int accept(int, scope sockaddr
*, scope socklen_t
*);
1772 int bind(int, const scope sockaddr
*, socklen_t
);
1773 int connect(int, const scope sockaddr
*, socklen_t
);
1774 int getpeername(int, scope sockaddr
*, scope socklen_t
*);
1775 int getsockname(int, scope sockaddr
*, scope socklen_t
*);
1776 int getsockopt(int, int, int, scope void*, scope socklen_t
*);
1777 int listen(int, int) @safe;
1778 ssize_t
recv(int, scope void*, size_t
, int);
1779 ssize_t
recvfrom(int, scope void*, size_t
, int, scope sockaddr
*, scope socklen_t
*);
1780 int recvmsg(int, scope msghdr
*, int);
1781 ssize_t
send(int, const scope void*, size_t
, int);
1782 int sendmsg(int, const scope msghdr
*, int);
1783 ssize_t
sendto(int, const scope void*, size_t
, int, const scope sockaddr
*, socklen_t
);
1784 int setsockopt(int, int, int, const scope void*, socklen_t
);
1785 int shutdown(int, int) @safe;
1786 int socket(int, int, int) @safe;
1787 int sockatmark(int) @safe;
1788 int socketpair(int, int, int, ref int[2]) @safe;
1790 else version (CRuntime_Musl
)
1792 int accept(int, sockaddr
*, socklen_t
*);
1793 int bind(int, const scope sockaddr
*, socklen_t
);
1794 int connect(int, const scope sockaddr
*, socklen_t
);
1795 int getpeername(int, sockaddr
*, socklen_t
*);
1796 int getsockname(int, sockaddr
*, socklen_t
*);
1797 int getsockopt(int, int, int, void*, socklen_t
*);
1798 int listen(int, int);
1799 ssize_t
recv(int, void*, size_t
, int);
1800 ssize_t
recvfrom(int, void*, size_t
, int, sockaddr
*, socklen_t
*);
1801 ssize_t
recvmsg(int, msghdr
*, int);
1802 ssize_t
send(int, const scope void*, size_t
, int);
1803 ssize_t
sendmsg(int, const scope msghdr
*, int);
1804 ssize_t
sendto(int, const scope void*, size_t
, int, const scope sockaddr
*, socklen_t
);
1805 int setsockopt(int, int, int, const scope void*, socklen_t
);
1806 int shutdown(int, int);
1807 int socket(int, int, int);
1808 int sockatmark(int);
1809 int socketpair(int, int, int, ref int[2]);
1811 else version (CRuntime_UClibc
)
1813 int accept(int, sockaddr
*, socklen_t
*);
1814 int bind(int, const scope sockaddr
*, socklen_t
);
1815 int connect(int, const scope sockaddr
*, socklen_t
);
1816 int getpeername(int, sockaddr
*, socklen_t
*);
1817 int getsockname(int, sockaddr
*, socklen_t
*);
1818 int getsockopt(int, int, int, void*, socklen_t
*);
1819 int listen(int, int);
1820 ssize_t
recv(int, void*, size_t
, int);
1821 ssize_t
recvfrom(int, void*, size_t
, int, sockaddr
*, socklen_t
*);
1822 ssize_t
recvmsg(int, msghdr
*, int);
1823 ssize_t
send(int, const scope void*, size_t
, int);
1824 ssize_t
sendmsg(int, const scope msghdr
*, int);
1825 ssize_t
sendto(int, const scope void*, size_t
, int, const scope sockaddr
*, socklen_t
);
1826 int setsockopt(int, int, int, const scope void*, socklen_t
);
1827 int shutdown(int, int);
1828 int socket(int, int, int);
1829 int sockatmark(int);
1830 int socketpair(int, int, int, ref int[2]);
1834 static assert(false, "Unsupported platform");
1851 else version (Darwin
)
1858 else version (FreeBSD
)
1865 else version (NetBSD
)
1872 else version (OpenBSD
)
1879 else version (DragonFlyBSD
)
1886 else version (Solaris
)
1895 static assert(false, "Unsupported platform");
1912 else version (Darwin
)
1919 else version (FreeBSD
)
1926 else version (NetBSD
)
1933 else version (OpenBSD
)
1940 else version (DragonFlyBSD
)
1947 else version (Solaris
)
1956 static assert(false, "Unsupported platform");