PageRenderTime 53ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/src/core/sys/posix/sys/socket.d

http://github.com/ldc-developers/druntime
D | 2353 lines | 1959 code | 221 blank | 173 comment | 51 complexity | 129b7b83f68220030f4cddb0c23d0219 MD5 | raw file

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

Large files files are truncated, but you can click here to view the full file