PageRenderTime 52ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/libphobos/libdruntime/core/sys/posix/sys/socket.d

https://gitlab.com/adotout/gcc
D | 1891 lines | 1564 code | 164 blank | 163 comment | 47 complexity | c5839f9a7e1deb9fe43675915f460a28 MD5 | raw file
  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. /* Copyright Sean Kelly 2005 - 2009.
  10. * Distributed under the Boost Software License, Version 1.0.
  11. * (See accompanying file LICENSE or copy at
  12. * http://www.boost.org/LICENSE_1_0.txt)
  13. */
  14. module core.sys.posix.sys.socket;
  15. import core.sys.posix.config;
  16. public import core.sys.posix.sys.types; // for ssize_t
  17. public import core.sys.posix.sys.uio; // for iovec
  18. version (OSX)
  19. version = Darwin;
  20. else version (iOS)
  21. version = Darwin;
  22. else version (TVOS)
  23. version = Darwin;
  24. else version (WatchOS)
  25. version = Darwin;
  26. version (ARM) version = ARM_Any;
  27. version (AArch64) version = ARM_Any;
  28. version (HPPA) version = HPPA_Any;
  29. version (MIPS32) version = MIPS_Any;
  30. version (MIPS64) version = MIPS_Any;
  31. version (PPC) version = PPC_Any;
  32. version (PPC64) version = PPC_Any;
  33. version (RISCV32) version = RISCV_Any;
  34. version (RISCV64) version = RISCV_Any;
  35. version (S390) version = IBMZ_Any;
  36. version (SPARC) version = SPARC_Any;
  37. version (SPARC64) version = SPARC_Any;
  38. version (SystemZ) version = IBMZ_Any;
  39. version (X86) version = X86_Any;
  40. version (X86_64) version = X86_Any;
  41. version (Posix):
  42. extern (C) nothrow @nogc:
  43. @system:
  44. //
  45. // Required
  46. //
  47. /*
  48. socklen_t
  49. sa_family_t
  50. struct sockaddr
  51. {
  52. sa_family_t sa_family;
  53. char sa_data[];
  54. }
  55. struct sockaddr_storage
  56. {
  57. sa_family_t ss_family;
  58. }
  59. struct msghdr
  60. {
  61. void* msg_name;
  62. socklen_t msg_namelen;
  63. struct iovec* msg_iov;
  64. int msg_iovlen;
  65. void* msg_control;
  66. socklen_t msg_controllen;
  67. int msg_flags;
  68. }
  69. struct iovec {} // from core.sys.posix.sys.uio
  70. struct cmsghdr
  71. {
  72. socklen_t cmsg_len;
  73. int cmsg_level;
  74. int cmsg_type;
  75. }
  76. SCM_RIGHTS
  77. CMSG_DATA(cmsg)
  78. CMSG_NXTHDR(mhdr,cmsg)
  79. CMSG_FIRSTHDR(mhdr)
  80. struct linger
  81. {
  82. int l_onoff;
  83. int l_linger;
  84. }
  85. SOCK_DGRAM
  86. SOCK_SEQPACKET
  87. SOCK_STREAM
  88. SOL_SOCKET
  89. SO_ACCEPTCONN
  90. SO_BROADCAST
  91. SO_DEBUG
  92. SO_DONTROUTE
  93. SO_ERROR
  94. SO_KEEPALIVE
  95. SO_LINGER
  96. SO_OOBINLINE
  97. SO_RCVBUF
  98. SO_RCVLOWAT
  99. SO_RCVTIMEO
  100. SO_REUSEADDR
  101. SO_SNDBUF
  102. SO_SNDLOWAT
  103. SO_SNDTIMEO
  104. SO_TYPE
  105. SOMAXCONN
  106. MSG_CTRUNC
  107. MSG_DONTROUTE
  108. MSG_EOR
  109. MSG_OOB
  110. MSG_PEEK
  111. MSG_TRUNC
  112. MSG_WAITALL
  113. AF_INET
  114. AF_UNIX
  115. AF_UNSPEC
  116. SHUT_RD
  117. SHUT_RDWR
  118. SHUT_WR
  119. */
  120. version (linux)
  121. {
  122. alias uint socklen_t;
  123. alias ushort sa_family_t;
  124. struct sockaddr
  125. {
  126. sa_family_t sa_family;
  127. byte[14] sa_data;
  128. }
  129. private enum : size_t
  130. {
  131. _SS_SIZE = 128,
  132. _SS_PADSIZE = _SS_SIZE - c_ulong.sizeof - sa_family_t.sizeof
  133. }
  134. struct sockaddr_storage
  135. {
  136. sa_family_t ss_family;
  137. byte[_SS_PADSIZE] __ss_padding;
  138. c_ulong __ss_align;
  139. }
  140. struct msghdr
  141. {
  142. void* msg_name;
  143. socklen_t msg_namelen;
  144. iovec* msg_iov;
  145. size_t msg_iovlen;
  146. void* msg_control;
  147. size_t msg_controllen;
  148. int msg_flags;
  149. }
  150. struct cmsghdr
  151. {
  152. size_t cmsg_len;
  153. int cmsg_level;
  154. int cmsg_type;
  155. }
  156. enum : uint
  157. {
  158. SCM_RIGHTS = 0x01
  159. }
  160. extern (D) inout(ubyte)* CMSG_DATA( return scope inout(cmsghdr)* cmsg ) pure nothrow @nogc { return cast(ubyte*)( cmsg + 1 ); }
  161. private inout(cmsghdr)* __cmsg_nxthdr(inout(msghdr)*, inout(cmsghdr)*) pure nothrow @nogc;
  162. extern (D) inout(cmsghdr)* CMSG_NXTHDR(inout(msghdr)* msg, inout(cmsghdr)* cmsg) pure nothrow @nogc
  163. {
  164. return __cmsg_nxthdr(msg, cmsg);
  165. }
  166. extern (D) inout(cmsghdr)* CMSG_FIRSTHDR( inout(msghdr)* mhdr ) pure nothrow @nogc
  167. {
  168. return ( cast(size_t)mhdr.msg_controllen >= cmsghdr.sizeof
  169. ? cast(inout(cmsghdr)*) mhdr.msg_control
  170. : cast(inout(cmsghdr)*) null );
  171. }
  172. extern (D)
  173. {
  174. size_t CMSG_ALIGN( size_t len ) pure nothrow @nogc
  175. {
  176. return (len + size_t.sizeof - 1) & cast(size_t) (~(size_t.sizeof - 1));
  177. }
  178. size_t CMSG_LEN( size_t len ) pure nothrow @nogc
  179. {
  180. return CMSG_ALIGN(cmsghdr.sizeof) + len;
  181. }
  182. }
  183. extern (D) size_t CMSG_SPACE(size_t len) pure nothrow @nogc
  184. {
  185. return CMSG_ALIGN(len) + CMSG_ALIGN(cmsghdr.sizeof);
  186. }
  187. struct linger
  188. {
  189. int l_onoff;
  190. int l_linger;
  191. }
  192. version (X86_Any)
  193. {
  194. enum
  195. {
  196. SOCK_DGRAM = 2,
  197. SOCK_SEQPACKET = 5,
  198. SOCK_STREAM = 1
  199. }
  200. enum
  201. {
  202. SOL_SOCKET = 1
  203. }
  204. enum
  205. {
  206. SO_ACCEPTCONN = 30,
  207. SO_BROADCAST = 6,
  208. SO_DEBUG = 1,
  209. SO_DONTROUTE = 5,
  210. SO_ERROR = 4,
  211. SO_KEEPALIVE = 9,
  212. SO_LINGER = 13,
  213. SO_OOBINLINE = 10,
  214. SO_RCVBUF = 8,
  215. SO_RCVLOWAT = 18,
  216. SO_RCVTIMEO = 20,
  217. SO_REUSEADDR = 2,
  218. SO_REUSEPORT = 15,
  219. SO_SNDBUF = 7,
  220. SO_SNDLOWAT = 19,
  221. SO_SNDTIMEO = 21,
  222. SO_TYPE = 3
  223. }
  224. }
  225. else version (HPPA_Any)
  226. {
  227. enum
  228. {
  229. SOCK_DGRAM = 2,
  230. SOCK_SEQPACKET = 5,
  231. SOCK_STREAM = 1,
  232. }
  233. enum
  234. {
  235. SOL_SOCKET = 0xffff
  236. }
  237. enum
  238. {
  239. SO_ACCEPTCONN = 0x401c,
  240. SO_BROADCAST = 0x0020,
  241. SO_DEBUG = 0x0001,
  242. SO_DONTROUTE = 0x0010,
  243. SO_ERROR = 0x1007,
  244. SO_KEEPALIVE = 0x0008,
  245. SO_LINGER = 0x0080,
  246. SO_OOBINLINE = 0x0100,
  247. SO_RCVBUF = 0x1002,
  248. SO_RCVLOWAT = 0x1004,
  249. SO_RCVTIMEO = 0x1006,
  250. SO_REUSEADDR = 0x0004,
  251. SO_SNDBUF = 0x1001,
  252. SO_SNDLOWAT = 0x1003,
  253. SO_SNDTIMEO = 0x1005,
  254. SO_TYPE = 0x1008,
  255. }
  256. }
  257. else version (MIPS_Any)
  258. {
  259. enum
  260. {
  261. SOCK_DGRAM = 1,
  262. SOCK_SEQPACKET = 5,
  263. SOCK_STREAM = 2,
  264. }
  265. enum
  266. {
  267. SOL_SOCKET = 0xffff
  268. }
  269. enum
  270. {
  271. SO_ACCEPTCONN = 0x1009,
  272. SO_BROADCAST = 0x0020,
  273. SO_DEBUG = 0x0001,
  274. SO_DONTROUTE = 0x0010,
  275. SO_ERROR = 0x1007,
  276. SO_KEEPALIVE = 0x0008,
  277. SO_LINGER = 0x0080,
  278. SO_OOBINLINE = 0x0100,
  279. SO_RCVBUF = 0x1002,
  280. SO_RCVLOWAT = 0x1004,
  281. SO_RCVTIMEO = 0x1006,
  282. SO_REUSEADDR = 0x0004,
  283. SO_SNDBUF = 0x1001,
  284. SO_SNDLOWAT = 0x1003,
  285. SO_SNDTIMEO = 0x1005,
  286. SO_TYPE = 0x1008,
  287. }
  288. }
  289. else version (PPC_Any)
  290. {
  291. enum
  292. {
  293. SOCK_DGRAM = 2,
  294. SOCK_SEQPACKET = 5,
  295. SOCK_STREAM = 1
  296. }
  297. enum
  298. {
  299. SOL_SOCKET = 1
  300. }
  301. enum
  302. {
  303. SO_ACCEPTCONN = 30,
  304. SO_BROADCAST = 6,
  305. SO_DEBUG = 1,
  306. SO_DONTROUTE = 5,
  307. SO_ERROR = 4,
  308. SO_KEEPALIVE = 9,
  309. SO_LINGER = 13,
  310. SO_OOBINLINE = 10,
  311. SO_RCVBUF = 8,
  312. SO_RCVLOWAT = 16,
  313. SO_RCVTIMEO = 18,
  314. SO_REUSEADDR = 2,
  315. SO_SNDBUF = 7,
  316. SO_SNDLOWAT = 17,
  317. SO_SNDTIMEO = 19,
  318. SO_TYPE = 3
  319. }
  320. }
  321. else version (ARM_Any)
  322. {
  323. enum
  324. {
  325. SOCK_DGRAM = 2,
  326. SOCK_SEQPACKET = 5,
  327. SOCK_STREAM = 1
  328. }
  329. enum
  330. {
  331. SOL_SOCKET = 1
  332. }
  333. enum
  334. {
  335. SO_ACCEPTCONN = 30,
  336. SO_BROADCAST = 6,
  337. SO_DEBUG = 1,
  338. SO_DONTROUTE = 5,
  339. SO_ERROR = 4,
  340. SO_KEEPALIVE = 9,
  341. SO_LINGER = 13,
  342. SO_OOBINLINE = 10,
  343. SO_RCVBUF = 8,
  344. SO_RCVLOWAT = 18,
  345. SO_RCVTIMEO = 20,
  346. SO_REUSEADDR = 2,
  347. SO_REUSEPORT = 15,
  348. SO_SNDBUF = 7,
  349. SO_SNDLOWAT = 19,
  350. SO_SNDTIMEO = 21,
  351. SO_TYPE = 3
  352. }
  353. }
  354. else version (RISCV_Any)
  355. {
  356. enum
  357. {
  358. SOCK_DGRAM = 2,
  359. SOCK_SEQPACKET = 5,
  360. SOCK_STREAM = 1
  361. }
  362. enum
  363. {
  364. SOL_SOCKET = 1
  365. }
  366. enum
  367. {
  368. SO_ACCEPTCONN = 30,
  369. SO_BROADCAST = 6,
  370. SO_DEBUG = 1,
  371. SO_DONTROUTE = 5,
  372. SO_ERROR = 4,
  373. SO_KEEPALIVE = 9,
  374. SO_LINGER = 13,
  375. SO_OOBINLINE = 10,
  376. SO_RCVBUF = 8,
  377. SO_RCVLOWAT = 18,
  378. SO_RCVTIMEO = 20,
  379. SO_REUSEADDR = 2,
  380. SO_SNDBUF = 7,
  381. SO_SNDLOWAT = 19,
  382. SO_SNDTIMEO = 21,
  383. SO_TYPE = 3
  384. }
  385. }
  386. else version (SPARC_Any)
  387. {
  388. enum
  389. {
  390. SOCK_DGRAM = 2,
  391. SOCK_SEQPACKET = 5,
  392. SOCK_STREAM = 1
  393. }
  394. enum
  395. {
  396. SOL_SOCKET = 1
  397. }
  398. enum
  399. {
  400. SO_ACCEPTCONN = 30,
  401. SO_BROADCAST = 6,
  402. SO_DEBUG = 1,
  403. SO_DONTROUTE = 5,
  404. SO_ERROR = 4,
  405. SO_KEEPALIVE = 9,
  406. SO_LINGER = 13,
  407. SO_OOBINLINE = 10,
  408. SO_RCVBUF = 8,
  409. SO_RCVLOWAT = 18,
  410. SO_RCVTIMEO = 20,
  411. SO_REUSEADDR = 2,
  412. SO_SNDBUF = 7,
  413. SO_SNDLOWAT = 19,
  414. SO_SNDTIMEO = 21,
  415. SO_TYPE = 3
  416. }
  417. }
  418. else version (IBMZ_Any)
  419. {
  420. enum
  421. {
  422. SOCK_DGRAM = 2,
  423. SOCK_SEQPACKET = 5,
  424. SOCK_STREAM = 1
  425. }
  426. enum
  427. {
  428. SOL_SOCKET = 1
  429. }
  430. enum
  431. {
  432. SO_ACCEPTCONN = 30,
  433. SO_BROADCAST = 6,
  434. SO_DEBUG = 1,
  435. SO_DONTROUTE = 5,
  436. SO_ERROR = 4,
  437. SO_KEEPALIVE = 9,
  438. SO_LINGER = 13,
  439. SO_OOBINLINE = 10,
  440. SO_RCVBUF = 8,
  441. SO_RCVLOWAT = 18,
  442. SO_RCVTIMEO = 20,
  443. SO_REUSEADDR = 2,
  444. SO_SNDBUF = 7,
  445. SO_SNDLOWAT = 19,
  446. SO_SNDTIMEO = 21,
  447. SO_TYPE = 3
  448. }
  449. }
  450. else
  451. static assert(0, "unimplemented");
  452. version (CRuntime_Glibc)
  453. {
  454. enum
  455. {
  456. SOMAXCONN = 4096
  457. }
  458. }
  459. else
  460. {
  461. enum
  462. {
  463. SOMAXCONN = 128
  464. }
  465. }
  466. enum : uint
  467. {
  468. MSG_CTRUNC = 0x08,
  469. MSG_DONTROUTE = 0x04,
  470. MSG_EOR = 0x80,
  471. MSG_OOB = 0x01,
  472. MSG_PEEK = 0x02,
  473. MSG_TRUNC = 0x20,
  474. MSG_WAITALL = 0x100,
  475. MSG_NOSIGNAL = 0x4000
  476. }
  477. enum
  478. {
  479. AF_APPLETALK = 5,
  480. AF_INET = 2,
  481. AF_IPX = 4,
  482. AF_UNIX = 1,
  483. AF_UNSPEC = 0,
  484. PF_APPLETALK = AF_APPLETALK,
  485. PF_IPX = AF_IPX
  486. }
  487. enum int SOCK_RDM = 4;
  488. enum
  489. {
  490. SHUT_RD,
  491. SHUT_WR,
  492. SHUT_RDWR
  493. }
  494. }
  495. else version (Darwin)
  496. {
  497. alias uint socklen_t;
  498. alias ubyte sa_family_t;
  499. struct sockaddr
  500. {
  501. ubyte sa_len;
  502. sa_family_t sa_family;
  503. byte[14] sa_data;
  504. }
  505. private enum : size_t
  506. {
  507. _SS_PAD1 = long.sizeof - ubyte.sizeof - sa_family_t.sizeof,
  508. _SS_PAD2 = 128 - ubyte.sizeof - sa_family_t.sizeof - _SS_PAD1 - long.sizeof
  509. }
  510. struct sockaddr_storage
  511. {
  512. ubyte ss_len;
  513. sa_family_t ss_family;
  514. byte[_SS_PAD1] __ss_pad1;
  515. long __ss_align;
  516. byte[_SS_PAD2] __ss_pad2;
  517. }
  518. struct msghdr
  519. {
  520. void* msg_name;
  521. socklen_t msg_namelen;
  522. iovec* msg_iov;
  523. int msg_iovlen;
  524. void* msg_control;
  525. socklen_t msg_controllen;
  526. int msg_flags;
  527. }
  528. struct cmsghdr
  529. {
  530. socklen_t cmsg_len;
  531. int cmsg_level;
  532. int cmsg_type;
  533. }
  534. enum : uint
  535. {
  536. SCM_RIGHTS = 0x01
  537. }
  538. /+
  539. CMSG_DATA(cmsg) ((unsigned char *)(cmsg) + \
  540. ALIGN(sizeof(struct cmsghdr)))
  541. CMSG_NXTHDR(mhdr, cmsg) \
  542. (((unsigned char *)(cmsg) + ALIGN((cmsg)->cmsg_len) + \
  543. ALIGN(sizeof(struct cmsghdr)) > \
  544. (unsigned char *)(mhdr)->msg_control +(mhdr)->msg_controllen) ? \
  545. (struct cmsghdr *)0 /* NULL */ : \
  546. (struct cmsghdr *)((unsigned char *)(cmsg) + ALIGN((cmsg)->cmsg_len)))
  547. CMSG_FIRSTHDR(mhdr) ((struct cmsghdr *)(mhdr)->msg_control)
  548. +/
  549. struct linger
  550. {
  551. int l_onoff;
  552. int l_linger;
  553. }
  554. enum
  555. {
  556. SOCK_DGRAM = 2,
  557. SOCK_RDM = 4,
  558. SOCK_SEQPACKET = 5,
  559. SOCK_STREAM = 1
  560. }
  561. enum : uint
  562. {
  563. SOL_SOCKET = 0xffff
  564. }
  565. enum : uint
  566. {
  567. SO_ACCEPTCONN = 0x0002,
  568. SO_BROADCAST = 0x0020,
  569. SO_DEBUG = 0x0001,
  570. SO_DONTROUTE = 0x0010,
  571. SO_ERROR = 0x1007,
  572. SO_KEEPALIVE = 0x0008,
  573. SO_LINGER = 0x1080,
  574. SO_NOSIGPIPE = 0x1022, // non-standard
  575. SO_OOBINLINE = 0x0100,
  576. SO_RCVBUF = 0x1002,
  577. SO_RCVLOWAT = 0x1004,
  578. SO_RCVTIMEO = 0x1006,
  579. SO_REUSEADDR = 0x0004,
  580. SO_REUSEPORT = 0x0200,
  581. SO_SNDBUF = 0x1001,
  582. SO_SNDLOWAT = 0x1003,
  583. SO_SNDTIMEO = 0x1005,
  584. SO_TYPE = 0x1008
  585. }
  586. enum
  587. {
  588. SOMAXCONN = 128
  589. }
  590. enum : uint
  591. {
  592. MSG_CTRUNC = 0x20,
  593. MSG_DONTROUTE = 0x4,
  594. MSG_EOR = 0x8,
  595. MSG_OOB = 0x1,
  596. MSG_PEEK = 0x2,
  597. MSG_TRUNC = 0x10,
  598. MSG_WAITALL = 0x40
  599. }
  600. enum
  601. {
  602. AF_APPLETALK = 16,
  603. AF_INET = 2,
  604. AF_IPX = 23,
  605. AF_UNIX = 1,
  606. AF_UNSPEC = 0,
  607. PF_APPLETALK = AF_APPLETALK,
  608. PF_IPX = AF_IPX
  609. }
  610. enum
  611. {
  612. SHUT_RD,
  613. SHUT_WR,
  614. SHUT_RDWR
  615. }
  616. }
  617. else version (FreeBSD)
  618. {
  619. alias uint socklen_t;
  620. alias ubyte sa_family_t;
  621. struct sockaddr
  622. {
  623. ubyte sa_len;
  624. sa_family_t sa_family;
  625. byte[14] sa_data;
  626. }
  627. private
  628. {
  629. enum _SS_ALIGNSIZE = long.sizeof;
  630. enum _SS_MAXSIZE = 128;
  631. enum _SS_PAD1SIZE = _SS_ALIGNSIZE - ubyte.sizeof - sa_family_t.sizeof;
  632. enum _SS_PAD2SIZE = _SS_MAXSIZE - ubyte.sizeof - sa_family_t.sizeof - _SS_PAD1SIZE - _SS_ALIGNSIZE;
  633. }
  634. struct sockaddr_storage
  635. {
  636. ubyte ss_len;
  637. sa_family_t ss_family;
  638. byte[_SS_PAD1SIZE] __ss_pad1;
  639. long __ss_align;
  640. byte[_SS_PAD2SIZE] __ss_pad2;
  641. }
  642. struct msghdr
  643. {
  644. void* msg_name;
  645. socklen_t msg_namelen;
  646. iovec* msg_iov;
  647. int msg_iovlen;
  648. void* msg_control;
  649. socklen_t msg_controllen;
  650. int msg_flags;
  651. }
  652. struct cmsghdr
  653. {
  654. socklen_t cmsg_len;
  655. int cmsg_level;
  656. int cmsg_type;
  657. }
  658. enum : uint
  659. {
  660. SCM_RIGHTS = 0x01
  661. }
  662. private // <machine/param.h>
  663. {
  664. enum _ALIGNBYTES = /+c_int+/ int.sizeof - 1;
  665. extern (D) size_t _ALIGN( size_t p ) { return (p + _ALIGNBYTES) & ~_ALIGNBYTES; }
  666. }
  667. extern (D) ubyte* CMSG_DATA( cmsghdr* cmsg )
  668. {
  669. return cast(ubyte*) cmsg + _ALIGN( cmsghdr.sizeof );
  670. }
  671. extern (D) cmsghdr* CMSG_NXTHDR( msghdr* mhdr, cmsghdr* cmsg )
  672. {
  673. if ( cmsg == null )
  674. {
  675. return CMSG_FIRSTHDR( mhdr );
  676. }
  677. else
  678. {
  679. if ( cast(ubyte*) cmsg + _ALIGN( cmsg.cmsg_len ) + _ALIGN( cmsghdr.sizeof ) >
  680. cast(ubyte*) mhdr.msg_control + mhdr.msg_controllen )
  681. return null;
  682. else
  683. return cast(cmsghdr*) (cast(ubyte*) cmsg + _ALIGN( cmsg.cmsg_len ));
  684. }
  685. }
  686. extern (D) cmsghdr* CMSG_FIRSTHDR( msghdr* mhdr )
  687. {
  688. return mhdr.msg_controllen >= cmsghdr.sizeof ? cast(cmsghdr*) mhdr.msg_control : null;
  689. }
  690. struct linger
  691. {
  692. int l_onoff;
  693. int l_linger;
  694. }
  695. enum
  696. {
  697. SOCK_DGRAM = 2,
  698. SOCK_RDM = 4,
  699. SOCK_SEQPACKET = 5,
  700. SOCK_STREAM = 1
  701. }
  702. enum : uint
  703. {
  704. SOL_SOCKET = 0xffff
  705. }
  706. enum : uint
  707. {
  708. SO_ACCEPTCONN = 0x0002,
  709. SO_BROADCAST = 0x0020,
  710. SO_DEBUG = 0x0001,
  711. SO_DONTROUTE = 0x0010,
  712. SO_ERROR = 0x1007,
  713. SO_KEEPALIVE = 0x0008,
  714. SO_LINGER = 0x0080,
  715. SO_NOSIGPIPE = 0x0800, // non-standard
  716. SO_OOBINLINE = 0x0100,
  717. SO_RCVBUF = 0x1002,
  718. SO_RCVLOWAT = 0x1004,
  719. SO_RCVTIMEO = 0x1006,
  720. SO_REUSEADDR = 0x0004,
  721. SO_REUSEPORT = 0x0200,
  722. SO_SNDBUF = 0x1001,
  723. SO_SNDLOWAT = 0x1003,
  724. SO_SNDTIMEO = 0x1005,
  725. SO_TYPE = 0x1008
  726. }
  727. enum
  728. {
  729. SOMAXCONN = 128
  730. }
  731. enum : uint
  732. {
  733. MSG_CTRUNC = 0x20,
  734. MSG_DONTROUTE = 0x4,
  735. MSG_EOR = 0x8,
  736. MSG_OOB = 0x1,
  737. MSG_PEEK = 0x2,
  738. MSG_TRUNC = 0x10,
  739. MSG_WAITALL = 0x40,
  740. MSG_NOSIGNAL = 0x20000
  741. }
  742. enum
  743. {
  744. AF_APPLETALK = 16,
  745. AF_INET = 2,
  746. AF_IPX = 23,
  747. AF_UNIX = 1,
  748. AF_UNSPEC = 0
  749. }
  750. enum
  751. {
  752. SHUT_RD = 0,
  753. SHUT_WR = 1,
  754. SHUT_RDWR = 2
  755. }
  756. }
  757. else version (NetBSD)
  758. {
  759. alias uint socklen_t;
  760. alias ubyte sa_family_t;
  761. struct sockaddr
  762. {
  763. ubyte sa_len;
  764. sa_family_t sa_family;
  765. byte[14] sa_data;
  766. }
  767. private
  768. {
  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;
  773. }
  774. struct sockaddr_storage
  775. {
  776. ubyte ss_len;
  777. sa_family_t ss_family;
  778. byte[_SS_PAD1SIZE] __ss_pad1;
  779. long __ss_align;
  780. byte[_SS_PAD2SIZE] __ss_pad2;
  781. }
  782. struct msghdr
  783. {
  784. void* msg_name;
  785. socklen_t msg_namelen;
  786. iovec* msg_iov;
  787. int msg_iovlen;
  788. void* msg_control;
  789. socklen_t msg_controllen;
  790. int msg_flags;
  791. }
  792. struct cmsghdr
  793. {
  794. socklen_t cmsg_len;
  795. int cmsg_level;
  796. int cmsg_type;
  797. }
  798. enum : uint
  799. {
  800. SCM_RIGHTS = 0x01
  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. extern (D) ubyte* CMSG_DATA( cmsghdr* cmsg )
  808. {
  809. return cast(ubyte*) cmsg + _ALIGN( cmsghdr.sizeof );
  810. }
  811. extern (D) cmsghdr* CMSG_NXTHDR( msghdr* mhdr, cmsghdr* cmsg )
  812. {
  813. if ( cmsg == null )
  814. {
  815. return CMSG_FIRSTHDR( mhdr );
  816. }
  817. else
  818. {
  819. if ( cast(ubyte*) cmsg + _ALIGN( cmsg.cmsg_len ) + _ALIGN( cmsghdr.sizeof ) >
  820. cast(ubyte*) mhdr.msg_control + mhdr.msg_controllen )
  821. return null;
  822. else
  823. return cast(cmsghdr*) (cast(ubyte*) cmsg + _ALIGN( cmsg.cmsg_len ));
  824. }
  825. }
  826. extern (D) cmsghdr* CMSG_FIRSTHDR( msghdr* mhdr )
  827. {
  828. return mhdr.msg_controllen >= cmsghdr.sizeof ? cast(cmsghdr*) mhdr.msg_control : null;
  829. }
  830. struct linger
  831. {
  832. int l_onoff;
  833. int l_linger;
  834. }
  835. enum
  836. {
  837. SOCK_DGRAM = 2,
  838. SOCK_RDM = 4,
  839. SOCK_SEQPACKET = 5,
  840. SOCK_STREAM = 1
  841. }
  842. enum : uint
  843. {
  844. SOL_SOCKET = 0xffff
  845. }
  846. enum : uint
  847. {
  848. SO_DEBUG = 0x0001, /* turn on debugging info recording */
  849. SO_ACCEPTCONN = 0x0002, /* socket has had listen() */
  850. SO_REUSEADDR = 0x0004, /* allow local address reuse */
  851. SO_KEEPALIVE = 0x0008, /* keep connections alive */
  852. SO_DONTROUTE = 0x0010, /* just use interface addresses */
  853. SO_BROADCAST = 0x0020, /* permit sending of broadcast msgs */
  854. SO_USELOOPBACK = 0x0040, /* bypass hardware when possible */
  855. SO_LINGER = 0x0080, /* linger on close if data present */
  856. SO_OOBINLINE = 0x0100, /* leave received OOB data in line */
  857. SO_REUSEPORT = 0x0200, /* allow local address & port reuse */
  858. /* SO_OTIMESTAMP 0x0400 */
  859. SO_NOSIGPIPE = 0x0800, /* no SIGPIPE from EPIPE */
  860. SO_ACCEPTFILTER = 0x1000, /* there is an accept filter */
  861. SO_TIMESTAMP = 0x2000, /* timestamp received dgram traffic */
  862. /*
  863. * Additional options, not kept in so_options.
  864. */
  865. SO_SNDBUF = 0x1001, /* send buffer size */
  866. SO_RCVBUF = 0x1002, /* receive buffer size */
  867. SO_SNDLOWAT = 0x1003, /* send low-water mark */
  868. SO_RCVLOWAT = 0x1004, /* receive low-water mark */
  869. /* SO_OSNDTIMEO 0x1005 */
  870. /* SO_ORCVTIMEO 0x1006 */
  871. SO_ERROR = 0x1007, /* get error status and clear */
  872. SO_TYPE = 0x1008, /* get socket type */
  873. SO_OVERFLOWED = 0x1009, /* datagrams: return packets dropped */
  874. SO_NOHEADER = 0x100a, /* user supplies no header to kernel;
  875. * kernel removes header and supplies
  876. * payload
  877. */
  878. SO_SNDTIMEO = 0x100b, /* send timeout */
  879. SO_RCVTIMEO = 0x100c /* receive timeout */
  880. }
  881. enum
  882. {
  883. SOMAXCONN = 128
  884. }
  885. enum : uint
  886. {
  887. MSG_OOB = 0x0001, /* process out-of-band data */
  888. MSG_PEEK = 0x0002, /* peek at incoming message */
  889. MSG_DONTROUTE = 0x0004, /* send without using routing tables */
  890. MSG_EOR = 0x0008, /* data completes record */
  891. MSG_TRUNC = 0x0010, /* data discarded before delivery */
  892. MSG_CTRUNC = 0x0020, /* control data lost before delivery */
  893. MSG_WAITALL = 0x0040, /* wait for full request or error */
  894. MSG_DONTWAIT = 0x0080, /* this message should be nonblocking */
  895. MSG_BCAST = 0x0100, /* this message was rcvd using link-level brdcst */
  896. MSG_MCAST = 0x0200, /* this message was rcvd using link-level mcast */
  897. MSG_NOSIGNAL = 0x0400 /* do not generate SIGPIPE on EOF */
  898. }
  899. enum
  900. {
  901. AF_APPLETALK = 16,
  902. AF_INET = 2,
  903. AF_IPX = 23,
  904. AF_UNIX = 1,
  905. AF_UNSPEC = 0
  906. }
  907. enum
  908. {
  909. SHUT_RD = 0,
  910. SHUT_WR = 1,
  911. SHUT_RDWR = 2
  912. }
  913. }
  914. else version (OpenBSD)
  915. {
  916. alias uint socklen_t;
  917. alias ubyte sa_family_t;
  918. struct sockaddr
  919. {
  920. ubyte sa_len;
  921. sa_family_t sa_family;
  922. byte[14] sa_data;
  923. }
  924. struct sockaddr_storage
  925. {
  926. ubyte ss_len;
  927. sa_family_t ss_family;
  928. ubyte[6] __ss_pad1;
  929. long __ss_align;
  930. ubyte[240] __ss_pad2;
  931. }
  932. struct msghdr
  933. {
  934. void* msg_name;
  935. socklen_t msg_namelen;
  936. iovec* msg_iov;
  937. uint msg_iovlen;
  938. void* msg_control;
  939. socklen_t msg_controllen;
  940. int msg_flags;
  941. }
  942. struct cmsghdr
  943. {
  944. socklen_t cmsg_len;
  945. int cmsg_level;
  946. int cmsg_type;
  947. }
  948. enum : uint
  949. {
  950. SCM_RIGHTS = 0x01,
  951. SCM_TIMESTAMP = 0x04
  952. }
  953. private // <sys/_types.h>
  954. {
  955. enum _ALIGNBYTES = c_long.sizeof - 1;
  956. extern (D) size_t _ALIGN(size_t p) pure nothrow @nogc
  957. {
  958. return (p + _ALIGNBYTES) & ~_ALIGNBYTES;
  959. }
  960. }
  961. extern (D) ubyte* CMSG_DATA(cmsghdr* cmsg) pure nothrow @nogc
  962. {
  963. return cast(ubyte*) cmsg + _ALIGN(cmsghdr.sizeof);
  964. }
  965. extern (D) cmsghdr* CMSG_NXTHDR(msghdr* mhdr, cmsghdr* cmsg) pure nothrow @nogc
  966. {
  967. if (cast(ubyte*) cmsg + _ALIGN(cmsg.cmsg_len) + _ALIGN(cmsghdr.sizeof) >
  968. cast(ubyte*) mhdr.msg_control + mhdr.msg_controllen)
  969. return null;
  970. else
  971. return cast(cmsghdr*) (cast(ubyte*) cmsg + _ALIGN(cmsg.cmsg_len));
  972. }
  973. extern (D) cmsghdr* CMSG_FIRSTHDR(msghdr* mhdr) pure nothrow @nogc
  974. {
  975. return mhdr.msg_controllen >= cmsghdr.sizeof ? cast(cmsghdr*) mhdr.msg_control : null;
  976. }
  977. extern (D)
  978. {
  979. size_t CMSG_LEN(size_t len) pure nothrow @nogc
  980. {
  981. return _ALIGN(cmsghdr.sizeof) + len;
  982. }
  983. }
  984. extern (D) size_t CMSG_SPACE(size_t len) pure nothrow @nogc
  985. {
  986. return _ALIGN(cmsghdr.sizeof) + _ALIGN(len);
  987. }
  988. struct linger
  989. {
  990. int l_onoff;
  991. int l_linger;
  992. }
  993. enum
  994. {
  995. SOCK_DGRAM = 2,
  996. SOCK_RDM = 4,
  997. SOCK_SEQPACKET = 5,
  998. SOCK_STREAM = 1
  999. }
  1000. enum : uint
  1001. {
  1002. SOL_SOCKET = 0xffff
  1003. }
  1004. enum : uint
  1005. {
  1006. SO_DEBUG = 0x0001,
  1007. SO_ACCEPTCONN = 0x0002,
  1008. SO_REUSEADDR = 0x0004,
  1009. SO_KEEPALIVE = 0x0008,
  1010. SO_DONTROUTE = 0x0010,
  1011. SO_BROADCAST = 0x0020,
  1012. SO_USELOOPBACK = 0x0040,
  1013. SO_LINGER = 0x0080,
  1014. SO_OOBINLINE = 0x0100,
  1015. SO_REUSEPORT = 0x0200,
  1016. SO_TIMESTAMP = 0x0800,
  1017. SO_BINDANY = 0x1000,
  1018. SO_ZEROSIZE = 0x2000,
  1019. SO_SNDBUF = 0x1001,
  1020. SO_RCVBUF = 0x1002,
  1021. SO_SNDLOWAT = 0x1003,
  1022. SO_RCVLOWAT = 0x1004,
  1023. SO_SNDTIMEO = 0x1005,
  1024. SO_RCVTIMEO = 0x1006,
  1025. SO_ERROR = 0x1007,
  1026. SO_TYPE = 0x1008,
  1027. SO_NETPROC = 0x1020,
  1028. SO_RTABLE = 0x1021,
  1029. SO_PEERCRED = 0x1022,
  1030. SO_SPLICE = 0x1023,
  1031. }
  1032. enum
  1033. {
  1034. SOMAXCONN = 128
  1035. }
  1036. enum : uint
  1037. {
  1038. MSG_OOB = 0x001,
  1039. MSG_PEEK = 0x002,
  1040. MSG_DONTROUTE = 0x004,
  1041. MSG_EOR = 0x008,
  1042. MSG_TRUNC = 0x010,
  1043. MSG_CTRUNC = 0x020,
  1044. MSG_WAITALL = 0x040,
  1045. MSG_DONTWAIT = 0x080,
  1046. MSG_BCAST = 0x100,
  1047. MSG_MCAST = 0x200,
  1048. MSG_NOSIGNAL = 0x400,
  1049. MSG_CMSG_CLOEXEC = 0x800,
  1050. }
  1051. enum
  1052. {
  1053. AF_APPLETALK = 16,
  1054. AF_INET = 2,
  1055. AF_IPX = 23,
  1056. AF_UNIX = 1,
  1057. AF_UNSPEC = 0
  1058. }
  1059. enum
  1060. {
  1061. SHUT_RD = 0,
  1062. SHUT_WR = 1,
  1063. SHUT_RDWR = 2
  1064. }
  1065. }
  1066. else version (DragonFlyBSD)
  1067. {
  1068. alias uint socklen_t;
  1069. alias ubyte sa_family_t;
  1070. enum
  1071. {
  1072. SOCK_STREAM = 1,
  1073. SOCK_DGRAM = 2,
  1074. //SOCK_RAW = 3, // defined below
  1075. SOCK_RDM = 4,
  1076. SOCK_SEQPACKET = 5,
  1077. }
  1078. enum SOCK_CLOEXEC = 0x10000000;
  1079. enum SOCK_NONBLOCK = 0x20000000;
  1080. enum : uint
  1081. {
  1082. SO_DEBUG = 0x0001,
  1083. SO_ACCEPTCONN = 0x0002,
  1084. SO_REUSEADDR = 0x0004,
  1085. SO_KEEPALIVE = 0x0008,
  1086. SO_DONTROUTE = 0x0010,
  1087. SO_BROADCAST = 0x0020,
  1088. SO_USELOOPBACK = 0x0040,
  1089. SO_LINGER = 0x0080,
  1090. SO_OOBINLINE = 0x0100,
  1091. SO_REUSEPORT = 0x0200,
  1092. SO_TIMESTAMP = 0x0400,
  1093. SO_NOSIGPIPE = 0x0800, // non-standard
  1094. SO_ACCEPTFILTER = 0x1000,
  1095. SO_SNDBUF = 0x1001,
  1096. SO_RCVBUF = 0x1002,
  1097. SO_SNDLOWAT = 0x1003,
  1098. SO_RCVLOWAT = 0x1004,
  1099. SO_SNDTIMEO = 0x1005,
  1100. SO_RCVTIMEO = 0x1006,
  1101. SO_ERROR = 0x1007,
  1102. SO_TYPE = 0x1008,
  1103. SO_SNDSPACE = 0x100a, // get appr. send buffer free space
  1104. SO_CPUHINT = 0x1030, // get socket's owner cpuid hint
  1105. }
  1106. struct linger
  1107. {
  1108. int l_onoff;
  1109. int l_linger;
  1110. }
  1111. struct accept_filter_arg {
  1112. byte[16] af_name;
  1113. byte[256-16] af_arg;
  1114. }
  1115. enum : uint
  1116. {
  1117. SOL_SOCKET = 0xffff
  1118. }
  1119. enum
  1120. {
  1121. AF_UNSPEC = 0,
  1122. AF_LOCAL = 1,
  1123. AF_UNIX = AF_LOCAL,
  1124. AF_INET = 2,
  1125. AF_APPLETALK = 16,
  1126. AF_IPX = 23,
  1127. }
  1128. struct sockaddr
  1129. {
  1130. ubyte sa_len;
  1131. sa_family_t sa_family;
  1132. byte[14] sa_data;
  1133. }
  1134. enum SOCK_MAXADDRLEN = 255;
  1135. struct sockproto {
  1136. ushort sp_family;
  1137. ushort sp_protocol;
  1138. }
  1139. private
  1140. {
  1141. enum _SS_ALIGNSIZE = long.sizeof;
  1142. enum _SS_MAXSIZE = 128;
  1143. enum _SS_PAD1SIZE = _SS_ALIGNSIZE - ubyte.sizeof - sa_family_t.sizeof;
  1144. enum _SS_PAD2SIZE = _SS_MAXSIZE - ubyte.sizeof - sa_family_t.sizeof - _SS_PAD1SIZE - _SS_ALIGNSIZE;
  1145. }
  1146. struct sockaddr_storage
  1147. {
  1148. ubyte ss_len;
  1149. sa_family_t ss_family;
  1150. byte[_SS_PAD1SIZE] __ss_pad1;
  1151. long __ss_align;
  1152. byte[_SS_PAD2SIZE] __ss_pad2;
  1153. }
  1154. struct msghdr
  1155. {
  1156. void* msg_name;
  1157. socklen_t msg_namelen;
  1158. iovec* msg_iov;
  1159. int msg_iovlen;
  1160. void* msg_control;
  1161. socklen_t msg_controllen;
  1162. int msg_flags;
  1163. }
  1164. enum SOMAXCONN = 128;
  1165. enum SOMAXOPT_SIZE = 65536;
  1166. enum SOMAXOPT_SIZE0 = (32 * 1024 * 1024);
  1167. enum : uint
  1168. {
  1169. MSG_OOB = 0x00000001,
  1170. MSG_PEEK = 0x00000002,
  1171. MSG_DONTROUTE = 0x00000004,
  1172. MSG_EOR = 0x00000008,
  1173. MSG_TRUNC = 0x00000010,
  1174. MSG_CTRUNC = 0x00000020,
  1175. MSG_WAITALL = 0x00000040,
  1176. MSG_DONTWAIT = 0x00000080,
  1177. MSG_EOF = 0x00000100,
  1178. MSG_UNUSED09 = 0x00000200,
  1179. MSG_NOSIGNAL = 0x00000400,
  1180. MSG_SYNC = 0x00000800,
  1181. MSG_CMSG_CLOEXEC = 0x00001000,
  1182. /* These override FIONBIO. MSG_FNONBLOCKING is functionally equivalent to MSG_DONTWAIT.*/
  1183. MSG_FBLOCKING = 0x00010000,
  1184. MSG_FNONBLOCKING = 0x00020000,
  1185. MSG_FMASK = 0xFFFF0000,
  1186. }
  1187. struct cmsghdr
  1188. {
  1189. socklen_t cmsg_len;
  1190. int cmsg_level;
  1191. int cmsg_type;
  1192. }
  1193. enum CMGROUP_MAX = 16;
  1194. struct cmsgcred {
  1195. pid_t cmcred_pid;
  1196. uid_t cmcred_uid;
  1197. uid_t cmcred_euid;
  1198. gid_t cmcred_gid;
  1199. short cmcred_ngroups;
  1200. gid_t[CMGROUP_MAX] cmcred_groups;
  1201. }
  1202. enum : uint
  1203. {
  1204. SCM_RIGHTS = 0x01
  1205. }
  1206. private // <machine/param.h>
  1207. {
  1208. enum _ALIGNBYTES = /+c_int+/ int.sizeof - 1;
  1209. extern (D) size_t _ALIGN( size_t p ) { return (p + _ALIGNBYTES) & ~_ALIGNBYTES; }
  1210. }
  1211. extern (D) ubyte* CMSG_DATA( cmsghdr* cmsg )
  1212. {
  1213. return cast(ubyte*) cmsg + _ALIGN( cmsghdr.sizeof );
  1214. }
  1215. extern (D) cmsghdr* CMSG_NXTHDR( msghdr* mhdr, cmsghdr* cmsg )
  1216. {
  1217. if ( cmsg == null )
  1218. {
  1219. return CMSG_FIRSTHDR( mhdr );
  1220. }
  1221. else
  1222. {
  1223. if ( cast(ubyte*) cmsg + _ALIGN( cmsg.cmsg_len ) + _ALIGN( cmsghdr.sizeof ) >
  1224. cast(ubyte*) mhdr.msg_control + mhdr.msg_controllen )
  1225. return null;
  1226. else
  1227. return cast(cmsghdr*) (cast(ubyte*) cmsg + _ALIGN( cmsg.cmsg_len ));
  1228. }
  1229. }
  1230. extern (D) cmsghdr* CMSG_FIRSTHDR( msghdr* mhdr )
  1231. {
  1232. return mhdr.msg_controllen >= cmsghdr.sizeof ? cast(cmsghdr*) mhdr.msg_control : null;
  1233. }
  1234. enum
  1235. {
  1236. SHUT_RD = 0,
  1237. SHUT_WR = 1,
  1238. SHUT_RDWR = 2
  1239. }
  1240. }
  1241. else version (Solaris)
  1242. {
  1243. alias uint socklen_t;
  1244. alias ushort sa_family_t;
  1245. struct sockaddr
  1246. {
  1247. sa_family_t sa_family;
  1248. char[14] sa_data = 0;
  1249. }
  1250. alias double sockaddr_maxalign_t;
  1251. private
  1252. {
  1253. enum _SS_ALIGNSIZE = sockaddr_maxalign_t.sizeof;
  1254. enum _SS_MAXSIZE = 256;
  1255. enum _SS_PAD1SIZE = _SS_ALIGNSIZE - sa_family_t.sizeof;
  1256. enum _SS_PAD2SIZE = _SS_MAXSIZE - sa_family_t.sizeof + _SS_PAD1SIZE + _SS_ALIGNSIZE;
  1257. }
  1258. struct sockaddr_storage
  1259. {
  1260. sa_family_t ss_family;
  1261. char[_SS_PAD1SIZE] _ss_pad1 = void;
  1262. sockaddr_maxalign_t _ss_align;
  1263. char[_SS_PAD2SIZE] _ss_pad2 = void;
  1264. }
  1265. struct msghdr
  1266. {
  1267. void* msg_name;
  1268. socklen_t msg_namelen;
  1269. iovec* msg_iov;
  1270. int msg_iovlen;
  1271. void* msg_control;
  1272. socklen_t msg_controllen;
  1273. int msg_flags;
  1274. }
  1275. struct cmsghdr
  1276. {
  1277. socklen_t cmsg_len;
  1278. int cmsg_level;
  1279. int cmsg_type;
  1280. }
  1281. enum : uint
  1282. {
  1283. SCM_RIGHTS = 0x1010
  1284. }
  1285. // FIXME: CMSG_DATA, CMSG_NXTHDR, CMSG_FIRSTHDR missing
  1286. struct linger
  1287. {
  1288. int l_onoff;
  1289. int l_linger;
  1290. }
  1291. enum
  1292. {
  1293. SOCK_STREAM = 2,
  1294. SOCK_DGRAM = 1,
  1295. SOCK_RDM = 5,
  1296. SOCK_SEQPACKET = 6,
  1297. }
  1298. enum : uint
  1299. {
  1300. SOL_SOCKET = 0xffff
  1301. }
  1302. enum : uint
  1303. {
  1304. SO_ACCEPTCONN = 0x0002,
  1305. SO_BROADCAST = 0x0020,
  1306. SO_DEBUG = 0x0001,
  1307. SO_DONTROUTE = 0x0010,
  1308. SO_ERROR = 0x1007,
  1309. SO_KEEPALIVE = 0x0008,
  1310. SO_LINGER = 0x0080,
  1311. SO_OOBINLINE = 0x0100,
  1312. SO_RCVBUF = 0x1002,
  1313. SO_RCVLOWAT = 0x1004,
  1314. SO_RCVTIMEO = 0x1006,
  1315. SO_REUSEADDR = 0x0004,
  1316. SO_SNDBUF = 0x1001,
  1317. SO_SNDLOWAT = 0x1003,
  1318. SO_SNDTIMEO = 0x1005,
  1319. SO_TYPE = 0x1008,
  1320. SO_USELOOPBACK = 0x0040, // non-standard
  1321. SO_DGRAM_ERRIND = 0x0200, // non-standard
  1322. SO_RECVUCRED = 0x0400, // non-standard
  1323. }
  1324. enum
  1325. {
  1326. SOMAXCONN = 128
  1327. }
  1328. enum : uint
  1329. {
  1330. MSG_CTRUNC = 0x10,
  1331. MSG_DONTROUTE = 0x4,
  1332. MSG_EOR = 0x8,
  1333. MSG_OOB = 0x1,
  1334. MSG_PEEK = 0x2,
  1335. MSG_TRUNC = 0x20,
  1336. MSG_WAITALL = 0x40
  1337. }
  1338. enum
  1339. {
  1340. AF_IPX = 23,
  1341. AF_APPLETALK = 16,
  1342. AF_INET = 2,
  1343. AF_UNIX = 1,
  1344. AF_UNSPEC = 0
  1345. }
  1346. enum
  1347. {
  1348. SHUT_RD,
  1349. SHUT_WR,
  1350. SHUT_RDWR
  1351. }
  1352. }
  1353. else
  1354. {
  1355. static assert(false, "Unsupported platform");
  1356. }
  1357. /*
  1358. int accept(int, sockaddr*, socklen_t*);
  1359. int bind(int, const scope sockaddr*, socklen_t);
  1360. int connect(int, const scope sockaddr*, socklen_t);
  1361. int getpeername(int, sockaddr*, socklen_t*);
  1362. int getsockname(int, sockaddr*, socklen_t*);
  1363. int getsockopt(int, int, int, void*, socklen_t*);
  1364. int listen(int, int);
  1365. ssize_t recv(int, void*, size_t, int);
  1366. ssize_t recvfrom(int, void*, size_t, int, sockaddr*, socklen_t*);
  1367. ssize_t recvmsg(int, msghdr*, int);
  1368. ssize_t send(int, const scope void*, size_t, int);
  1369. ssize_t sendmsg(int, const scope msghdr*, int);
  1370. ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
  1371. int setsockopt(int, int, int, const scope void*, socklen_t);
  1372. int shutdown(int, int);
  1373. int socket(int, int, int);
  1374. int sockatmark(int);
  1375. int socketpair(int, int, int, ref int[2]);
  1376. */
  1377. version (CRuntime_Glibc)
  1378. {
  1379. int accept(int, scope sockaddr*, scope socklen_t*);
  1380. int bind(int, const scope sockaddr*, socklen_t);
  1381. int connect(int, const scope sockaddr*, socklen_t);
  1382. int getpeername(int, scope sockaddr*, scope socklen_t*);
  1383. int getsockname(int, scope sockaddr*, scope socklen_t*);
  1384. int getsockopt(int, int, int, scope void*, scope socklen_t*);
  1385. int listen(int, int) @safe;
  1386. ssize_t recv(int, scope void*, size_t, int);
  1387. ssize_t recvfrom(int, scope void*, size_t, int, scope sockaddr*, scope socklen_t*);
  1388. ssize_t recvmsg(int, scope msghdr*, int);
  1389. ssize_t send(int, const scope void*, size_t, int);
  1390. ssize_t sendmsg(int, const scope msghdr*, int);
  1391. ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
  1392. int setsockopt(int, int, int, const scope void*, socklen_t);
  1393. int shutdown(int, int) @safe;
  1394. int socket(int, int, int) @safe;
  1395. int sockatmark(int) @safe;
  1396. int socketpair(int, int, int, ref int[2]) @safe;
  1397. }
  1398. else version (Darwin)
  1399. {
  1400. int accept(int, scope sockaddr*, scope socklen_t*);
  1401. int bind(int, const scope sockaddr*, socklen_t);
  1402. int connect(int, const scope sockaddr*, socklen_t);
  1403. int getpeername(int, scope sockaddr*, scope socklen_t*);
  1404. int getsockname(int, scope sockaddr*, scope socklen_t*);
  1405. int getsockopt(int, int, int, scope void*, scope socklen_t*);
  1406. int listen(int, int) @safe;
  1407. ssize_t recv(int, scope void*, size_t, int);
  1408. ssize_t recvfrom(int, scope void*, size_t, int, scope sockaddr*, scope socklen_t*);
  1409. ssize_t recvmsg(int, scope msghdr*, int);
  1410. ssize_t send(int, const scope void*, size_t, int);
  1411. ssize_t sendmsg(int, const scope msghdr*, int);
  1412. ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
  1413. int setsockopt(int, int, int, const scope void*, socklen_t);
  1414. int shutdown(int, int) @safe;
  1415. int socket(int, int, int) @safe;
  1416. int sockatmark(int) @safe;
  1417. int socketpair(int, int, int, ref int[2]) @safe;
  1418. }
  1419. else version (FreeBSD)
  1420. {
  1421. int accept(int, scope sockaddr*, scope socklen_t*);
  1422. int bind(int, const scope sockaddr*, socklen_t);
  1423. int connect(int, const scope sockaddr*, socklen_t);
  1424. int getpeername(int, scope sockaddr*, scope socklen_t*);
  1425. int getsockname(int, scope sockaddr*, scope socklen_t*);
  1426. int getsockopt(int, int, int, scope void*, scope socklen_t*);
  1427. int listen(int, int) @safe;
  1428. ssize_t recv(int, scope void*, size_t, int);
  1429. ssize_t recvfrom(int, scope void*, size_t, int, scope sockaddr*, scope socklen_t*);
  1430. ssize_t recvmsg(int, scope msghdr*, int);
  1431. ssize_t send(int, const scope void*, size_t, int);
  1432. ssize_t sendmsg(int, const scope msghdr*, int);
  1433. ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
  1434. int setsockopt(int, int, int, const scope void*, socklen_t);
  1435. int shutdown(int, int) @safe;
  1436. int socket(int, int, int) @safe;
  1437. int sockatmark(int) @safe;
  1438. int socketpair(int, int, int, ref int[2]) @safe;
  1439. }
  1440. else version (NetBSD)
  1441. {
  1442. int accept(int, scope sockaddr*, scope socklen_t*);
  1443. int bind(int, const scope sockaddr*, socklen_t);
  1444. int connect(int, const scope sockaddr*, socklen_t);
  1445. int getpeername(int, scope sockaddr*, scope socklen_t*);
  1446. int getsockname(int, scope sockaddr*, scope socklen_t*);
  1447. int getsockopt(int, int, int, scope void*, scope socklen_t*);
  1448. int listen(int, int) @safe;
  1449. ssize_t recv(int, scope void*, size_t, int);
  1450. ssize_t recvfrom(int, scope void*, size_t, int, scope sockaddr*, scope socklen_t*);
  1451. ssize_t recvmsg(int, scope msghdr*, int);
  1452. ssize_t send(int, const scope void*, size_t, int);
  1453. ssize_t sendmsg(int, const scope msghdr*, int);
  1454. ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
  1455. int setsockopt(int, int, int, const scope void*, socklen_t);
  1456. int shutdown(int, int) @safe;
  1457. int socket(int, int, int) @safe;
  1458. int sockatmark(int) @safe;
  1459. int socketpair(int, int, int, ref int[2]) @safe;
  1460. }
  1461. else version (OpenBSD)
  1462. {
  1463. int accept(int, scope sockaddr*, scope socklen_t*);
  1464. int bind(int, const scope sockaddr*, socklen_t);
  1465. int connect(int, const scope sockaddr*, socklen_t);
  1466. int getpeername(int, scope sockaddr*, scope socklen_t*);
  1467. int getsockname(int, scope sockaddr*, scope socklen_t*);
  1468. int getsockopt(int, int, int, scope void*, scope socklen_t*);
  1469. int listen(int, int) @safe;
  1470. ssize_t recv(int, scope void*, size_t, int);
  1471. ssize_t recvfrom(int, scope void*, size_t, int, scope sockaddr*, scope socklen_t*);
  1472. ssize_t recvmsg(int, scope msghdr*, int);
  1473. ssize_t send(int, const scope void*, size_t, int);
  1474. ssize_t sendmsg(int, const scope msghdr*, int);
  1475. ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
  1476. int setsockopt(int, int, int, const scope void*, socklen_t);
  1477. int shutdown(int, int) @safe;
  1478. int socket(int, int, int) @safe;
  1479. int sockatmark(int) @safe;
  1480. int socketpair(int, int, int, ref int[2]) @safe;
  1481. }
  1482. else version (DragonFlyBSD)
  1483. {
  1484. int accept(int, sockaddr*, socklen_t*);
  1485. // int accept4(int, sockaddr*, socklen_t*, int);
  1486. int bind(int, const scope sockaddr*, socklen_t);
  1487. int connect(int, const scope sockaddr*, socklen_t);
  1488. // int extconnect(int, int, sockaddr*, socklen_t);
  1489. int getpeername(int, sockaddr*, socklen_t*);
  1490. int getsockname(int, sockaddr*, socklen_t*);
  1491. int getsockopt(int, int, int, void*, socklen_t*);
  1492. int listen(int, int);
  1493. ssize_t recv(int, void*, size_t, int);
  1494. ssize_t recvfrom(int, void*, size_t, int, sockaddr*, socklen_t*);
  1495. ssize_t recvmsg(int, msghdr*, int);
  1496. ssize_t send(int, const scope void*, size_t, int);
  1497. ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
  1498. ssize_t sendmsg(int, const scope msghdr*, int);
  1499. // int sendfile(int, int, off_t, size_t, sf_hdtr *, off_t *, int);
  1500. int setsockopt(int, int, int, const scope void*, socklen_t);
  1501. int shutdown(int, int);
  1502. int sockatmark(int);
  1503. int socket(int, int, int);
  1504. int socketpair(int, int, int, ref int[2]);
  1505. // void pfctlinput(int, struct sockaddr *);
  1506. }
  1507. else version (Solaris)
  1508. {
  1509. int accept(int, scope sockaddr*, scope socklen_t*);
  1510. int bind(int, const scope sockaddr*, socklen_t);
  1511. int connect(int, const scope sockaddr*, socklen_t);
  1512. int getpeername(int, scope sockaddr*, scope socklen_t*);
  1513. int getsockname(int, scope sockaddr*, scope socklen_t*);
  1514. int getsockopt(int, int, int, scope void*, scope socklen_t*);
  1515. int listen(int, int) @safe;
  1516. ssize_t recv(int, scope void*, size_t, int);
  1517. ssize_t recvfrom(int, scope void*, size_t, int, scope sockaddr*, scope socklen_t*);
  1518. ssize_t recvmsg(int, scope msghdr*, int);
  1519. ssize_t send(int, const scope void*, size_t, int);
  1520. ssize_t sendmsg(int, const scope msghdr*, int);
  1521. ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
  1522. int setsockopt(int, int, int, const scope void*, socklen_t);
  1523. int shutdown(int, int) @safe;
  1524. int socket(int, int, int) @safe;
  1525. int sockatmark(int) @safe;
  1526. int socketpair(int, int, int, ref int[2]) @safe;
  1527. }
  1528. else version (CRuntime_Bionic)
  1529. {
  1530. int accept(int, scope sockaddr*, scope socklen_t*);
  1531. int bind(int, const scope sockaddr*, socklen_t);
  1532. int connect(int, const scope sockaddr*, socklen_t);
  1533. int getpeername(int, scope sockaddr*, scope socklen_t*);
  1534. int getsockname(int, scope sockaddr*, scope socklen_t*);
  1535. int getsockopt(int, int, int, scope void*, scope socklen_t*);
  1536. int listen(int, int) @safe;
  1537. ssize_t recv(int, scope void*, size_t, int);
  1538. ssize_t recvfrom(int, scope void*, size_t, int, scope sockaddr*, scope socklen_t*);
  1539. int recvmsg(int, scope msghdr*, int);
  1540. ssize_t send(int, const scope void*, size_t, int);
  1541. int sendmsg(int, const scope msghdr*, int);
  1542. ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
  1543. int setsockopt(int, int, int, const scope void*, socklen_t);
  1544. int shutdown(int, int) @safe;
  1545. int socket(int, int, int) @safe;
  1546. int sockatmark(int) @safe;
  1547. int socketpair(int, int, int, ref int[2]) @safe;
  1548. }
  1549. else version (CRuntime_Musl)
  1550. {
  1551. int accept(int, sockaddr*, socklen_t*);
  1552. int bind(int, const scope sockaddr*, socklen_t);
  1553. int connect(int, const scope sockaddr*, socklen_t);
  1554. int getpeername(int, sockaddr*, socklen_t*);
  1555. int getsockname(int, sockaddr*, socklen_t*);
  1556. int getsockopt(int, int, int, void*, socklen_t*);
  1557. int listen(int, int);
  1558. ssize_t recv(int, void*, size_t, int);
  1559. ssize_t recvfrom(int, void*, size_t, int, sockaddr*, socklen_t*);
  1560. ssize_t recvmsg(int, msghdr*, int);
  1561. ssize_t send(int, const scope void*, size_t, int);
  1562. ssize_t sendmsg(int, const scope msghdr*, int);
  1563. ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
  1564. int setsockopt(int, int, int, const scope void*, socklen_t);
  1565. int shutdown(int, int);
  1566. int socket(int, int, int);
  1567. int sockatmark(int);
  1568. int socketpair(int, int, int, ref int[2]);
  1569. }
  1570. else version (CRuntime_UClibc)
  1571. {
  1572. int accept(int, sockaddr*, socklen_t*);
  1573. int bind(int, const scope sockaddr*, socklen_t);
  1574. int connect(int, const scope sockaddr*, socklen_t);
  1575. int getpeername(int, sockaddr*, socklen_t*);
  1576. int getsockname(int, sockaddr*, socklen_t*);
  1577. int getsockopt(int, int, int, void*, socklen_t*);
  1578. int listen(int, int);
  1579. ssize_t recv(int, void*, size_t, int);
  1580. ssize_t recvfrom(int, void*, size_t, int, sockaddr*, socklen_t*);
  1581. ssize_t recvmsg(int, msghdr*, int);
  1582. ssize_t send(int, const scope void*, size_t, int);
  1583. ssize_t sendmsg(int, const scope msghdr*, int);
  1584. ssize_t sendto(int, const scope void*, size_t, int, const scope sockaddr*, socklen_t);
  1585. int setsockopt(int, int, int, const scope void*, socklen_t);
  1586. int shutdown(int, int);
  1587. int socket(int, int, int);
  1588. int sockatmark(int);
  1589. int socketpair(int, int, int, ref int[2]);
  1590. }
  1591. else
  1592. {
  1593. static assert(false, "Unsupported platform");
  1594. }
  1595. //
  1596. // IPV6 (IP6)
  1597. //
  1598. /*
  1599. AF_INET6
  1600. */
  1601. version (linux)
  1602. {
  1603. enum
  1604. {
  1605. AF_INET6 = 10
  1606. }
  1607. }
  1608. else version (Darwin)
  1609. {
  1610. enum
  1611. {
  1612. AF_INET6 = 30
  1613. }
  1614. }
  1615. else version (FreeBSD)
  1616. {
  1617. enum
  1618. {
  1619. AF_INET6 = 28
  1620. }
  1621. }
  1622. else version (NetBSD)
  1623. {
  1624. enum
  1625. {
  1626. AF_INET6 = 24
  1627. }
  1628. }
  1629. else version (OpenBSD)
  1630. {
  1631. enum
  1632. {
  1633. AF_INET6 = 24
  1634. }
  1635. }
  1636. else version (DragonFlyBSD)
  1637. {
  1638. enum
  1639. {
  1640. AF_INET6 = 28
  1641. }
  1642. }
  1643. else version (Solaris)
  1644. {
  1645. enum
  1646. {
  1647. AF_INET6 = 26,
  1648. }
  1649. }
  1650. else
  1651. {
  1652. static assert(false, "Unsupported platform");
  1653. }
  1654. //
  1655. // Raw Sockets (RS)
  1656. //
  1657. /*
  1658. SOCK_RAW
  1659. */
  1660. version (linux)
  1661. {
  1662. enum
  1663. {
  1664. SOCK_RAW = 3
  1665. }
  1666. }
  1667. else version (Darwin)
  1668. {
  1669. enum
  1670. {
  1671. SOCK_RAW = 3
  1672. }
  1673. }
  1674. else version (FreeBSD)
  1675. {
  1676. enum
  1677. {
  1678. SOCK_RAW = 3
  1679. }
  1680. }
  1681. else version (NetBSD)
  1682. {
  1683. enum
  1684. {
  1685. SOCK_RAW = 3
  1686. }
  1687. }
  1688. else version (OpenBSD)
  1689. {
  1690. enum
  1691. {
  1692. SOCK_RAW = 3
  1693. }
  1694. }
  1695. else version (DragonFlyBSD)
  1696. {
  1697. enum
  1698. {
  1699. SOCK_RAW = 3
  1700. }
  1701. }
  1702. else version (Solaris)
  1703. {
  1704. enum
  1705. {
  1706. SOCK_RAW = 4,
  1707. }
  1708. }
  1709. else
  1710. {
  1711. static assert(false, "Unsupported platform");
  1712. }