]> git.ipfire.org Git - thirdparty/gcc.git/blame - libphobos/libdruntime/core/sys/posix/sys/socket.d
d: Merge upstream dmd 3982604c5, druntime bc58b1e9, phobos 12329adb6.
[thirdparty/gcc.git] / libphobos / libdruntime / core / sys / posix / sys / socket.d
CommitLineData
b4c522fa
IB
1/**
2 * D header file for POSIX.
3 *
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
8 */
9
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)
14 */
15module core.sys.posix.sys.socket;
16
92dd3e71 17import core.sys.posix.config;
b4c522fa
IB
18public import core.sys.posix.sys.types; // for ssize_t
19public import core.sys.posix.sys.uio; // for iovec
20
21version (OSX)
22 version = Darwin;
23else version (iOS)
24 version = Darwin;
25else version (TVOS)
26 version = Darwin;
27else version (WatchOS)
28 version = Darwin;
29
15684250
IB
30version (ARM) version = ARM_Any;
31version (AArch64) version = ARM_Any;
50deb970 32version (HPPA) version = HPPA_Any;
15684250
IB
33version (MIPS32) version = MIPS_Any;
34version (MIPS64) version = MIPS_Any;
35version (PPC) version = PPC_Any;
36version (PPC64) version = PPC_Any;
5a5129a0
IB
37version (RISCV32) version = RISCV_Any;
38version (RISCV64) version = RISCV_Any;
15684250
IB
39version (S390) version = IBMZ_Any;
40version (SPARC) version = SPARC_Any;
41version (SPARC64) version = SPARC_Any;
42version (SystemZ) version = IBMZ_Any;
43version (X86) version = X86_Any;
44version (X86_64) version = X86_Any;
45
b4c522fa
IB
46version (Posix):
47extern (C) nothrow @nogc:
92dd3e71 48@system:
b4c522fa
IB
49
50//
51// Required
52//
53/*
54socklen_t
55sa_family_t
56
57struct sockaddr
58{
59 sa_family_t sa_family;
60 char sa_data[];
61}
62
63struct sockaddr_storage
64{
65 sa_family_t ss_family;
66}
67
68struct msghdr
69{
70 void* msg_name;
71 socklen_t msg_namelen;
72 struct iovec* msg_iov;
73 int msg_iovlen;
74 void* msg_control;
75 socklen_t msg_controllen;
76 int msg_flags;
77}
78
79struct iovec {} // from core.sys.posix.sys.uio
80
81struct cmsghdr
82{
83 socklen_t cmsg_len;
84 int cmsg_level;
85 int cmsg_type;
86}
87
88SCM_RIGHTS
89
90CMSG_DATA(cmsg)
91CMSG_NXTHDR(mhdr,cmsg)
92CMSG_FIRSTHDR(mhdr)
93
94struct linger
95{
96 int l_onoff;
97 int l_linger;
98}
99
100SOCK_DGRAM
101SOCK_SEQPACKET
102SOCK_STREAM
103
104SOL_SOCKET
105
106SO_ACCEPTCONN
107SO_BROADCAST
108SO_DEBUG
109SO_DONTROUTE
110SO_ERROR
111SO_KEEPALIVE
112SO_LINGER
113SO_OOBINLINE
114SO_RCVBUF
115SO_RCVLOWAT
116SO_RCVTIMEO
117SO_REUSEADDR
118SO_SNDBUF
119SO_SNDLOWAT
120SO_SNDTIMEO
121SO_TYPE
122
123SOMAXCONN
124
125MSG_CTRUNC
126MSG_DONTROUTE
127MSG_EOR
128MSG_OOB
129MSG_PEEK
130MSG_TRUNC
131MSG_WAITALL
132
133AF_INET
134AF_UNIX
135AF_UNSPEC
136
137SHUT_RD
138SHUT_RDWR
139SHUT_WR
140
141int accept(int, sockaddr*, socklen_t*);
92dd3e71
IB
142int bind(int, const scope sockaddr*, socklen_t);
143int connect(int, const scope sockaddr*, socklen_t);
b4c522fa
IB
144int getpeername(int, sockaddr*, socklen_t*);
145int getsockname(int, sockaddr*, socklen_t*);
146int getsockopt(int, int, int, void*, socklen_t*);
147int listen(int, int);
148ssize_t recv(int, void*, size_t, int);
149ssize_t recvfrom(int, void*, size_t, int, sockaddr*, socklen_t*);
150ssize_t recvmsg(int, msghdr*, int);
92dd3e71
IB
151ssize_t send(int, const scope void*, size_t, int);
152ssize_t sendmsg(int, const scope msghdr*, int);
153ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
154int setsockopt(int, int, int, const scope void*, socklen_t);
b4c522fa
IB
155int shutdown(int, int);
156int socket(int, int, int);
157int sockatmark(int);
158int socketpair(int, int, int, ref int[2]);
159*/
160
161version (CRuntime_Glibc)
162{
163 // Some of the constants below and from the Bionic section are really from
164 // the linux kernel headers.
165 alias uint socklen_t;
166 alias ushort sa_family_t;
167
168 struct sockaddr
169 {
170 sa_family_t sa_family;
171 byte[14] sa_data;
172 }
173
174 private enum : size_t
175 {
176 _SS_SIZE = 128,
177 _SS_PADSIZE = _SS_SIZE - (c_ulong.sizeof * 2)
178 }
179
180 struct sockaddr_storage
181 {
182 sa_family_t ss_family;
183 c_ulong __ss_align;
184 byte[_SS_PADSIZE] __ss_padding;
185 }
186
187 struct msghdr
188 {
189 void* msg_name;
190 socklen_t msg_namelen;
191 iovec* msg_iov;
192 size_t msg_iovlen;
193 void* msg_control;
194 size_t msg_controllen;
195 int msg_flags;
196 }
197
198 struct cmsghdr
199 {
200 size_t cmsg_len;
201 int cmsg_level;
202 int cmsg_type;
203 static if ( false /* (!is( __STRICT_ANSI__ ) && __GNUC__ >= 2) || __STDC_VERSION__ >= 199901L */ )
204 {
205 ubyte[1] __cmsg_data;
206 }
207 }
208
209 enum : uint
210 {
211 SCM_RIGHTS = 0x01
212 }
213
214 static if ( false /* (!is( __STRICT_ANSI__ ) && __GNUC__ >= 2) || __STDC_VERSION__ >= 199901L */ )
215 {
216 extern (D) ubyte[1] CMSG_DATA( cmsghdr* cmsg ) pure nothrow @nogc { return cmsg.__cmsg_data; }
217 }
218 else
219 {
9c7d5e88 220 extern (D) inout(ubyte)* CMSG_DATA( return scope inout(cmsghdr)* cmsg ) pure nothrow @nogc { return cast(ubyte*)( cmsg + 1 ); }
b4c522fa
IB
221 }
222
223 private inout(cmsghdr)* __cmsg_nxthdr(inout(msghdr)*, inout(cmsghdr)*) pure nothrow @nogc;
224 extern (D) inout(cmsghdr)* CMSG_NXTHDR(inout(msghdr)* msg, inout(cmsghdr)* cmsg) pure nothrow @nogc
225 {
226 return __cmsg_nxthdr(msg, cmsg);
227 }
228
229 extern (D) inout(cmsghdr)* CMSG_FIRSTHDR( inout(msghdr)* mhdr ) pure nothrow @nogc
230 {
231 return ( cast(size_t)mhdr.msg_controllen >= cmsghdr.sizeof
232 ? cast(inout(cmsghdr)*) mhdr.msg_control
233 : cast(inout(cmsghdr)*) null );
234 }
235
236 extern (D)
237 {
238 size_t CMSG_ALIGN( size_t len ) pure nothrow @nogc
239 {
240 return (len + size_t.sizeof - 1) & cast(size_t) (~(size_t.sizeof - 1));
241 }
242
243 size_t CMSG_LEN( size_t len ) pure nothrow @nogc
244 {
245 return CMSG_ALIGN(cmsghdr.sizeof) + len;
246 }
247 }
248
249 extern (D) size_t CMSG_SPACE(size_t len) pure nothrow @nogc
250 {
251 return CMSG_ALIGN(len) + CMSG_ALIGN(cmsghdr.sizeof);
252 }
253
254 struct linger
255 {
256 int l_onoff;
257 int l_linger;
258 }
259
15684250 260 version (X86_Any)
b4c522fa
IB
261 {
262 enum
263 {
264 SOCK_DGRAM = 2,
265 SOCK_SEQPACKET = 5,
266 SOCK_STREAM = 1
267 }
268
269 enum
270 {
271 SOL_SOCKET = 1
272 }
273
274 enum
275 {
276 SO_ACCEPTCONN = 30,
277 SO_BROADCAST = 6,
278 SO_DEBUG = 1,
279 SO_DONTROUTE = 5,
280 SO_ERROR = 4,
281 SO_KEEPALIVE = 9,
282 SO_LINGER = 13,
283 SO_OOBINLINE = 10,
284 SO_RCVBUF = 8,
285 SO_RCVLOWAT = 18,
286 SO_RCVTIMEO = 20,
287 SO_REUSEADDR = 2,
288 SO_REUSEPORT = 15,
289 SO_SNDBUF = 7,
290 SO_SNDLOWAT = 19,
291 SO_SNDTIMEO = 21,
292 SO_TYPE = 3
293 }
294 }
50deb970
IB
295 else version (HPPA_Any)
296 {
297 enum
298 {
299 SOCK_DGRAM = 2,
300 SOCK_SEQPACKET = 5,
301 SOCK_STREAM = 1,
302 }
303
304 enum
305 {
306 SOL_SOCKET = 0xffff
307 }
308
309 enum
310 {
311 SO_ACCEPTCONN = 0x401c,
312 SO_BROADCAST = 0x0020,
313 SO_DEBUG = 0x0001,
314 SO_DONTROUTE = 0x0010,
315 SO_ERROR = 0x1007,
316 SO_KEEPALIVE = 0x0008,
317 SO_LINGER = 0x0080,
318 SO_OOBINLINE = 0x0100,
319 SO_RCVBUF = 0x1002,
320 SO_RCVLOWAT = 0x1004,
321 SO_RCVTIMEO = 0x1006,
322 SO_REUSEADDR = 0x0004,
323 SO_SNDBUF = 0x1001,
324 SO_SNDLOWAT = 0x1003,
325 SO_SNDTIMEO = 0x1005,
326 SO_TYPE = 0x1008,
327 }
328 }
15684250 329 else version (MIPS_Any)
b4c522fa
IB
330 {
331 enum
332 {
333 SOCK_DGRAM = 1,
334 SOCK_SEQPACKET = 5,
335 SOCK_STREAM = 2,
336 }
337
338 enum
339 {
340 SOL_SOCKET = 0xffff
341 }
342
343 enum
344 {
345 SO_ACCEPTCONN = 0x1009,
346 SO_BROADCAST = 0x0020,
347 SO_DEBUG = 0x0001,
348 SO_DONTROUTE = 0x0010,
349 SO_ERROR = 0x1007,
350 SO_KEEPALIVE = 0x0008,
351 SO_LINGER = 0x0080,
352 SO_OOBINLINE = 0x0100,
353 SO_RCVBUF = 0x1002,
354 SO_RCVLOWAT = 0x1004,
355 SO_RCVTIMEO = 0x1006,
356 SO_REUSEADDR = 0x0004,
357 SO_SNDBUF = 0x1001,
358 SO_SNDLOWAT = 0x1003,
359 SO_SNDTIMEO = 0x1005,
360 SO_TYPE = 0x1008,
361 }
362 }
15684250 363 else version (PPC_Any)
b4c522fa
IB
364 {
365 enum
366 {
367 SOCK_DGRAM = 2,
368 SOCK_SEQPACKET = 5,
369 SOCK_STREAM = 1
370 }
371
372 enum
373 {
374 SOL_SOCKET = 1
375 }
376
377 enum
378 {
379 SO_ACCEPTCONN = 30,
380 SO_BROADCAST = 6,
381 SO_DEBUG = 1,
382 SO_DONTROUTE = 5,
383 SO_ERROR = 4,
384 SO_KEEPALIVE = 9,
385 SO_LINGER = 13,
386 SO_OOBINLINE = 10,
387 SO_RCVBUF = 8,
388 SO_RCVLOWAT = 16,
389 SO_RCVTIMEO = 18,
390 SO_REUSEADDR = 2,
391 SO_SNDBUF = 7,
392 SO_SNDLOWAT = 17,
393 SO_SNDTIMEO = 19,
394 SO_TYPE = 3
395 }
396 }
15684250 397 else version (ARM_Any)
b4c522fa
IB
398 {
399 enum
400 {
401 SOCK_DGRAM = 2,
402 SOCK_SEQPACKET = 5,
403 SOCK_STREAM = 1
404 }
405
406 enum
407 {
408 SOL_SOCKET = 1
409 }
410
411 enum
412 {
413 SO_ACCEPTCONN = 30,
414 SO_BROADCAST = 6,
415 SO_DEBUG = 1,
416 SO_DONTROUTE = 5,
417 SO_ERROR = 4,
418 SO_KEEPALIVE = 9,
419 SO_LINGER = 13,
420 SO_OOBINLINE = 10,
421 SO_RCVBUF = 8,
422 SO_RCVLOWAT = 18,
423 SO_RCVTIMEO = 20,
424 SO_REUSEADDR = 2,
425 SO_REUSEPORT = 15,
426 SO_SNDBUF = 7,
427 SO_SNDLOWAT = 19,
428 SO_SNDTIMEO = 21,
429 SO_TYPE = 3
430 }
431 }
5a5129a0
IB
432 else version (RISCV_Any)
433 {
434 enum
435 {
436 SOCK_DGRAM = 2,
437 SOCK_SEQPACKET = 5,
438 SOCK_STREAM = 1
439 }
440
441 enum
442 {
443 SOL_SOCKET = 1
444 }
445
446 enum
447 {
448 SO_ACCEPTCONN = 30,
449 SO_BROADCAST = 6,
450 SO_DEBUG = 1,
451 SO_DONTROUTE = 5,
452 SO_ERROR = 4,
453 SO_KEEPALIVE = 9,
454 SO_LINGER = 13,
455 SO_OOBINLINE = 10,
456 SO_RCVBUF = 8,
457 SO_RCVLOWAT = 18,
458 SO_RCVTIMEO = 20,
459 SO_REUSEADDR = 2,
460 SO_SNDBUF = 7,
461 SO_SNDLOWAT = 19,
462 SO_SNDTIMEO = 21,
463 SO_TYPE = 3
464 }
465 }
15684250 466 else version (SPARC_Any)
b4c522fa
IB
467 {
468 enum
469 {
470 SOCK_DGRAM = 2,
471 SOCK_SEQPACKET = 5,
472 SOCK_STREAM = 1
473 }
474
475 enum
476 {
477 SOL_SOCKET = 1
478 }
479
480 enum
481 {
482 SO_ACCEPTCONN = 30,
483 SO_BROADCAST = 6,
484 SO_DEBUG = 1,
485 SO_DONTROUTE = 5,
486 SO_ERROR = 4,
487 SO_KEEPALIVE = 9,
488 SO_LINGER = 13,
489 SO_OOBINLINE = 10,
490 SO_RCVBUF = 8,
491 SO_RCVLOWAT = 18,
492 SO_RCVTIMEO = 20,
493 SO_REUSEADDR = 2,
494 SO_SNDBUF = 7,
495 SO_SNDLOWAT = 19,
496 SO_SNDTIMEO = 21,
497 SO_TYPE = 3
498 }
499 }
15684250 500 else version (IBMZ_Any)
b4c522fa
IB
501 {
502 enum
503 {
504 SOCK_DGRAM = 2,
505 SOCK_SEQPACKET = 5,
506 SOCK_STREAM = 1
507 }
508
509 enum
510 {
511 SOL_SOCKET = 1
512 }
513
514 enum
515 {
516 SO_ACCEPTCONN = 30,
517 SO_BROADCAST = 6,
518 SO_DEBUG = 1,
519 SO_DONTROUTE = 5,
520 SO_ERROR = 4,
521 SO_KEEPALIVE = 9,
522 SO_LINGER = 13,
523 SO_OOBINLINE = 10,
524 SO_RCVBUF = 8,
525 SO_RCVLOWAT = 18,
526 SO_RCVTIMEO = 20,
527 SO_REUSEADDR = 2,
528 SO_SNDBUF = 7,
529 SO_SNDLOWAT = 19,
530 SO_SNDTIMEO = 21,
531 SO_TYPE = 3
532 }
533 }
534 else
535 static assert(0, "unimplemented");
536
537 enum
538 {
0fb57034
IB
539 // https://sourceware.org/git/?p=glibc.git;a=commit;f=sysdeps/unix/sysv/linux/bits/socket.h;h=96958e2700f5b4f4d1183a0606b2b9848a53ea44
540 SOMAXCONN = 4096
b4c522fa
IB
541 }
542
543 enum : uint
544 {
545 MSG_CTRUNC = 0x08,
546 MSG_DONTROUTE = 0x04,
547 MSG_EOR = 0x80,
548 MSG_OOB = 0x01,
549 MSG_PEEK = 0x02,
550 MSG_TRUNC = 0x20,
551 MSG_WAITALL = 0x100,
552 MSG_NOSIGNAL = 0x4000
553 }
554
555 enum
556 {
557 AF_APPLETALK = 5,
558 AF_INET = 2,
559 AF_IPX = 4,
560 AF_UNIX = 1,
561 AF_UNSPEC = 0,
562 PF_APPLETALK = AF_APPLETALK,
563 PF_IPX = AF_IPX
564 }
565
566 enum int SOCK_RDM = 4;
567
568 enum
569 {
570 SHUT_RD,
571 SHUT_WR,
572 SHUT_RDWR
573 }
574
575 int accept(int, scope sockaddr*, scope socklen_t*);
92dd3e71
IB
576 int bind(int, const scope sockaddr*, socklen_t);
577 int connect(int, const scope sockaddr*, socklen_t);
b4c522fa
IB
578 int getpeername(int, scope sockaddr*, scope socklen_t*);
579 int getsockname(int, scope sockaddr*, scope socklen_t*);
580 int getsockopt(int, int, int, scope void*, scope socklen_t*);
581 int listen(int, int) @safe;
582 ssize_t recv(int, scope void*, size_t, int);
583 ssize_t recvfrom(int, scope void*, size_t, int, scope sockaddr*, scope socklen_t*);
584 ssize_t recvmsg(int, scope msghdr*, int);
92dd3e71
IB
585 ssize_t send(int, const scope void*, size_t, int);
586 ssize_t sendmsg(int, const scope msghdr*, int);
587 ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
588 int setsockopt(int, int, int, const scope void*, socklen_t);
b4c522fa
IB
589 int shutdown(int, int) @safe;
590 int socket(int, int, int) @safe;
591 int sockatmark(int) @safe;
592 int socketpair(int, int, int, ref int[2]) @safe;
593}
594else version (Darwin)
595{
596 alias uint socklen_t;
597 alias ubyte sa_family_t;
598
599 struct sockaddr
600 {
601 ubyte sa_len;
602 sa_family_t sa_family;
603 byte[14] sa_data;
604 }
605
606 private enum : size_t
607 {
608 _SS_PAD1 = long.sizeof - ubyte.sizeof - sa_family_t.sizeof,
609 _SS_PAD2 = 128 - ubyte.sizeof - sa_family_t.sizeof - _SS_PAD1 - long.sizeof
610 }
611
612 struct sockaddr_storage
613 {
614 ubyte ss_len;
615 sa_family_t ss_family;
616 byte[_SS_PAD1] __ss_pad1;
617 long __ss_align;
618 byte[_SS_PAD2] __ss_pad2;
619 }
620
621 struct msghdr
622 {
623 void* msg_name;
624 socklen_t msg_namelen;
625 iovec* msg_iov;
626 int msg_iovlen;
627 void* msg_control;
628 socklen_t msg_controllen;
629 int msg_flags;
630 }
631
632 struct cmsghdr
633 {
634 socklen_t cmsg_len;
635 int cmsg_level;
636 int cmsg_type;
637 }
638
639 enum : uint
640 {
641 SCM_RIGHTS = 0x01
642 }
643
644 /+
645 CMSG_DATA(cmsg) ((unsigned char *)(cmsg) + \
646 ALIGN(sizeof(struct cmsghdr)))
647 CMSG_NXTHDR(mhdr, cmsg) \
648 (((unsigned char *)(cmsg) + ALIGN((cmsg)->cmsg_len) + \
649 ALIGN(sizeof(struct cmsghdr)) > \
650 (unsigned char *)(mhdr)->msg_control +(mhdr)->msg_controllen) ? \
651 (struct cmsghdr *)0 /* NULL */ : \
652 (struct cmsghdr *)((unsigned char *)(cmsg) + ALIGN((cmsg)->cmsg_len)))
653 CMSG_FIRSTHDR(mhdr) ((struct cmsghdr *)(mhdr)->msg_control)
654 +/
655
656 struct linger
657 {
658 int l_onoff;
659 int l_linger;
660 }
661
662 enum
663 {
664 SOCK_DGRAM = 2,
665 SOCK_RDM = 4,
666 SOCK_SEQPACKET = 5,
667 SOCK_STREAM = 1
668 }
669
670 enum : uint
671 {
672 SOL_SOCKET = 0xffff
673 }
674
675 enum : uint
676 {
677 SO_ACCEPTCONN = 0x0002,
678 SO_BROADCAST = 0x0020,
679 SO_DEBUG = 0x0001,
680 SO_DONTROUTE = 0x0010,
681 SO_ERROR = 0x1007,
682 SO_KEEPALIVE = 0x0008,
683 SO_LINGER = 0x1080,
684 SO_NOSIGPIPE = 0x1022, // non-standard
685 SO_OOBINLINE = 0x0100,
686 SO_RCVBUF = 0x1002,
687 SO_RCVLOWAT = 0x1004,
688 SO_RCVTIMEO = 0x1006,
689 SO_REUSEADDR = 0x0004,
690 SO_REUSEPORT = 0x0200,
691 SO_SNDBUF = 0x1001,
692 SO_SNDLOWAT = 0x1003,
693 SO_SNDTIMEO = 0x1005,
694 SO_TYPE = 0x1008
695 }
696
697 enum
698 {
699 SOMAXCONN = 128
700 }
701
702 enum : uint
703 {
704 MSG_CTRUNC = 0x20,
705 MSG_DONTROUTE = 0x4,
706 MSG_EOR = 0x8,
707 MSG_OOB = 0x1,
708 MSG_PEEK = 0x2,
709 MSG_TRUNC = 0x10,
710 MSG_WAITALL = 0x40
711 }
712
713 enum
714 {
715 AF_APPLETALK = 16,
716 AF_INET = 2,
717 AF_IPX = 23,
718 AF_UNIX = 1,
719 AF_UNSPEC = 0,
720 PF_APPLETALK = AF_APPLETALK,
721 PF_IPX = AF_IPX
722 }
723
724 enum
725 {
726 SHUT_RD,
727 SHUT_WR,
728 SHUT_RDWR
729 }
730
731 int accept(int, scope sockaddr*, scope socklen_t*);
92dd3e71
IB
732 int bind(int, const scope sockaddr*, socklen_t);
733 int connect(int, const scope sockaddr*, socklen_t);
b4c522fa
IB
734 int getpeername(int, scope sockaddr*, scope socklen_t*);
735 int getsockname(int, scope sockaddr*, scope socklen_t*);
736 int getsockopt(int, int, int, scope void*, scope socklen_t*);
737 int listen(int, int) @safe;
738 ssize_t recv(int, scope void*, size_t, int);
739 ssize_t recvfrom(int, scope void*, size_t, int, scope sockaddr*, scope socklen_t*);
740 ssize_t recvmsg(int, scope msghdr*, int);
92dd3e71
IB
741 ssize_t send(int, const scope void*, size_t, int);
742 ssize_t sendmsg(int, const scope msghdr*, int);
743 ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
744 int setsockopt(int, int, int, const scope void*, socklen_t);
b4c522fa
IB
745 int shutdown(int, int) @safe;
746 int socket(int, int, int) @safe;
747 int sockatmark(int) @safe;
748 int socketpair(int, int, int, ref int[2]) @safe;
749}
750else version (FreeBSD)
751{
752 alias uint socklen_t;
753 alias ubyte sa_family_t;
754
755 struct sockaddr
756 {
757 ubyte sa_len;
758 sa_family_t sa_family;
759 byte[14] sa_data;
760 }
761
762 private
763 {
764 enum _SS_ALIGNSIZE = long.sizeof;
765 enum _SS_MAXSIZE = 128;
766 enum _SS_PAD1SIZE = _SS_ALIGNSIZE - ubyte.sizeof - sa_family_t.sizeof;
767 enum _SS_PAD2SIZE = _SS_MAXSIZE - ubyte.sizeof - sa_family_t.sizeof - _SS_PAD1SIZE - _SS_ALIGNSIZE;
768 }
769
770 struct sockaddr_storage
771 {
772 ubyte ss_len;
773 sa_family_t ss_family;
774 byte[_SS_PAD1SIZE] __ss_pad1;
775 long __ss_align;
776 byte[_SS_PAD2SIZE] __ss_pad2;
777 }
778
779 struct msghdr
780 {
781 void* msg_name;
782 socklen_t msg_namelen;
783 iovec* msg_iov;
784 int msg_iovlen;
785 void* msg_control;
786 socklen_t msg_controllen;
787 int msg_flags;
788 }
789
790 struct cmsghdr
791 {
792 socklen_t cmsg_len;
793 int cmsg_level;
794 int cmsg_type;
795 }
796
797 enum : uint
798 {
799 SCM_RIGHTS = 0x01
800 }
801
802 private // <machine/param.h>
803 {
804 enum _ALIGNBYTES = /+c_int+/ int.sizeof - 1;
805 extern (D) size_t _ALIGN( size_t p ) { return (p + _ALIGNBYTES) & ~_ALIGNBYTES; }
806 }
807
808 extern (D) ubyte* CMSG_DATA( cmsghdr* cmsg )
809 {
810 return cast(ubyte*) cmsg + _ALIGN( cmsghdr.sizeof );
811 }
812
813 extern (D) cmsghdr* CMSG_NXTHDR( msghdr* mhdr, cmsghdr* cmsg )
814 {
815 if ( cmsg == null )
816 {
817 return CMSG_FIRSTHDR( mhdr );
818 }
819 else
820 {
821 if ( cast(ubyte*) cmsg + _ALIGN( cmsg.cmsg_len ) + _ALIGN( cmsghdr.sizeof ) >
822 cast(ubyte*) mhdr.msg_control + mhdr.msg_controllen )
823 return null;
824 else
825 return cast(cmsghdr*) (cast(ubyte*) cmsg + _ALIGN( cmsg.cmsg_len ));
826 }
827 }
828
829 extern (D) cmsghdr* CMSG_FIRSTHDR( msghdr* mhdr )
830 {
831 return mhdr.msg_controllen >= cmsghdr.sizeof ? cast(cmsghdr*) mhdr.msg_control : null;
832 }
833
834 struct linger
835 {
836 int l_onoff;
837 int l_linger;
838 }
839
840 enum
841 {
842 SOCK_DGRAM = 2,
843 SOCK_RDM = 4,
844 SOCK_SEQPACKET = 5,
845 SOCK_STREAM = 1
846 }
847
848 enum : uint
849 {
850 SOL_SOCKET = 0xffff
851 }
852
853 enum : uint
854 {
855 SO_ACCEPTCONN = 0x0002,
856 SO_BROADCAST = 0x0020,
857 SO_DEBUG = 0x0001,
858 SO_DONTROUTE = 0x0010,
859 SO_ERROR = 0x1007,
860 SO_KEEPALIVE = 0x0008,
861 SO_LINGER = 0x0080,
862 SO_NOSIGPIPE = 0x0800, // non-standard
863 SO_OOBINLINE = 0x0100,
864 SO_RCVBUF = 0x1002,
865 SO_RCVLOWAT = 0x1004,
866 SO_RCVTIMEO = 0x1006,
867 SO_REUSEADDR = 0x0004,
868 SO_REUSEPORT = 0x0200,
869 SO_SNDBUF = 0x1001,
870 SO_SNDLOWAT = 0x1003,
871 SO_SNDTIMEO = 0x1005,
872 SO_TYPE = 0x1008
873 }
874
875 enum
876 {
877 SOMAXCONN = 128
878 }
879
880 enum : uint
881 {
882 MSG_CTRUNC = 0x20,
883 MSG_DONTROUTE = 0x4,
884 MSG_EOR = 0x8,
885 MSG_OOB = 0x1,
886 MSG_PEEK = 0x2,
887 MSG_TRUNC = 0x10,
888 MSG_WAITALL = 0x40,
889 MSG_NOSIGNAL = 0x20000
890 }
891
892 enum
893 {
894 AF_APPLETALK = 16,
895 AF_INET = 2,
896 AF_IPX = 23,
897 AF_UNIX = 1,
898 AF_UNSPEC = 0
899 }
900
901 enum
902 {
903 SHUT_RD = 0,
904 SHUT_WR = 1,
905 SHUT_RDWR = 2
906 }
907
908 int accept(int, scope sockaddr*, scope socklen_t*);
92dd3e71
IB
909 int bind(int, const scope sockaddr*, socklen_t);
910 int connect(int, const scope sockaddr*, socklen_t);
b4c522fa
IB
911 int getpeername(int, scope sockaddr*, scope socklen_t*);
912 int getsockname(int, scope sockaddr*, scope socklen_t*);
913 int getsockopt(int, int, int, scope void*, scope socklen_t*);
914 int listen(int, int) @safe;
915 ssize_t recv(int, scope void*, size_t, int);
916 ssize_t recvfrom(int, scope void*, size_t, int, scope sockaddr*, scope socklen_t*);
917 ssize_t recvmsg(int, scope msghdr*, int);
92dd3e71
IB
918 ssize_t send(int, const scope void*, size_t, int);
919 ssize_t sendmsg(int, const scope msghdr*, int);
920 ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
921 int setsockopt(int, int, int, const scope void*, socklen_t);
b4c522fa
IB
922 int shutdown(int, int) @safe;
923 int socket(int, int, int) @safe;
924 int sockatmark(int) @safe;
925 int socketpair(int, int, int, ref int[2]) @safe;
926}
927else version (NetBSD)
928{
929 alias uint socklen_t;
930 alias ubyte sa_family_t;
931
932 struct sockaddr
933 {
934 ubyte sa_len;
935 sa_family_t sa_family;
936 byte[14] sa_data;
937 }
938
939 private
940 {
941 enum _SS_ALIGNSIZE = long.sizeof;
942 enum _SS_MAXSIZE = 128;
943 enum _SS_PAD1SIZE = _SS_ALIGNSIZE - ubyte.sizeof - sa_family_t.sizeof;
944 enum _SS_PAD2SIZE = _SS_MAXSIZE - ubyte.sizeof - sa_family_t.sizeof - _SS_PAD1SIZE - _SS_ALIGNSIZE;
945 }
946
947 struct sockaddr_storage
948 {
949 ubyte ss_len;
950 sa_family_t ss_family;
951 byte[_SS_PAD1SIZE] __ss_pad1;
952 long __ss_align;
953 byte[_SS_PAD2SIZE] __ss_pad2;
954 }
955
956 struct msghdr
957 {
958 void* msg_name;
959 socklen_t msg_namelen;
960 iovec* msg_iov;
961 int msg_iovlen;
962 void* msg_control;
963 socklen_t msg_controllen;
964 int msg_flags;
965 }
966
967 struct cmsghdr
968 {
969 socklen_t cmsg_len;
970 int cmsg_level;
971 int cmsg_type;
972 }
973
974 enum : uint
975 {
976 SCM_RIGHTS = 0x01
977 }
978
979 private // <machine/param.h>
980 {
981 enum _ALIGNBYTES = /+c_int+/ int.sizeof - 1;
982 extern (D) size_t _ALIGN( size_t p ) { return (p + _ALIGNBYTES) & ~_ALIGNBYTES; }
983 }
984
985 extern (D) ubyte* CMSG_DATA( cmsghdr* cmsg )
986 {
987 return cast(ubyte*) cmsg + _ALIGN( cmsghdr.sizeof );
988 }
989
990 extern (D) cmsghdr* CMSG_NXTHDR( msghdr* mhdr, cmsghdr* cmsg )
991 {
992 if ( cmsg == null )
993 {
994 return CMSG_FIRSTHDR( mhdr );
995 }
996 else
997 {
998 if ( cast(ubyte*) cmsg + _ALIGN( cmsg.cmsg_len ) + _ALIGN( cmsghdr.sizeof ) >
999 cast(ubyte*) mhdr.msg_control + mhdr.msg_controllen )
1000 return null;
1001 else
1002 return cast(cmsghdr*) (cast(ubyte*) cmsg + _ALIGN( cmsg.cmsg_len ));
1003 }
1004 }
1005
1006 extern (D) cmsghdr* CMSG_FIRSTHDR( msghdr* mhdr )
1007 {
1008 return mhdr.msg_controllen >= cmsghdr.sizeof ? cast(cmsghdr*) mhdr.msg_control : null;
1009 }
1010
1011 struct linger
1012 {
1013 int l_onoff;
1014 int l_linger;
1015 }
1016
1017 enum
1018 {
1019 SOCK_DGRAM = 2,
1020 SOCK_RDM = 4,
1021 SOCK_SEQPACKET = 5,
1022 SOCK_STREAM = 1
1023 }
1024
1025 enum : uint
1026 {
1027 SOL_SOCKET = 0xffff
1028 }
1029
1030 enum : uint
1031 {
1032 SO_DEBUG = 0x0001, /* turn on debugging info recording */
1033 SO_ACCEPTCONN = 0x0002, /* socket has had listen() */
1034 SO_REUSEADDR = 0x0004, /* allow local address reuse */
1035 SO_KEEPALIVE = 0x0008, /* keep connections alive */
1036 SO_DONTROUTE = 0x0010, /* just use interface addresses */
1037 SO_BROADCAST = 0x0020, /* permit sending of broadcast msgs */
1038 SO_USELOOPBACK = 0x0040, /* bypass hardware when possible */
1039 SO_LINGER = 0x0080, /* linger on close if data present */
1040 SO_OOBINLINE = 0x0100, /* leave received OOB data in line */
1041 SO_REUSEPORT = 0x0200, /* allow local address & port reuse */
1042 /* SO_OTIMESTAMP 0x0400 */
1043 SO_NOSIGPIPE = 0x0800, /* no SIGPIPE from EPIPE */
1044 SO_ACCEPTFILTER = 0x1000, /* there is an accept filter */
1045 SO_TIMESTAMP = 0x2000, /* timestamp received dgram traffic */
1046
1047 /*
1048 * Additional options, not kept in so_options.
1049 */
1050 SO_SNDBUF = 0x1001, /* send buffer size */
1051 SO_RCVBUF = 0x1002, /* receive buffer size */
1052 SO_SNDLOWAT = 0x1003, /* send low-water mark */
1053 SO_RCVLOWAT = 0x1004, /* receive low-water mark */
1054 /* SO_OSNDTIMEO 0x1005 */
1055 /* SO_ORCVTIMEO 0x1006 */
1056 SO_ERROR = 0x1007, /* get error status and clear */
1057 SO_TYPE = 0x1008, /* get socket type */
1058 SO_OVERFLOWED = 0x1009, /* datagrams: return packets dropped */
1059
1060 SO_NOHEADER = 0x100a, /* user supplies no header to kernel;
1061 * kernel removes header and supplies
1062 * payload
1063 */
1064 SO_SNDTIMEO = 0x100b, /* send timeout */
1065 SO_RCVTIMEO = 0x100c /* receive timeout */
1066
1067 }
1068
1069 enum
1070 {
1071 SOMAXCONN = 128
1072 }
1073
1074 enum : uint
1075 {
1076 MSG_OOB = 0x0001, /* process out-of-band data */
1077 MSG_PEEK = 0x0002, /* peek at incoming message */
1078 MSG_DONTROUTE = 0x0004, /* send without using routing tables */
1079 MSG_EOR = 0x0008, /* data completes record */
1080 MSG_TRUNC = 0x0010, /* data discarded before delivery */
1081 MSG_CTRUNC = 0x0020, /* control data lost before delivery */
1082 MSG_WAITALL = 0x0040, /* wait for full request or error */
1083 MSG_DONTWAIT = 0x0080, /* this message should be nonblocking */
1084 MSG_BCAST = 0x0100, /* this message was rcvd using link-level brdcst */
1085 MSG_MCAST = 0x0200, /* this message was rcvd using link-level mcast */
1086 MSG_NOSIGNAL = 0x0400 /* do not generate SIGPIPE on EOF */
1087 }
1088
1089 enum
1090 {
1091 AF_APPLETALK = 16,
1092 AF_INET = 2,
1093 AF_IPX = 23,
1094 AF_UNIX = 1,
1095 AF_UNSPEC = 0
1096 }
1097
1098 enum
1099 {
1100 SHUT_RD = 0,
1101 SHUT_WR = 1,
1102 SHUT_RDWR = 2
1103 }
1104
1105 int accept(int, scope sockaddr*, scope socklen_t*);
92dd3e71
IB
1106 int bind(int, const scope sockaddr*, socklen_t);
1107 int connect(int, const scope sockaddr*, socklen_t);
b4c522fa
IB
1108 int getpeername(int, scope sockaddr*, scope socklen_t*);
1109 int getsockname(int, scope sockaddr*, scope socklen_t*);
1110 int getsockopt(int, int, int, scope void*, scope socklen_t*);
1111 int listen(int, int) @safe;
1112 ssize_t recv(int, scope void*, size_t, int);
1113 ssize_t recvfrom(int, scope void*, size_t, int, scope sockaddr*, scope socklen_t*);
1114 ssize_t recvmsg(int, scope msghdr*, int);
92dd3e71
IB
1115 ssize_t send(int, const scope void*, size_t, int);
1116 ssize_t sendmsg(int, const scope msghdr*, int);
1117 ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
1118 int setsockopt(int, int, int, const scope void*, socklen_t);
b4c522fa
IB
1119 int shutdown(int, int) @safe;
1120 int socket(int, int, int) @safe;
1121 int sockatmark(int) @safe;
1122 int socketpair(int, int, int, ref int[2]) @safe;
1123}
0234a917
IB
1124else version (OpenBSD)
1125{
1126 alias uint socklen_t;
1127 alias ubyte sa_family_t;
1128
1129 struct sockaddr
1130 {
1131 ubyte sa_len;
1132 sa_family_t sa_family;
1133 byte[14] sa_data;
1134 }
1135
1136 struct sockaddr_storage
1137 {
1138 ubyte ss_len;
1139 sa_family_t ss_family;
1140 byte[6] __ss_pad1;
1141 long __ss_align;
1142 byte[240] __ss_pad2;
1143 }
1144
1145 struct msghdr
1146 {
1147 void* msg_name;
1148 socklen_t msg_namelen;
1149 iovec* msg_iov;
1150 uint msg_iovlen;
1151 void* msg_control;
1152 socklen_t msg_controllen;
1153 int msg_flags;
1154 }
1155
1156 struct cmsghdr
1157 {
1158 socklen_t cmsg_len;
1159 int cmsg_level;
1160 int cmsg_type;
1161 }
1162
1163 enum : uint
1164 {
1165 SCM_RIGHTS = 0x01
1166 }
1167
1168 private // <sys/_types.h>
1169 {
1170 extern (D) size_t _ALIGN(size_t p) { return (p + _ALIGNBYTES) & ~_ALIGNBYTES; }
1171 }
1172
1173 extern (D) ubyte* CMSG_DATA(cmsghdr* cmsg)
1174 {
1175 return cast(ubyte*) cmsg + _ALIGN(cmsghdr.sizeof);
1176 }
1177
1178 extern (D) cmsghdr* CMSG_NXTHDR(msghdr* mhdr, cmsghdr* cmsg)
1179 {
1180 if (cast(ubyte*) cmsg + _ALIGN(cmsg.cmsg_len) + _ALIGN(cmsghdr.sizeof) >
1181 cast(ubyte*) mhdr.msg_control + mhdr.msg_controllen)
1182 return null;
1183 else
1184 return cast(cmsghdr*) (cast(ubyte*) cmsg + _ALIGN(cmsg.cmsg_len));
1185 }
1186
1187 extern (D) cmsghdr* CMSG_FIRSTHDR(msghdr* mhdr)
1188 {
1189 return mhdr.msg_controllen >= cmsghdr.sizeof ? cast(cmsghdr*) mhdr.msg_control : null;
1190 }
1191
1192 struct linger
1193 {
1194 int l_onoff;
1195 int l_linger;
1196 }
1197
1198 enum
1199 {
1200 SOCK_DGRAM = 2,
1201 SOCK_RDM = 4,
1202 SOCK_SEQPACKET = 5,
1203 SOCK_STREAM = 1
1204 }
1205
1206 enum : uint
1207 {
1208 SOL_SOCKET = 0xffff
1209 }
1210
1211 enum : uint
1212 {
1213 SO_DEBUG = 0x0001,
1214 SO_ACCEPTCONN = 0x0002,
1215 SO_REUSEADDR = 0x0004,
1216 SO_KEEPALIVE = 0x0008,
1217 SO_DONTROUTE = 0x0010,
1218 SO_BROADCAST = 0x0020,
1219 SO_USELOOPBACK = 0x0040,
1220 SO_LINGER = 0x0080,
1221 SO_OOBINLINE = 0x0100,
1222 SO_REUSEPORT = 0x0200,
1223 SO_TIMESTAMP = 0x0800,
1224 SO_BINDANY = 0x1000,
1225 SO_ZEROSIZE = 0x2000,
1226
1227 SO_SNDBUF = 0x1001,
1228 SO_RCVBUF = 0x1002,
1229 SO_SNDLOWAT = 0x1003,
1230 SO_RCVLOWAT = 0x1004,
1231 SO_SNDTIMEO = 0x1005,
1232 SO_RCVTIMEO = 0x1006,
1233 SO_ERROR = 0x1007,
1234 SO_TYPE = 0x1008,
1235 SO_NETPROC = 0x1020,
1236 SO_RTABLE = 0x1021,
1237 SO_PEERCRED = 0x1022,
1238 SO_SPLICE = 0x1023,
1239 }
1240
1241 enum
1242 {
1243 SOMAXCONN = 128
1244 }
1245
1246 enum : uint
1247 {
1248 MSG_OOB = 0x001,
1249 MSG_PEEK = 0x002,
1250 MSG_DONTROUTE = 0x004,
1251 MSG_EOR = 0x008,
1252 MSG_TRUNC = 0x010,
1253 MSG_CTRUNC = 0x020,
1254 MSG_WAITALL = 0x040,
1255 MSG_DONTWAIT = 0x080,
1256 MSG_BCAST = 0x100,
1257 MSG_MCAST = 0x200,
1258 MSG_NOSIGNAL = 0x400,
1259 MSG_CMSG_CLOEXEC = 0x800,
1260 }
1261
1262 enum
1263 {
1264 AF_APPLETALK = 16,
1265 AF_INET = 2,
1266 AF_IPX = 23,
1267 AF_UNIX = 1,
1268 AF_UNSPEC = 0
1269 }
1270
1271 enum
1272 {
1273 SHUT_RD = 0,
1274 SHUT_WR = 1,
1275 SHUT_RDWR = 2
1276 }
1277
1278 int accept(int, scope sockaddr*, scope socklen_t*);
92dd3e71
IB
1279 int bind(int, const scope sockaddr*, socklen_t);
1280 int connect(int, const scope sockaddr*, socklen_t);
0234a917
IB
1281 int getpeername(int, scope sockaddr*, scope socklen_t*);
1282 int getsockname(int, scope sockaddr*, scope socklen_t*);
1283 int getsockopt(int, int, int, scope void*, scope socklen_t*);
1284 int listen(int, int) @safe;
1285 ssize_t recv(int, scope void*, size_t, int);
1286 ssize_t recvfrom(int, scope void*, size_t, int, scope sockaddr*, scope socklen_t*);
1287 ssize_t recvmsg(int, scope msghdr*, int);
92dd3e71
IB
1288 ssize_t send(int, const scope void*, size_t, int);
1289 ssize_t sendmsg(int, const scope msghdr*, int);
1290 ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
1291 int setsockopt(int, int, int, const scope void*, socklen_t);
0234a917
IB
1292 int shutdown(int, int) @safe;
1293 int socket(int, int, int) @safe;
1294 int sockatmark(int) @safe;
1295 int socketpair(int, int, int, ref int[2]) @safe;
1296}
b4c522fa
IB
1297else version (DragonFlyBSD)
1298{
1299 alias uint socklen_t;
1300 alias ubyte sa_family_t;
1301
1302 enum
1303 {
1304 SOCK_STREAM = 1,
1305 SOCK_DGRAM = 2,
1306 //SOCK_RAW = 3, // defined below
1307 SOCK_RDM = 4,
1308 SOCK_SEQPACKET = 5,
1309 }
1310
1311 enum SOCK_CLOEXEC = 0x10000000;
1312 enum SOCK_NONBLOCK = 0x20000000;
1313
1314 enum : uint
1315 {
1316 SO_DEBUG = 0x0001,
1317 SO_ACCEPTCONN = 0x0002,
1318 SO_REUSEADDR = 0x0004,
1319 SO_KEEPALIVE = 0x0008,
1320 SO_DONTROUTE = 0x0010,
1321 SO_BROADCAST = 0x0020,
1322 SO_USELOOPBACK = 0x0040,
1323 SO_LINGER = 0x0080,
1324 SO_OOBINLINE = 0x0100,
1325 SO_REUSEPORT = 0x0200,
1326 SO_TIMESTAMP = 0x0400,
1327 SO_NOSIGPIPE = 0x0800, // non-standard
1328 SO_ACCEPTFILTER = 0x1000,
1329
1330 SO_SNDBUF = 0x1001,
1331 SO_RCVBUF = 0x1002,
1332 SO_SNDLOWAT = 0x1003,
1333 SO_RCVLOWAT = 0x1004,
1334 SO_SNDTIMEO = 0x1005,
1335 SO_RCVTIMEO = 0x1006,
1336 SO_ERROR = 0x1007,
1337 SO_TYPE = 0x1008,
1338 SO_SNDSPACE = 0x100a, // get appr. send buffer free space
1339 SO_CPUHINT = 0x1030, // get socket's owner cpuid hint
1340 }
1341
1342 struct linger
1343 {
1344 int l_onoff;
1345 int l_linger;
1346 }
1347
1348 struct accept_filter_arg {
1349 byte[16] af_name;
1350 byte[256-16] af_arg;
1351 }
1352
1353 enum : uint
1354 {
1355 SOL_SOCKET = 0xffff
1356 }
1357
1358 enum
1359 {
1360 AF_UNSPEC = 0,
1361 AF_LOCAL = 1,
1362 AF_UNIX = AF_LOCAL,
1363 AF_INET = 2,
b4c522fa 1364 AF_APPLETALK = 16,
b4c522fa 1365 AF_IPX = 23,
b4c522fa
IB
1366 }
1367
1368 struct sockaddr
1369 {
1370 ubyte sa_len;
1371 sa_family_t sa_family;
1372 byte[14] sa_data;
1373 }
1374
1375 enum SOCK_MAXADDRLEN = 255;
1376
1377 struct sockproto {
1378 ushort sp_family;
1379 ushort sp_protocol;
1380 }
1381
1382 private
1383 {
1384 enum _SS_ALIGNSIZE = long.sizeof;
1385 enum _SS_MAXSIZE = 128;
1386 enum _SS_PAD1SIZE = _SS_ALIGNSIZE - ubyte.sizeof - sa_family_t.sizeof;
1387 enum _SS_PAD2SIZE = _SS_MAXSIZE - ubyte.sizeof - sa_family_t.sizeof - _SS_PAD1SIZE - _SS_ALIGNSIZE;
1388 }
1389
1390 struct sockaddr_storage
1391 {
1392 ubyte ss_len;
1393 sa_family_t ss_family;
1394 byte[_SS_PAD1SIZE] __ss_pad1;
1395 long __ss_align;
1396 byte[_SS_PAD2SIZE] __ss_pad2;
1397 }
1398
b4c522fa
IB
1399 struct msghdr
1400 {
1401 void* msg_name;
1402 socklen_t msg_namelen;
1403 iovec* msg_iov;
1404 int msg_iovlen;
1405 void* msg_control;
1406 socklen_t msg_controllen;
1407 int msg_flags;
1408 }
1409
1410 enum SOMAXCONN = 128;
1411 enum SOMAXOPT_SIZE = 65536;
1412 enum SOMAXOPT_SIZE0 = (32 * 1024 * 1024);
1413
1414 enum : uint
1415 {
1416 MSG_OOB = 0x00000001,
1417 MSG_PEEK = 0x00000002,
1418 MSG_DONTROUTE = 0x00000004,
1419 MSG_EOR = 0x00000008,
1420 MSG_TRUNC = 0x00000010,
1421 MSG_CTRUNC = 0x00000020,
1422 MSG_WAITALL = 0x00000040,
1423 MSG_DONTWAIT = 0x00000080,
1424 MSG_EOF = 0x00000100,
1425 MSG_UNUSED09 = 0x00000200,
1426 MSG_NOSIGNAL = 0x00000400,
1427 MSG_SYNC = 0x00000800,
1428 MSG_CMSG_CLOEXEC = 0x00001000,
1429 /* These override FIONBIO. MSG_FNONBLOCKING is functionally equivalent to MSG_DONTWAIT.*/
1430 MSG_FBLOCKING = 0x00010000,
1431 MSG_FNONBLOCKING = 0x00020000,
1432 MSG_FMASK = 0xFFFF0000,
1433 }
1434
1435 struct cmsghdr
1436 {
1437 socklen_t cmsg_len;
1438 int cmsg_level;
1439 int cmsg_type;
1440 }
1441
1442 enum CMGROUP_MAX = 16;
1443
1444 struct cmsgcred {
1445 pid_t cmcred_pid;
1446 uid_t cmcred_uid;
1447 uid_t cmcred_euid;
1448 gid_t cmcred_gid;
1449 short cmcred_ngroups;
1450 gid_t[CMGROUP_MAX] cmcred_groups;
92dd3e71 1451 }
b4c522fa
IB
1452
1453 enum : uint
1454 {
1455 SCM_RIGHTS = 0x01
1456 }
1457
1458 private // <machine/param.h>
1459 {
1460 enum _ALIGNBYTES = /+c_int+/ int.sizeof - 1;
1461 extern (D) size_t _ALIGN( size_t p ) { return (p + _ALIGNBYTES) & ~_ALIGNBYTES; }
1462 }
1463
1464 extern (D) ubyte* CMSG_DATA( cmsghdr* cmsg )
1465 {
1466 return cast(ubyte*) cmsg + _ALIGN( cmsghdr.sizeof );
1467 }
1468
1469 extern (D) cmsghdr* CMSG_NXTHDR( msghdr* mhdr, cmsghdr* cmsg )
1470 {
1471 if ( cmsg == null )
1472 {
1473 return CMSG_FIRSTHDR( mhdr );
1474 }
1475 else
1476 {
1477 if ( cast(ubyte*) cmsg + _ALIGN( cmsg.cmsg_len ) + _ALIGN( cmsghdr.sizeof ) >
1478 cast(ubyte*) mhdr.msg_control + mhdr.msg_controllen )
1479 return null;
1480 else
1481 return cast(cmsghdr*) (cast(ubyte*) cmsg + _ALIGN( cmsg.cmsg_len ));
1482 }
1483 }
1484
1485 extern (D) cmsghdr* CMSG_FIRSTHDR( msghdr* mhdr )
1486 {
1487 return mhdr.msg_controllen >= cmsghdr.sizeof ? cast(cmsghdr*) mhdr.msg_control : null;
1488 }
1489
1490 enum
1491 {
1492 SHUT_RD = 0,
1493 SHUT_WR = 1,
1494 SHUT_RDWR = 2
1495 }
1496
1497/*
1498 /+ sendfile(2) header/trailer struct +/
1499 struct sf_hdtr {
1500 iovec * headers;
1501 int hdr_cnt;
1502 iovec * trailers;
1503 int trl_cnt;
92dd3e71 1504 }
b4c522fa
IB
1505*/
1506
1507 int accept(int, sockaddr*, socklen_t*);
1508// int accept4(int, sockaddr*, socklen_t*, int);
92dd3e71
IB
1509 int bind(int, const scope sockaddr*, socklen_t);
1510 int connect(int, const scope sockaddr*, socklen_t);
b4c522fa
IB
1511// int extconnect(int, int, sockaddr*, socklen_t);
1512 int getpeername(int, sockaddr*, socklen_t*);
1513 int getsockname(int, sockaddr*, socklen_t*);
1514 int getsockopt(int, int, int, void*, socklen_t*);
1515 int listen(int, int);
1516 ssize_t recv(int, void*, size_t, int);
1517 ssize_t recvfrom(int, void*, size_t, int, sockaddr*, socklen_t*);
1518 ssize_t recvmsg(int, msghdr*, int);
92dd3e71
IB
1519 ssize_t send(int, const scope void*, size_t, int);
1520 ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
1521 ssize_t sendmsg(int, const scope msghdr*, int);
b4c522fa 1522// int sendfile(int, int, off_t, size_t, sf_hdtr *, off_t *, int);
92dd3e71 1523 int setsockopt(int, int, int, const scope void*, socklen_t);
b4c522fa
IB
1524 int shutdown(int, int);
1525 int sockatmark(int);
1526 int socket(int, int, int);
1527 int socketpair(int, int, int, ref int[2]);
1528// void pfctlinput(int, struct sockaddr *);
1529}
1530else version (Solaris)
1531{
1532 alias uint socklen_t;
1533 alias ushort sa_family_t;
1534
1535 struct sockaddr
1536 {
1537 sa_family_t sa_family;
0da83a16 1538 char[14] sa_data = 0;
b4c522fa
IB
1539 }
1540
1541 alias double sockaddr_maxalign_t;
1542
1543 private
1544 {
1545 enum _SS_ALIGNSIZE = sockaddr_maxalign_t.sizeof;
1546 enum _SS_MAXSIZE = 256;
1547 enum _SS_PAD1SIZE = _SS_ALIGNSIZE - sa_family_t.sizeof;
1548 enum _SS_PAD2SIZE = _SS_MAXSIZE - sa_family_t.sizeof + _SS_PAD1SIZE + _SS_ALIGNSIZE;
1549 }
1550
1551 struct sockaddr_storage
1552 {
1553 sa_family_t ss_family;
0da83a16 1554 char[_SS_PAD1SIZE] _ss_pad1 = void;
b4c522fa 1555 sockaddr_maxalign_t _ss_align;
0da83a16 1556 char[_SS_PAD2SIZE] _ss_pad2 = void;
b4c522fa
IB
1557 }
1558
1559 struct msghdr
1560 {
1561 void* msg_name;
1562 socklen_t msg_namelen;
1563 iovec* msg_iov;
1564 int msg_iovlen;
1565 void* msg_control;
1566 socklen_t msg_controllen;
1567 int msg_flags;
1568 }
1569
1570 struct cmsghdr
1571 {
1572 socklen_t cmsg_len;
1573 int cmsg_level;
1574 int cmsg_type;
1575 }
1576
1577 enum : uint
1578 {
1579 SCM_RIGHTS = 0x1010
1580 }
1581
1582 // FIXME: CMSG_DATA, CMSG_NXTHDR, CMSG_FIRSTHDR missing
1583
1584 struct linger
1585 {
1586 int l_onoff;
1587 int l_linger;
1588 }
1589
1590 enum
1591 {
1592 SOCK_STREAM = 2,
1593 SOCK_DGRAM = 1,
1594 SOCK_RDM = 5,
1595 SOCK_SEQPACKET = 6,
1596 }
1597
1598 enum : uint
1599 {
1600 SOL_SOCKET = 0xffff
1601 }
1602
1603 enum : uint
1604 {
1605 SO_ACCEPTCONN = 0x0002,
1606 SO_BROADCAST = 0x0020,
1607 SO_DEBUG = 0x0001,
1608 SO_DONTROUTE = 0x0010,
1609 SO_ERROR = 0x1007,
1610 SO_KEEPALIVE = 0x0008,
1611 SO_LINGER = 0x0080,
1612 SO_OOBINLINE = 0x0100,
1613 SO_RCVBUF = 0x1002,
1614 SO_RCVLOWAT = 0x1004,
1615 SO_RCVTIMEO = 0x1006,
1616 SO_REUSEADDR = 0x0004,
1617 SO_SNDBUF = 0x1001,
1618 SO_SNDLOWAT = 0x1003,
1619 SO_SNDTIMEO = 0x1005,
1620 SO_TYPE = 0x1008,
1621
1622 SO_USELOOPBACK = 0x0040, // non-standard
1623 SO_DGRAM_ERRIND = 0x0200, // non-standard
1624 SO_RECVUCRED = 0x0400, // non-standard
1625 }
1626
1627 enum
1628 {
1629 SOMAXCONN = 128
1630 }
1631
1632 enum : uint
1633 {
1634 MSG_CTRUNC = 0x10,
1635 MSG_DONTROUTE = 0x4,
1636 MSG_EOR = 0x8,
1637 MSG_OOB = 0x1,
1638 MSG_PEEK = 0x2,
1639 MSG_TRUNC = 0x20,
1640 MSG_WAITALL = 0x40
1641 }
1642
1643 enum
1644 {
1645 AF_IPX = 23,
1646 AF_APPLETALK = 16,
1647 AF_INET = 2,
1648 AF_UNIX = 1,
1649 AF_UNSPEC = 0
1650 }
1651
1652 enum
1653 {
1654 SHUT_RD,
1655 SHUT_WR,
1656 SHUT_RDWR
1657 }
1658
1659 int accept(int, scope sockaddr*, scope socklen_t*);
92dd3e71
IB
1660 int bind(int, const scope sockaddr*, socklen_t);
1661 int connect(int, const scope sockaddr*, socklen_t);
b4c522fa
IB
1662 int getpeername(int, scope sockaddr*, scope socklen_t*);
1663 int getsockname(int, scope sockaddr*, scope socklen_t*);
1664 int getsockopt(int, int, int, scope void*, scope socklen_t*);
1665 int listen(int, int) @safe;
1666 ssize_t recv(int, scope void*, size_t, int);
1667 ssize_t recvfrom(int, scope void*, size_t, int, scope sockaddr*, scope socklen_t*);
1668 ssize_t recvmsg(int, scope msghdr*, int);
92dd3e71
IB
1669 ssize_t send(int, const scope void*, size_t, int);
1670 ssize_t sendmsg(int, const scope msghdr*, int);
1671 ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
1672 int setsockopt(int, int, int, const scope void*, socklen_t);
b4c522fa
IB
1673 int shutdown(int, int) @safe;
1674 int socket(int, int, int) @safe;
1675 int sockatmark(int) @safe;
1676 int socketpair(int, int, int, ref int[2]) @safe;
1677}
1678else version (CRuntime_Bionic)
1679{
1680 alias int socklen_t;
1681 alias ushort sa_family_t;
1682
1683 struct sockaddr
1684 {
1685 sa_family_t sa_family;
1686 byte[14] sa_data;
1687 }
1688
1689 private enum size_t _K_SS_MAXSIZE = 128;
1690
1691 struct sockaddr_storage
1692 {
1693 ushort ss_family;
1694 byte[_K_SS_MAXSIZE - ushort.sizeof] __data;
1695 }
1696
1697 enum : uint
1698 {
1699 SCM_RIGHTS = 0x01
1700 }
1701
1702 private enum _ALIGNBYTES = c_long.sizeof - 1;
1703
1704 extern (D)
1705 {
1706 size_t CMSG_ALIGN( size_t len )
1707 {
1708 return (len + _ALIGNBYTES) & ~_ALIGNBYTES;
1709 }
1710
1711 void* CMSG_DATA( cmsghdr* cmsg )
1712 {
1713 return cast(void*) (cast(char*) cmsg + CMSG_ALIGN( cmsghdr.sizeof ));
1714 }
1715
1716 cmsghdr* CMSG_NXTHDR( msghdr* mhdr, cmsghdr* cmsg )
1717 {
1718 cmsghdr* __ptr = cast(cmsghdr*) ((cast(ubyte*) cmsg) + CMSG_ALIGN(cmsg.cmsg_len));
1719 return cast(c_ulong)( cast(char*)(__ptr+1) - cast(char*) mhdr.msg_control) > mhdr.msg_controllen ? null : __ptr;
1720 }
1721
1722 cmsghdr* CMSG_FIRSTHDR( msghdr* mhdr )
1723 {
1724 return mhdr.msg_controllen >= cmsghdr.sizeof ? cast(cmsghdr*) mhdr.msg_control : null;
1725 }
1726 }
1727
1728 struct linger
1729 {
1730 int l_onoff;
1731 int l_linger;
1732 }
1733
1734 struct msghdr
1735 {
1736 void* msg_name;
1737 int msg_namelen;
1738 iovec* msg_iov;
1739 __kernel_size_t msg_iovlen;
1740 void* msg_control;
1741 __kernel_size_t msg_controllen;
1742 uint msg_flags;
1743 }
1744
1745 struct cmsghdr
1746 {
1747 __kernel_size_t cmsg_len;
1748 int cmsg_level;
1749 int cmsg_type;
1750 }
1751
0da83a16 1752 alias size_t __kernel_size_t;
b4c522fa 1753
0da83a16 1754 enum
b4c522fa 1755 {
0da83a16
IB
1756 SOCK_DGRAM = 2,
1757 SOCK_SEQPACKET = 5,
1758 SOCK_STREAM = 1
b4c522fa 1759 }
b4c522fa 1760
0da83a16
IB
1761 enum
1762 {
1763 SOL_SOCKET = 1
b4c522fa 1764 }
0da83a16
IB
1765
1766 enum
b4c522fa 1767 {
0da83a16
IB
1768 SO_ACCEPTCONN = 30,
1769 SO_BROADCAST = 6,
1770 SO_DEBUG = 1,
1771 SO_DONTROUTE = 5,
1772 SO_ERROR = 4,
1773 SO_KEEPALIVE = 9,
1774 SO_LINGER = 13,
1775 SO_OOBINLINE = 10,
1776 SO_RCVBUF = 8,
1777 SO_RCVLOWAT = 18,
1778 SO_RCVTIMEO = 20,
1779 SO_REUSEADDR = 2,
1780 SO_SNDBUF = 7,
1781 SO_SNDLOWAT = 19,
1782 SO_SNDTIMEO = 21,
1783 SO_TYPE = 3
b4c522fa
IB
1784 }
1785
1786 enum
1787 {
1788 SOMAXCONN = 128
1789 }
1790
1791 enum : uint
1792 {
1793 MSG_CTRUNC = 0x08,
1794 MSG_DONTROUTE = 0x04,
1795 MSG_EOR = 0x80,
1796 MSG_OOB = 0x01,
1797 MSG_PEEK = 0x02,
1798 MSG_TRUNC = 0x20,
1799 MSG_WAITALL = 0x100
1800 }
1801
1802 enum
1803 {
1804 AF_APPLETALK = 5,
1805 AF_INET = 2,
1806 AF_IPX = 4,
1807 AF_UNIX = 1,
1808 AF_UNSPEC = 0
1809 }
1810
1811 enum
1812 {
1813 SHUT_RD,
1814 SHUT_WR,
1815 SHUT_RDWR
1816 }
1817
1818 enum SOCK_RDM = 4;
1819
1820 int accept(int, scope sockaddr*, scope socklen_t*);
92dd3e71
IB
1821 int bind(int, const scope sockaddr*, socklen_t);
1822 int connect(int, const scope sockaddr*, socklen_t);
b4c522fa
IB
1823 int getpeername(int, scope sockaddr*, scope socklen_t*);
1824 int getsockname(int, scope sockaddr*, scope socklen_t*);
1825 int getsockopt(int, int, int, scope void*, scope socklen_t*);
1826 int listen(int, int) @safe;
1827 ssize_t recv(int, scope void*, size_t, int);
1828 ssize_t recvfrom(int, scope void*, size_t, int, scope sockaddr*, scope socklen_t*);
1829 int recvmsg(int, scope msghdr*, int);
92dd3e71
IB
1830 ssize_t send(int, const scope void*, size_t, int);
1831 int sendmsg(int, const scope msghdr*, int);
1832 ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
1833 int setsockopt(int, int, int, const scope void*, socklen_t);
b4c522fa
IB
1834 int shutdown(int, int) @safe;
1835 int socket(int, int, int) @safe;
1836 int sockatmark(int) @safe;
1837 int socketpair(int, int, int, ref int[2]) @safe;
1838}
1839else version (CRuntime_Musl)
1840{
1841 alias uint socklen_t;
1842 alias ushort sa_family_t;
1843
1844 struct sockaddr
1845 {
1846 sa_family_t sa_family;
1847 byte[14] sa_data;
1848 }
1849
1850 private enum : size_t
1851 {
1852 _SS_SIZE = 128,
1853 _SS_PADSIZE = _SS_SIZE - c_ulong.sizeof - sa_family_t.sizeof
1854 }
1855
1856 struct sockaddr_storage
1857 {
1858 sa_family_t ss_family;
1859 byte[_SS_PADSIZE] __ss_padding;
1860 c_ulong __ss_align;
1861 }
1862
1e78c638
IB
1863 enum
1864 {
b4c522fa
IB
1865 SOCK_STREAM = 1,
1866 SOCK_DGRAM = 2,
b4c522fa
IB
1867 SOCK_RDM = 4,
1868 SOCK_SEQPACKET = 5,
1869 SOCK_DCCP = 6,
1870 SOCK_PACKET = 10
1871 }
1872 enum
1873 {
1874 AF_UNSPEC = 0,
1875 AF_LOCAL = 1,
1876 AF_UNIX = AF_LOCAL,
1877 AF_FILE = AF_LOCAL,
1878 AF_INET = 2,
1879 AF_AX25 = 3,
1880 AF_IPX = 4,
1881 AF_APPLETALK = 5,
1882 PF_APPLETALK = AF_APPLETALK,
1883 PF_IPX = AF_IPX
1884 }
1885
1886 enum
1887 {
1888 SHUT_RD,
1889 SHUT_WR,
1890 SHUT_RDWR
1891 }
1892
1893 enum
1894 {
1895 SOL_SOCKET = 1
1896 }
1897
1898 enum
1899 {
6e5084b4
IB
1900 SO_DEBUG = 1
1901 }
1902
1903 version (MIPS_Any)
1904 {
1905 enum
1906 {
1907 SO_REUSEADDR = 0x0004,
1908 SO_TYPE = 0x1008,
1909 SO_ERROR = 0x1007,
1910 SO_DONTROUTE = 0x0010,
1911 SO_BROADCAST = 0x0020,
1912 SO_SNDBUF = 0x1001,
1913 SO_RCVBUF = 0x1002,
1914 SO_KEEPALIVE = 0x0008,
1915 SO_OOBINLINE = 0x0100,
1916 SO_LINGER = 0x0080,
1917 SO_REUSEPORT = 0x0200,
1918 SO_RCVLOWAT = 0x1004,
1919 SO_SNDLOWAT = 0x1003,
1920 SO_RCVTIMEO = 0x1006,
1921 SO_SNDTIMEO = 0x1005,
1922 SO_ACCEPTCONN = 0x1009
1923 }
1924 }
1925 else
1926 {
1927 enum
1928 {
1929 SO_REUSEADDR = 2,
1930 SO_TYPE = 3,
1931 SO_ERROR = 4,
1932 SO_DONTROUTE = 5,
1933 SO_BROADCAST = 6,
1934 SO_SNDBUF = 7,
1935 SO_RCVBUF = 8,
1936 SO_KEEPALIVE = 9,
1937 SO_OOBINLINE = 10,
1938 SO_LINGER = 13,
1939 SO_REUSEPORT = 15,
1940 SO_RCVLOWAT = 18,
1941 SO_SNDLOWAT = 19,
1942 SO_RCVTIMEO = 20,
1943 SO_SNDTIMEO = 21,
1944 SO_ACCEPTCONN = 30
1945 }
b4c522fa
IB
1946 }
1947
1948 enum : uint
1949 {
1950 MSG_OOB = 0x01,
1951 MSG_PEEK = 0x02,
1952 MSG_DONTROUTE = 0x04,
1953 MSG_CTRUNC = 0x08,
1954 MSG_TRUNC = 0x20,
1955 MSG_EOR = 0x80,
1956 MSG_WAITALL = 0x100,
1957 MSG_NOSIGNAL = 0x4000
1958 }
1959
1960 struct linger
1961 {
1962 int l_onoff;
1963 int l_linger;
1964 }
1965 struct msghdr {
1966 void *msg_name;
1967 socklen_t msg_namelen;
1968 iovec *msg_iov;
1969 int msg_iovlen, __pad1;
1970 void *msg_control;
1971 socklen_t msg_controllen, __pad2;
1972 int msg_flags;
1973 }
1974 int accept(int, sockaddr*, socklen_t*);
92dd3e71
IB
1975 int bind(int, const scope sockaddr*, socklen_t);
1976 int connect(int, const scope sockaddr*, socklen_t);
b4c522fa
IB
1977 int getpeername(int, sockaddr*, socklen_t*);
1978 int getsockname(int, sockaddr*, socklen_t*);
1979 int getsockopt(int, int, int, void*, socklen_t*);
1980 int listen(int, int);
1981 ssize_t recv(int, void*, size_t, int);
1982 ssize_t recvfrom(int, void*, size_t, int, sockaddr*, socklen_t*);
1983 ssize_t recvmsg(int, msghdr*, int);
92dd3e71
IB
1984 ssize_t send(int, const scope void*, size_t, int);
1985 ssize_t sendmsg(int, const scope msghdr*, int);
1986 ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
1987 int setsockopt(int, int, int, const scope void*, socklen_t);
b4c522fa
IB
1988 int shutdown(int, int);
1989 int socket(int, int, int);
1990 int sockatmark(int);
1991 int socketpair(int, int, int, ref int[2]);
1992}
1993else version (CRuntime_UClibc)
1994{
1995 alias uint socklen_t;
1996 alias ushort sa_family_t;
1997
1998 struct sockaddr
1999 {
2000 sa_family_t sa_family;
2001 byte[14] sa_data;
2002 }
2003
2004 private enum : size_t
2005 {
2006 _SS_SIZE = 128,
2007 _SS_PADSIZE = _SS_SIZE - (c_ulong.sizeof * 2)
2008 }
2009
2010 struct sockaddr_storage
2011 {
2012 sa_family_t ss_family;
2013 c_ulong __ss_align;
2014 byte[_SS_PADSIZE] __ss_padding;
2015 }
2016
2017 struct msghdr
2018 {
2019 void* msg_name;
2020 socklen_t msg_namelen;
2021 iovec* msg_iov;
2022 size_t msg_iovlen;
2023 void* msg_control;
2024 size_t msg_controllen;
2025 int msg_flags;
2026 }
2027
2028 struct cmsghdr
2029 {
2030 size_t cmsg_len;
2031 int cmsg_level;
2032 int cmsg_type;
2033 }
2034
2035 enum : uint
2036 {
2037 SCM_RIGHTS = 0x01
2038 }
2039
2040 extern (D) inout(ubyte)* CMSG_DATA( inout(cmsghdr)* cmsg ) pure nothrow @nogc { return cast(ubyte*)( cmsg + 1 ); }
2041
2042 private inout(cmsghdr)* __cmsg_nxthdr(inout(msghdr)*, inout(cmsghdr)*) pure nothrow @nogc;
2043 extern (D) inout(cmsghdr)* CMSG_NXTHDR(inout(msghdr)* msg, inout(cmsghdr)* cmsg) pure nothrow @nogc
2044 {
2045 return __cmsg_nxthdr(msg, cmsg);
2046 }
2047
2048 extern (D) inout(cmsghdr)* CMSG_FIRSTHDR( inout(msghdr)* mhdr ) pure nothrow @nogc
2049 {
2050 return ( cast(size_t)mhdr.msg_controllen >= cmsghdr.sizeof
2051 ? cast(inout(cmsghdr)*) mhdr.msg_control
2052 : cast(inout(cmsghdr)*) null );
2053 }
2054
2055 extern (D)
2056 {
2057 size_t CMSG_ALIGN( size_t len ) pure nothrow @nogc
2058 {
2059 return (len + size_t.sizeof - 1) & cast(size_t) (~(size_t.sizeof - 1));
2060 }
2061
2062 size_t CMSG_LEN( size_t len ) pure nothrow @nogc
2063 {
2064 return CMSG_ALIGN(cmsghdr.sizeof) + len;
2065 }
2066 }
2067
2068 extern (D) size_t CMSG_SPACE(size_t len) pure nothrow @nogc
2069 {
2070 return CMSG_ALIGN(len) + CMSG_ALIGN(cmsghdr.sizeof);
2071 }
2072
2073 struct linger
2074 {
2075 int l_onoff;
2076 int l_linger;
2077 }
2078
9607e404 2079 version (X86_Any)
b4c522fa
IB
2080 {
2081 enum
2082 {
2083 SOCK_DGRAM = 2,
2084 SOCK_SEQPACKET = 5,
9607e404
IB
2085 SOCK_STREAM = 1,
2086 SOCK_CLOEXEC = 0x80000, // octal 02000000
2087 SOCK_NONBLOCK = 0x800 // octal 00004000
b4c522fa
IB
2088 }
2089 }
9607e404 2090 else version (MIPS_Any)
b4c522fa
IB
2091 {
2092 enum
2093 {
2094 SOCK_DGRAM = 1,
2095 SOCK_SEQPACKET = 5,
2096 SOCK_STREAM = 2,
9607e404
IB
2097 SOCK_CLOEXEC = 0x80000, // octal 02000000
2098 SOCK_NONBLOCK = 0x80 // octal 00000200
b4c522fa
IB
2099 }
2100 }
9607e404 2101 else version (ARM_Any)
b4c522fa
IB
2102 {
2103 enum
2104 {
2105 SOCK_DGRAM = 2,
2106 SOCK_SEQPACKET = 5,
9607e404
IB
2107 SOCK_STREAM = 1,
2108 SOCK_CLOEXEC = 0x80000, // octal 02000000
2109 SOCK_NONBLOCK = 0x800 // octal 00004000
b4c522fa
IB
2110 }
2111 }
2112 else
2113 static assert(0, "unimplemented");
2114
2115 enum
2116 {
2117 SO_ACCEPTCONN = 30,
2118 SO_BROADCAST = 6,
2119 SO_DEBUG = 1,
2120 SO_DONTROUTE = 5,
2121 SO_ERROR = 4,
2122 SO_KEEPALIVE = 9,
2123 SO_LINGER = 13,
2124 SO_OOBINLINE = 10,
2125 SO_RCVBUF = 8,
2126 SO_RCVLOWAT = 18,
2127 SO_RCVTIMEO = 20,
2128 SO_REUSEADDR = 2,
2129 SO_SNDBUF = 7,
2130 SO_SNDLOWAT = 19,
2131 SO_SNDTIMEO = 21,
2132 SO_TYPE = 3,
2133
2134 SOL_SOCKET = 1,
9607e404 2135 SOL_TCP = 6,
b4c522fa
IB
2136 SOMAXCONN = 128
2137 }
2138
2139 enum : uint
2140 {
2141 MSG_CTRUNC = 0x08,
2142 MSG_DONTROUTE = 0x04,
2143 MSG_EOR = 0x80,
2144 MSG_OOB = 0x01,
2145 MSG_PEEK = 0x02,
2146 MSG_TRUNC = 0x20,
2147 MSG_WAITALL = 0x100,
2148 MSG_NOSIGNAL = 0x4000
2149 }
2150
2151 enum
2152 {
2153 AF_APPLETALK = 5,
2154 AF_INET = 2,
2155 AF_IPX = 4,
2156 AF_UNIX = 1,
2157 AF_UNSPEC = 0,
2158 PF_APPLETALK = AF_APPLETALK,
2159 PF_IPX = AF_IPX
2160 }
2161
2162 enum int SOCK_RDM = 4;
2163
2164 enum
2165 {
2166 SHUT_RD,
2167 SHUT_WR,
2168 SHUT_RDWR
2169 }
2170
2171 int accept(int, sockaddr*, socklen_t*);
92dd3e71
IB
2172 int bind(int, const scope sockaddr*, socklen_t);
2173 int connect(int, const scope sockaddr*, socklen_t);
b4c522fa
IB
2174 int getpeername(int, sockaddr*, socklen_t*);
2175 int getsockname(int, sockaddr*, socklen_t*);
2176 int getsockopt(int, int, int, void*, socklen_t*);
2177 int listen(int, int);
2178 ssize_t recv(int, void*, size_t, int);
2179 ssize_t recvfrom(int, void*, size_t, int, sockaddr*, socklen_t*);
2180 ssize_t recvmsg(int, msghdr*, int);
92dd3e71
IB
2181 ssize_t send(int, const scope void*, size_t, int);
2182 ssize_t sendmsg(int, const scope msghdr*, int);
2183 ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
2184 int setsockopt(int, int, int, const scope void*, socklen_t);
b4c522fa
IB
2185 int shutdown(int, int);
2186 int socket(int, int, int);
2187 int sockatmark(int);
2188 int socketpair(int, int, int, ref int[2]);
2189}
2190else
2191{
2192 static assert(false, "Unsupported platform");
2193}
2194
2195//
2196// IPV6 (IP6)
2197//
2198/*
2199AF_INET6
2200*/
2201
2202version (CRuntime_Glibc)
2203{
2204 enum
2205 {
2206 AF_INET6 = 10
2207 }
2208}
2209else version (Darwin)
2210{
2211 enum
2212 {
2213 AF_INET6 = 30
2214 }
2215}
2216else version (FreeBSD)
2217{
2218 enum
2219 {
2220 AF_INET6 = 28
2221 }
2222}
2223else version (NetBSD)
2224{
2225 enum
2226 {
2227 AF_INET6 = 24
2228 }
2229}
0234a917
IB
2230else version (OpenBSD)
2231{
2232 enum
2233 {
2234 AF_INET6 = 24
2235 }
2236}
b4c522fa
IB
2237else version (DragonFlyBSD)
2238{
2239 enum
2240 {
2241 AF_INET6 = 28
2242 }
2243}
2244else version (Solaris)
2245{
2246 enum
2247 {
2248 AF_INET6 = 26,
2249 }
2250}
2251else version (CRuntime_Bionic)
2252{
2253 enum
2254 {
2255 AF_INET6 = 10
2256 }
2257}
2258else version (CRuntime_Musl)
2259{
2260 enum AF_INET6 = 10;
2261}
2262else version (CRuntime_UClibc)
2263{
2264 enum
2265 {
2266 AF_INET6 = 10
2267 }
2268}
2269else
2270{
2271 static assert(false, "Unsupported platform");
2272}
2273
2274//
2275// Raw Sockets (RS)
2276//
2277/*
2278SOCK_RAW
2279*/
2280
2281version (CRuntime_Glibc)
2282{
2283 enum
2284 {
2285 SOCK_RAW = 3
2286 }
2287}
2288else version (Darwin)
2289{
2290 enum
2291 {
2292 SOCK_RAW = 3
2293 }
2294}
2295else version (FreeBSD)
2296{
2297 enum
2298 {
2299 SOCK_RAW = 3
2300 }
2301}
2302else version (NetBSD)
2303{
2304 enum
2305 {
2306 SOCK_RAW = 3
2307 }
2308}
0234a917
IB
2309else version (OpenBSD)
2310{
2311 enum
2312 {
2313 SOCK_RAW = 3
2314 }
2315}
b4c522fa
IB
2316else version (DragonFlyBSD)
2317{
2318 enum
2319 {
2320 SOCK_RAW = 3
2321 }
2322}
2323else version (Solaris)
2324{
2325 enum
2326 {
2327 SOCK_RAW = 4,
2328 }
2329}
2330else version (CRuntime_Bionic)
2331{
2332 enum
2333 {
2334 SOCK_RAW = 3
2335 }
2336}
2337else version (CRuntime_Musl)
2338{
1e78c638
IB
2339 enum
2340 {
2341 SOCK_RAW = 3
2342 }
b4c522fa
IB
2343}
2344else version (CRuntime_UClibc)
2345{
2346 enum
2347 {
2348 SOCK_RAW = 3
2349 }
2350}
2351else
2352{
2353 static assert(false, "Unsupported platform");
2354}