PageRenderTime 139ms CodeModel.GetById 79ms RepoModel.GetById 0ms app.codeStats 1ms

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

https://github.com/drewet/druntime
D | 1216 lines | 960 code | 110 blank | 146 comment | 23 complexity | 4c341c5607a231ad3163405d3f5923a0 MD5 | raw file
  1. /**
  2. * D header file for POSIX.
  3. *
  4. * Copyright: Copyright Sean Kelly 2005 - 2009.
  5. * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
  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, size_t
  17. public import core.sys.posix.sys.uio; // for iovec
  18. version (Posix):
  19. extern (C):
  20. //
  21. // Required
  22. //
  23. /*
  24. socklen_t
  25. sa_family_t
  26. struct sockaddr
  27. {
  28. sa_family_t sa_family;
  29. char sa_data[];
  30. }
  31. struct sockaddr_storage
  32. {
  33. sa_family_t ss_family;
  34. }
  35. struct msghdr
  36. {
  37. void* msg_name;
  38. socklen_t msg_namelen;
  39. struct iovec* msg_iov;
  40. int msg_iovlen;
  41. void* msg_control;
  42. socklen_t msg_controllen;
  43. int msg_flags;
  44. }
  45. struct iovec {} // from core.sys.posix.sys.uio
  46. struct cmsghdr
  47. {
  48. socklen_t cmsg_len;
  49. int cmsg_level;
  50. int cmsg_type;
  51. }
  52. SCM_RIGHTS
  53. CMSG_DATA(cmsg)
  54. CMSG_NXTHDR(mhdr,cmsg)
  55. CMSG_FIRSTHDR(mhdr)
  56. struct linger
  57. {
  58. int l_onoff;
  59. int l_linger;
  60. }
  61. SOCK_DGRAM
  62. SOCK_SEQPACKET
  63. SOCK_STREAM
  64. SOL_SOCKET
  65. SO_ACCEPTCONN
  66. SO_BROADCAST
  67. SO_DEBUG
  68. SO_DONTROUTE
  69. SO_ERROR
  70. SO_KEEPALIVE
  71. SO_LINGER
  72. SO_OOBINLINE
  73. SO_RCVBUF
  74. SO_RCVLOWAT
  75. SO_RCVTIMEO
  76. SO_REUSEADDR
  77. SO_SNDBUF
  78. SO_SNDLOWAT
  79. SO_SNDTIMEO
  80. SO_TYPE
  81. SOMAXCONN
  82. MSG_CTRUNC
  83. MSG_DONTROUTE
  84. MSG_EOR
  85. MSG_OOB
  86. MSG_PEEK
  87. MSG_TRUNC
  88. MSG_WAITALL
  89. AF_INET
  90. AF_UNIX
  91. AF_UNSPEC
  92. SHUT_RD
  93. SHUT_RDWR
  94. SHUT_WR
  95. int accept(int, sockaddr*, socklen_t*);
  96. int bind(int, in sockaddr*, socklen_t);
  97. int connect(int, in sockaddr*, socklen_t);
  98. int getpeername(int, sockaddr*, socklen_t*);
  99. int getsockname(int, sockaddr*, socklen_t*);
  100. int getsockopt(int, int, int, void*, socklen_t*);
  101. int listen(int, int);
  102. ssize_t recv(int, void*, size_t, int);
  103. ssize_t recvfrom(int, void*, size_t, int, sockaddr*, socklen_t*);
  104. ssize_t recvmsg(int, msghdr*, int);
  105. ssize_t send(int, in void*, size_t, int);
  106. ssize_t sendmsg(int, in msghdr*, int);
  107. ssize_t sendto(int, in void*, size_t, int, in sockaddr*, socklen_t);
  108. int setsockopt(int, int, int, in void*, socklen_t);
  109. int shutdown(int, int);
  110. int socket(int, int, int);
  111. int sockatmark(int);
  112. int socketpair(int, int, int, ref int[2]);
  113. */
  114. version( linux )
  115. {
  116. alias uint socklen_t;
  117. alias ushort sa_family_t;
  118. struct sockaddr
  119. {
  120. sa_family_t sa_family;
  121. byte[14] sa_data;
  122. }
  123. private enum : size_t
  124. {
  125. _SS_SIZE = 128,
  126. _SS_PADSIZE = _SS_SIZE - (c_ulong.sizeof * 2)
  127. }
  128. struct sockaddr_storage
  129. {
  130. sa_family_t ss_family;
  131. c_ulong __ss_align;
  132. byte[_SS_PADSIZE] __ss_padding;
  133. }
  134. struct msghdr
  135. {
  136. void* msg_name;
  137. socklen_t msg_namelen;
  138. iovec* msg_iov;
  139. size_t msg_iovlen;
  140. void* msg_control;
  141. size_t msg_controllen;
  142. int msg_flags;
  143. }
  144. struct cmsghdr
  145. {
  146. size_t cmsg_len;
  147. int cmsg_level;
  148. int cmsg_type;
  149. static if( false /* (!is( __STRICT_ANSI__ ) && __GNUC__ >= 2) || __STDC_VERSION__ >= 199901L */ )
  150. {
  151. ubyte[1] __cmsg_data;
  152. }
  153. }
  154. enum : uint
  155. {
  156. SCM_RIGHTS = 0x01
  157. }
  158. static if( false /* (!is( __STRICT_ANSI__ ) && __GNUC__ >= 2) || __STDC_VERSION__ >= 199901L */ )
  159. {
  160. extern (D) ubyte[1] CMSG_DATA( cmsghdr* cmsg ) { return cmsg.__cmsg_data; }
  161. }
  162. else
  163. {
  164. extern (D) ubyte* CMSG_DATA( cmsghdr* cmsg ) { return cast(ubyte*)( cmsg + 1 ); }
  165. }
  166. private cmsghdr* __cmsg_nxthdr(msghdr*, cmsghdr*);
  167. alias __cmsg_nxthdr CMSG_NXTHDR;
  168. extern (D) size_t CMSG_FIRSTHDR( msghdr* mhdr )
  169. {
  170. return cast(size_t)( mhdr.msg_controllen >= cmsghdr.sizeof
  171. ? cast(cmsghdr*) mhdr.msg_control
  172. : cast(cmsghdr*) null );
  173. }
  174. struct linger
  175. {
  176. int l_onoff;
  177. int l_linger;
  178. }
  179. version (X86)
  180. {
  181. enum
  182. {
  183. SOCK_DGRAM = 2,
  184. SOCK_SEQPACKET = 5,
  185. SOCK_STREAM = 1
  186. }
  187. enum
  188. {
  189. SOL_SOCKET = 1
  190. }
  191. enum
  192. {
  193. SO_ACCEPTCONN = 30,
  194. SO_BROADCAST = 6,
  195. SO_DEBUG = 1,
  196. SO_DONTROUTE = 5,
  197. SO_ERROR = 4,
  198. SO_KEEPALIVE = 9,
  199. SO_LINGER = 13,
  200. SO_OOBINLINE = 10,
  201. SO_RCVBUF = 8,
  202. SO_RCVLOWAT = 18,
  203. SO_RCVTIMEO = 20,
  204. SO_REUSEADDR = 2,
  205. SO_SNDBUF = 7,
  206. SO_SNDLOWAT = 19,
  207. SO_SNDTIMEO = 21,
  208. SO_TYPE = 3
  209. }
  210. }
  211. else version (X86_64)
  212. {
  213. enum
  214. {
  215. SOCK_DGRAM = 2,
  216. SOCK_SEQPACKET = 5,
  217. SOCK_STREAM = 1
  218. }
  219. enum
  220. {
  221. SOL_SOCKET = 1
  222. }
  223. enum
  224. {
  225. SO_ACCEPTCONN = 30,
  226. SO_BROADCAST = 6,
  227. SO_DEBUG = 1,
  228. SO_DONTROUTE = 5,
  229. SO_ERROR = 4,
  230. SO_KEEPALIVE = 9,
  231. SO_LINGER = 13,
  232. SO_OOBINLINE = 10,
  233. SO_RCVBUF = 8,
  234. SO_RCVLOWAT = 18,
  235. SO_RCVTIMEO = 20,
  236. SO_REUSEADDR = 2,
  237. SO_SNDBUF = 7,
  238. SO_SNDLOWAT = 19,
  239. SO_SNDTIMEO = 21,
  240. SO_TYPE = 3
  241. }
  242. }
  243. else version (MIPS32)
  244. {
  245. enum
  246. {
  247. SOCK_DGRAM = 1,
  248. SOCK_SEQPACKET = 5,
  249. SOCK_STREAM = 2,
  250. }
  251. enum
  252. {
  253. SOL_SOCKET = 0xffff
  254. }
  255. enum
  256. {
  257. SO_ACCEPTCONN = 0x1009,
  258. SO_BROADCAST = 0x0020,
  259. SO_DEBUG = 0x0001,
  260. SO_DONTROUTE = 0x0010,
  261. SO_ERROR = 0x1007,
  262. SO_KEEPALIVE = 0x0008,
  263. SO_LINGER = 0x0080,
  264. SO_OOBINLINE = 0x0100,
  265. SO_RCVBUF = 0x1002,
  266. SO_RCVLOWAT = 0x1004,
  267. SO_RCVTIMEO = 0x1006,
  268. SO_REUSEADDR = 0x0004,
  269. SO_SNDBUF = 0x1001,
  270. SO_SNDLOWAT = 0x1003,
  271. SO_SNDTIMEO = 0x1005,
  272. SO_TYPE = 0x1008,
  273. }
  274. }
  275. else version (MIPS64)
  276. {
  277. enum
  278. {
  279. SOCK_DGRAM = 1,
  280. SOCK_SEQPACKET = 5,
  281. SOCK_STREAM = 2,
  282. }
  283. enum
  284. {
  285. SOL_SOCKET = 0xffff
  286. }
  287. enum
  288. {
  289. SO_ACCEPTCONN = 0x1009,
  290. SO_BROADCAST = 0x0020,
  291. SO_DEBUG = 0x0001,
  292. SO_DONTROUTE = 0x0010,
  293. SO_ERROR = 0x1007,
  294. SO_KEEPALIVE = 0x0008,
  295. SO_LINGER = 0x0080,
  296. SO_OOBINLINE = 0x0100,
  297. SO_RCVBUF = 0x1002,
  298. SO_RCVLOWAT = 0x1004,
  299. SO_RCVTIMEO = 0x1006,
  300. SO_REUSEADDR = 0x0004,
  301. SO_SNDBUF = 0x1001,
  302. SO_SNDLOWAT = 0x1003,
  303. SO_SNDTIMEO = 0x1005,
  304. SO_TYPE = 0x1008,
  305. }
  306. }
  307. else version (PPC)
  308. {
  309. enum
  310. {
  311. SOCK_DGRAM = 2,
  312. SOCK_SEQPACKET = 5,
  313. SOCK_STREAM = 1
  314. }
  315. enum
  316. {
  317. SOL_SOCKET = 1
  318. }
  319. enum
  320. {
  321. SO_ACCEPTCONN = 30,
  322. SO_BROADCAST = 6,
  323. SO_DEBUG = 1,
  324. SO_DONTROUTE = 5,
  325. SO_ERROR = 4,
  326. SO_KEEPALIVE = 9,
  327. SO_LINGER = 13,
  328. SO_OOBINLINE = 10,
  329. SO_RCVBUF = 8,
  330. SO_RCVLOWAT = 16,
  331. SO_RCVTIMEO = 18,
  332. SO_REUSEADDR = 2,
  333. SO_SNDBUF = 7,
  334. SO_SNDLOWAT = 17,
  335. SO_SNDTIMEO = 19,
  336. SO_TYPE = 3
  337. }
  338. }
  339. else version (PPC64)
  340. {
  341. enum
  342. {
  343. SOCK_DGRAM = 2,
  344. SOCK_SEQPACKET = 5,
  345. SOCK_STREAM = 1
  346. }
  347. enum
  348. {
  349. SOL_SOCKET = 1
  350. }
  351. enum
  352. {
  353. SO_ACCEPTCONN = 30,
  354. SO_BROADCAST = 6,
  355. SO_DEBUG = 1,
  356. SO_DONTROUTE = 5,
  357. SO_ERROR = 4,
  358. SO_KEEPALIVE = 9,
  359. SO_LINGER = 13,
  360. SO_OOBINLINE = 10,
  361. SO_RCVBUF = 8,
  362. SO_RCVLOWAT = 16,
  363. SO_RCVTIMEO = 18,
  364. SO_REUSEADDR = 2,
  365. SO_SNDBUF = 7,
  366. SO_SNDLOWAT = 17,
  367. SO_SNDTIMEO = 19,
  368. SO_TYPE = 3
  369. }
  370. }
  371. else version (ARM)
  372. {
  373. enum
  374. {
  375. SOCK_DGRAM = 2,
  376. SOCK_SEQPACKET = 5,
  377. SOCK_STREAM = 1
  378. }
  379. enum
  380. {
  381. SOL_SOCKET = 1
  382. }
  383. enum
  384. {
  385. SO_ACCEPTCONN = 30,
  386. SO_BROADCAST = 6,
  387. SO_DEBUG = 1,
  388. SO_DONTROUTE = 5,
  389. SO_ERROR = 4,
  390. SO_KEEPALIVE = 9,
  391. SO_LINGER = 13,
  392. SO_OOBINLINE = 10,
  393. SO_RCVBUF = 8,
  394. SO_RCVLOWAT = 18,
  395. SO_RCVTIMEO = 20,
  396. SO_REUSEADDR = 2,
  397. SO_SNDBUF = 7,
  398. SO_SNDLOWAT = 19,
  399. SO_SNDTIMEO = 21,
  400. SO_TYPE = 3
  401. }
  402. }
  403. else
  404. static assert(0, "unimplemented");
  405. enum
  406. {
  407. SOMAXCONN = 128
  408. }
  409. enum : uint
  410. {
  411. MSG_CTRUNC = 0x08,
  412. MSG_DONTROUTE = 0x04,
  413. MSG_EOR = 0x80,
  414. MSG_OOB = 0x01,
  415. MSG_PEEK = 0x02,
  416. MSG_TRUNC = 0x20,
  417. MSG_WAITALL = 0x100
  418. }
  419. enum
  420. {
  421. AF_INET = 2,
  422. AF_UNIX = 1,
  423. AF_UNSPEC = 0
  424. }
  425. enum
  426. {
  427. SHUT_RD,
  428. SHUT_WR,
  429. SHUT_RDWR
  430. }
  431. int accept(int, sockaddr*, socklen_t*);
  432. int bind(int, in sockaddr*, socklen_t);
  433. int connect(int, in sockaddr*, socklen_t);
  434. int getpeername(int, sockaddr*, socklen_t*);
  435. int getsockname(int, sockaddr*, socklen_t*);
  436. int getsockopt(int, int, int, void*, socklen_t*);
  437. int listen(int, int);
  438. ssize_t recv(int, void*, size_t, int);
  439. ssize_t recvfrom(int, void*, size_t, int, sockaddr*, socklen_t*);
  440. ssize_t recvmsg(int, msghdr*, int);
  441. ssize_t send(int, in void*, size_t, int);
  442. ssize_t sendmsg(int, in msghdr*, int);
  443. ssize_t sendto(int, in void*, size_t, int, in sockaddr*, socklen_t);
  444. int setsockopt(int, int, int, in void*, socklen_t);
  445. int shutdown(int, int);
  446. int socket(int, int, int);
  447. int sockatmark(int);
  448. int socketpair(int, int, int, ref int[2]);
  449. }
  450. else version( OSX )
  451. {
  452. alias uint socklen_t;
  453. alias ubyte sa_family_t;
  454. struct sockaddr
  455. {
  456. ubyte sa_len;
  457. sa_family_t sa_family;
  458. byte[14] sa_data;
  459. }
  460. private enum : size_t
  461. {
  462. _SS_PAD1 = long.sizeof - ubyte.sizeof - sa_family_t.sizeof,
  463. _SS_PAD2 = 128 - ubyte.sizeof - sa_family_t.sizeof - _SS_PAD1 - long.sizeof
  464. }
  465. struct sockaddr_storage
  466. {
  467. ubyte ss_len;
  468. sa_family_t ss_family;
  469. byte[_SS_PAD1] __ss_pad1;
  470. long __ss_align;
  471. byte[_SS_PAD2] __ss_pad2;
  472. }
  473. struct msghdr
  474. {
  475. void* msg_name;
  476. socklen_t msg_namelen;
  477. iovec* msg_iov;
  478. int msg_iovlen;
  479. void* msg_control;
  480. socklen_t msg_controllen;
  481. int msg_flags;
  482. }
  483. struct cmsghdr
  484. {
  485. socklen_t cmsg_len;
  486. int cmsg_level;
  487. int cmsg_type;
  488. }
  489. enum : uint
  490. {
  491. SCM_RIGHTS = 0x01
  492. }
  493. /+
  494. CMSG_DATA(cmsg) ((unsigned char *)(cmsg) + \
  495. ALIGN(sizeof(struct cmsghdr)))
  496. CMSG_NXTHDR(mhdr, cmsg) \
  497. (((unsigned char *)(cmsg) + ALIGN((cmsg)->cmsg_len) + \
  498. ALIGN(sizeof(struct cmsghdr)) > \
  499. (unsigned char *)(mhdr)->msg_control +(mhdr)->msg_controllen) ? \
  500. (struct cmsghdr *)0 /* NULL */ : \
  501. (struct cmsghdr *)((unsigned char *)(cmsg) + ALIGN((cmsg)->cmsg_len)))
  502. CMSG_FIRSTHDR(mhdr) ((struct cmsghdr *)(mhdr)->msg_control)
  503. +/
  504. struct linger
  505. {
  506. int l_onoff;
  507. int l_linger;
  508. }
  509. enum
  510. {
  511. SOCK_DGRAM = 2,
  512. SOCK_SEQPACKET = 5,
  513. SOCK_STREAM = 1
  514. }
  515. enum : uint
  516. {
  517. SOL_SOCKET = 0xffff
  518. }
  519. enum : uint
  520. {
  521. SO_ACCEPTCONN = 0x0002,
  522. SO_BROADCAST = 0x0020,
  523. SO_DEBUG = 0x0001,
  524. SO_DONTROUTE = 0x0010,
  525. SO_ERROR = 0x1007,
  526. SO_KEEPALIVE = 0x0008,
  527. SO_LINGER = 0x1080,
  528. SO_NOSIGPIPE = 0x1022, // non-standard
  529. SO_OOBINLINE = 0x0100,
  530. SO_RCVBUF = 0x1002,
  531. SO_RCVLOWAT = 0x1004,
  532. SO_RCVTIMEO = 0x1006,
  533. SO_REUSEADDR = 0x0004,
  534. SO_SNDBUF = 0x1001,
  535. SO_SNDLOWAT = 0x1003,
  536. SO_SNDTIMEO = 0x1005,
  537. SO_TYPE = 0x1008
  538. }
  539. enum
  540. {
  541. SOMAXCONN = 128
  542. }
  543. enum : uint
  544. {
  545. MSG_CTRUNC = 0x20,
  546. MSG_DONTROUTE = 0x4,
  547. MSG_EOR = 0x8,
  548. MSG_OOB = 0x1,
  549. MSG_PEEK = 0x2,
  550. MSG_TRUNC = 0x10,
  551. MSG_WAITALL = 0x40
  552. }
  553. enum
  554. {
  555. AF_INET = 2,
  556. AF_UNIX = 1,
  557. AF_UNSPEC = 0
  558. }
  559. enum
  560. {
  561. SHUT_RD,
  562. SHUT_WR,
  563. SHUT_RDWR
  564. }
  565. int accept(int, sockaddr*, socklen_t*);
  566. int bind(int, in sockaddr*, socklen_t);
  567. int connect(int, in sockaddr*, socklen_t);
  568. int getpeername(int, sockaddr*, socklen_t*);
  569. int getsockname(int, sockaddr*, socklen_t*);
  570. int getsockopt(int, int, int, void*, socklen_t*);
  571. int listen(int, int);
  572. ssize_t recv(int, void*, size_t, int);
  573. ssize_t recvfrom(int, void*, size_t, int, sockaddr*, socklen_t*);
  574. ssize_t recvmsg(int, msghdr*, int);
  575. ssize_t send(int, in void*, size_t, int);
  576. ssize_t sendmsg(int, in msghdr*, int);
  577. ssize_t sendto(int, in void*, size_t, int, in sockaddr*, socklen_t);
  578. int setsockopt(int, int, int, in void*, socklen_t);
  579. int shutdown(int, int);
  580. int socket(int, int, int);
  581. int sockatmark(int);
  582. int socketpair(int, int, int, ref int[2]);
  583. }
  584. else version( FreeBSD )
  585. {
  586. alias uint socklen_t;
  587. alias ubyte sa_family_t;
  588. struct sockaddr
  589. {
  590. ubyte sa_len;
  591. sa_family_t sa_family;
  592. byte[14] sa_data;
  593. }
  594. private
  595. {
  596. enum _SS_ALIGNSIZE = long.sizeof;
  597. enum _SS_MAXSIZE = 128;
  598. enum _SS_PAD1SIZE = _SS_ALIGNSIZE - ubyte.sizeof - sa_family_t.sizeof;
  599. enum _SS_PAD2SIZE = _SS_MAXSIZE - ubyte.sizeof - sa_family_t.sizeof - _SS_PAD1SIZE - _SS_ALIGNSIZE;
  600. }
  601. struct sockaddr_storage
  602. {
  603. ubyte ss_len;
  604. sa_family_t ss_family;
  605. byte[_SS_PAD1SIZE] __ss_pad1;
  606. long __ss_align;
  607. byte[_SS_PAD2SIZE] __ss_pad2;
  608. }
  609. struct msghdr
  610. {
  611. void* msg_name;
  612. socklen_t msg_namelen;
  613. iovec* msg_iov;
  614. int msg_iovlen;
  615. void* msg_control;
  616. socklen_t msg_controllen;
  617. int msg_flags;
  618. }
  619. struct cmsghdr
  620. {
  621. socklen_t cmsg_len;
  622. int cmsg_level;
  623. int cmsg_type;
  624. }
  625. enum : uint
  626. {
  627. SCM_RIGHTS = 0x01
  628. }
  629. private // <machine/param.h>
  630. {
  631. enum _ALIGNBYTES = /+c_int+/ int.sizeof - 1;
  632. extern (D) size_t _ALIGN( size_t p ) { return (p + _ALIGNBYTES) & ~_ALIGNBYTES; }
  633. }
  634. extern (D) ubyte* CMSG_DATA( cmsghdr* cmsg )
  635. {
  636. return cast(ubyte*) cmsg + _ALIGN( cmsghdr.sizeof );
  637. }
  638. extern (D) cmsghdr* CMSG_NXTHDR( msghdr* mhdr, cmsghdr* cmsg )
  639. {
  640. if( cmsg == null )
  641. {
  642. return CMSG_FIRSTHDR( mhdr );
  643. }
  644. else
  645. {
  646. if( cast(ubyte*) cmsg + _ALIGN( cmsg.cmsg_len ) + _ALIGN( cmsghdr.sizeof ) >
  647. cast(ubyte*) mhdr.msg_control + mhdr.msg_controllen )
  648. return null;
  649. else
  650. return cast(cmsghdr*) (cast(ubyte*) cmsg + _ALIGN( cmsg.cmsg_len ));
  651. }
  652. }
  653. extern (D) cmsghdr* CMSG_FIRSTHDR( msghdr* mhdr )
  654. {
  655. return mhdr.msg_controllen >= cmsghdr.sizeof ? cast(cmsghdr*) mhdr.msg_control : null;
  656. }
  657. struct linger
  658. {
  659. int l_onoff;
  660. int l_linger;
  661. }
  662. enum
  663. {
  664. SOCK_DGRAM = 2,
  665. SOCK_SEQPACKET = 5,
  666. SOCK_STREAM = 1
  667. }
  668. enum : uint
  669. {
  670. SOL_SOCKET = 0xffff
  671. }
  672. enum : uint
  673. {
  674. SO_ACCEPTCONN = 0x0002,
  675. SO_BROADCAST = 0x0020,
  676. SO_DEBUG = 0x0001,
  677. SO_DONTROUTE = 0x0010,
  678. SO_ERROR = 0x1007,
  679. SO_KEEPALIVE = 0x0008,
  680. SO_LINGER = 0x0080,
  681. SO_NOSIGPIPE = 0x0800, // non-standard
  682. SO_OOBINLINE = 0x0100,
  683. SO_RCVBUF = 0x1002,
  684. SO_RCVLOWAT = 0x1004,
  685. SO_RCVTIMEO = 0x1006,
  686. SO_REUSEADDR = 0x0004,
  687. SO_SNDBUF = 0x1001,
  688. SO_SNDLOWAT = 0x1003,
  689. SO_SNDTIMEO = 0x1005,
  690. SO_TYPE = 0x1008
  691. }
  692. enum
  693. {
  694. SOMAXCONN = 128
  695. }
  696. enum : uint
  697. {
  698. MSG_CTRUNC = 0x20,
  699. MSG_DONTROUTE = 0x4,
  700. MSG_EOR = 0x8,
  701. MSG_OOB = 0x1,
  702. MSG_PEEK = 0x2,
  703. MSG_TRUNC = 0x10,
  704. MSG_WAITALL = 0x40
  705. }
  706. enum
  707. {
  708. AF_INET = 2,
  709. AF_UNIX = 1,
  710. AF_UNSPEC = 0
  711. }
  712. enum
  713. {
  714. SHUT_RD = 0,
  715. SHUT_WR = 1,
  716. SHUT_RDWR = 2
  717. }
  718. int accept(int, sockaddr*, socklen_t*);
  719. int bind(int, in sockaddr*, socklen_t);
  720. int connect(int, in sockaddr*, socklen_t);
  721. int getpeername(int, sockaddr*, socklen_t*);
  722. int getsockname(int, sockaddr*, socklen_t*);
  723. int getsockopt(int, int, int, void*, socklen_t*);
  724. int listen(int, int);
  725. ssize_t recv(int, void*, size_t, int);
  726. ssize_t recvfrom(int, void*, size_t, int, sockaddr*, socklen_t*);
  727. ssize_t recvmsg(int, msghdr*, int);
  728. ssize_t send(int, in void*, size_t, int);
  729. ssize_t sendmsg(int, in msghdr*, int);
  730. ssize_t sendto(int, in void*, size_t, int, in sockaddr*, socklen_t);
  731. int setsockopt(int, int, int, in void*, socklen_t);
  732. int shutdown(int, int);
  733. int socket(int, int, int);
  734. int sockatmark(int);
  735. int socketpair(int, int, int, ref int[2]);
  736. }
  737. else version (Solaris)
  738. {
  739. alias uint socklen_t;
  740. alias ushort sa_family_t;
  741. struct sockaddr
  742. {
  743. sa_family_t sa_family;
  744. char[14] sa_data;
  745. }
  746. alias double sockaddr_maxalign_t;
  747. private enum _SS_PAD1SIZE = sockaddr_maxalign_t.sizeof - sa_family_t.sizeof;
  748. private enum _SS_PAD2SIZE = 256 - sa_family_t.sizeof + _SS_PAD1SIZE + sockaddr_maxalign_t.sizeof;
  749. struct sockaddr_storage
  750. {
  751. sa_family_t ss_family;
  752. char[_SS_PAD1SIZE] _ss_pad1;
  753. sockaddr_maxalign_t _ss_align;
  754. char[_SS_PAD2SIZE] _ss_pad2;
  755. }
  756. struct msghdr
  757. {
  758. void* msg_name;
  759. socklen_t msg_namelen;
  760. iovec* msg_iov;
  761. int msg_iovlen;
  762. void* msg_control;
  763. socklen_t msg_controllen;
  764. int msg_flags;
  765. }
  766. struct cmsghdr
  767. {
  768. socklen_t cmsg_len;
  769. int cmsg_level;
  770. int cmsg_type;
  771. }
  772. enum : uint
  773. {
  774. SCM_RIGHTS = 0x1011
  775. }
  776. struct linger
  777. {
  778. int l_onoff;
  779. int l_linger;
  780. }
  781. enum
  782. {
  783. SOCK_STREAM = 2,
  784. SOCK_DGRAM = 1,
  785. SOCK_RDM = 5,
  786. SOCK_SEQPACKET = 6,
  787. }
  788. enum : uint
  789. {
  790. SOL_SOCKET = 0xffff
  791. }
  792. enum : uint
  793. {
  794. SO_ACCEPTCONN = 0x0002,
  795. SO_BROADCAST = 0x0020,
  796. SO_DEBUG = 0x0001,
  797. SO_DONTROUTE = 0x0010,
  798. SO_ERROR = 0x1007,
  799. SO_KEEPALIVE = 0x0008,
  800. SO_LINGER = 0x0080,
  801. SO_OOBINLINE = 0x0100,
  802. SO_RCVBUF = 0x1002,
  803. SO_RCVLOWAT = 0x1004,
  804. SO_RCVTIMEO = 0x1006,
  805. SO_REUSEADDR = 0x0004,
  806. SO_SNDBUF = 0x1001,
  807. SO_SNDLOWAT = 0x1003,
  808. SO_SNDTIMEO = 0x1005,
  809. SO_TYPE = 0x1008
  810. }
  811. enum
  812. {
  813. SOMAXCONN = 128
  814. }
  815. enum : uint
  816. {
  817. MSG_CTRUNC = 0x10,
  818. MSG_DONTROUTE = 0x4,
  819. MSG_EOR = 0x8,
  820. MSG_OOB = 0x1,
  821. MSG_PEEK = 0x2,
  822. MSG_TRUNC = 0x20,
  823. MSG_WAITALL = 0x40
  824. }
  825. enum
  826. {
  827. AF_INET = 2,
  828. AF_UNIX = 1,
  829. AF_UNSPEC = 0
  830. }
  831. enum
  832. {
  833. SHUT_RD,
  834. SHUT_WR,
  835. SHUT_RDWR
  836. }
  837. int accept(int, sockaddr*, socklen_t*);
  838. int bind(int, in sockaddr*, socklen_t);
  839. int connect(int, in sockaddr*, socklen_t);
  840. int getpeername(int, sockaddr*, socklen_t*);
  841. int getsockname(int, sockaddr*, socklen_t*);
  842. int getsockopt(int, int, int, void*, socklen_t*);
  843. int listen(int, int);
  844. ssize_t recv(int, void*, size_t, int);
  845. ssize_t recvfrom(int, void*, size_t, int, sockaddr*, socklen_t*);
  846. ssize_t recvmsg(int, msghdr*, int);
  847. ssize_t send(int, in void*, size_t, int);
  848. ssize_t sendmsg(int, in msghdr*, int);
  849. ssize_t sendto(int, in void*, size_t, int, in sockaddr*, socklen_t);
  850. int setsockopt(int, int, int, in void*, socklen_t);
  851. int shutdown(int, int);
  852. int socket(int, int, int);
  853. int sockatmark(int);
  854. int socketpair(int, int, int, ref int[2]);
  855. }
  856. else version( Android )
  857. {
  858. alias int socklen_t;
  859. alias ushort sa_family_t;
  860. struct sockaddr
  861. {
  862. sa_family_t sa_family;
  863. byte[14] sa_data;
  864. }
  865. private enum size_t _K_SS_MAXSIZE = 128;
  866. struct sockaddr_storage
  867. {
  868. ushort ss_family;
  869. byte[_K_SS_MAXSIZE - ushort.sizeof] __data;
  870. }
  871. enum : uint
  872. {
  873. SCM_RIGHTS = 0x01
  874. }
  875. private enum _ALIGNBYTES = c_long.sizeof - 1;
  876. extern (D)
  877. {
  878. size_t CMSG_ALIGN( size_t len )
  879. {
  880. return (len + _ALIGNBYTES) & ~_ALIGNBYTES;
  881. }
  882. void* CMSG_DATA( cmsghdr* cmsg )
  883. {
  884. return cast(void*) (cast(char*) cmsg + CMSG_ALIGN( cmsghdr.sizeof ));
  885. }
  886. cmsghdr* CMSG_NXTHDR( msghdr* mhdr, cmsghdr* cmsg )
  887. {
  888. cmsghdr* __ptr = cast(cmsghdr*) ((cast(ubyte*) cmsg) + CMSG_ALIGN(cmsg.cmsg_len));
  889. return cast(c_ulong)( cast(char*)(__ptr+1) - cast(char*) mhdr.msg_control) > mhdr.msg_controllen ? null : __ptr;
  890. }
  891. cmsghdr* CMSG_FIRSTHDR( msghdr* mhdr )
  892. {
  893. return mhdr.msg_controllen >= cmsghdr.sizeof ? cast(cmsghdr*) mhdr.msg_control : null;
  894. }
  895. }
  896. struct linger
  897. {
  898. int l_onoff;
  899. int l_linger;
  900. }
  901. version (X86)
  902. {
  903. struct msghdr
  904. {
  905. void* msg_name;
  906. int msg_namelen;
  907. iovec* msg_iov;
  908. uint msg_iovlen;
  909. void* msg_control;
  910. uint msg_controllen;
  911. uint msg_flags;
  912. }
  913. struct cmsghdr
  914. {
  915. uint cmsg_len;
  916. int cmsg_level;
  917. int cmsg_type;
  918. }
  919. enum
  920. {
  921. SOCK_DGRAM = 2,
  922. SOCK_SEQPACKET = 5,
  923. SOCK_STREAM = 1
  924. }
  925. enum
  926. {
  927. SOL_SOCKET = 1
  928. }
  929. enum
  930. {
  931. SO_ACCEPTCONN = 30,
  932. SO_BROADCAST = 6,
  933. SO_DEBUG = 1,
  934. SO_DONTROUTE = 5,
  935. SO_ERROR = 4,
  936. SO_KEEPALIVE = 9,
  937. SO_LINGER = 13,
  938. SO_OOBINLINE = 10,
  939. SO_RCVBUF = 8,
  940. SO_RCVLOWAT = 18,
  941. SO_RCVTIMEO = 20,
  942. SO_REUSEADDR = 2,
  943. SO_SNDBUF = 7,
  944. SO_SNDLOWAT = 19,
  945. SO_SNDTIMEO = 21,
  946. SO_TYPE = 3
  947. }
  948. }
  949. else
  950. {
  951. static assert(false, "Architecture not supported.");
  952. }
  953. enum
  954. {
  955. SOMAXCONN = 128
  956. }
  957. enum : uint
  958. {
  959. MSG_CTRUNC = 0x08,
  960. MSG_DONTROUTE = 0x04,
  961. MSG_EOR = 0x80,
  962. MSG_OOB = 0x01,
  963. MSG_PEEK = 0x02,
  964. MSG_TRUNC = 0x20,
  965. MSG_WAITALL = 0x100
  966. }
  967. enum
  968. {
  969. AF_INET = 2,
  970. AF_UNIX = 1,
  971. AF_UNSPEC = 0
  972. }
  973. enum
  974. {
  975. SHUT_RD,
  976. SHUT_WR,
  977. SHUT_RDWR
  978. }
  979. int accept(int, sockaddr*, socklen_t*);
  980. int bind(int, in sockaddr*, int);
  981. int connect(int, in sockaddr*, socklen_t);
  982. int getpeername(int, sockaddr*, socklen_t*);
  983. int getsockname(int, sockaddr*, socklen_t*);
  984. int getsockopt(int, int, int, void*, socklen_t*);
  985. int listen(int, int);
  986. ssize_t recv(int, void*, size_t, uint);
  987. ssize_t recvfrom(int, void*, size_t, uint, in sockaddr*, socklen_t*);
  988. int recvmsg(int, msghdr*, uint);
  989. ssize_t send(int, in void*, size_t, uint);
  990. int sendmsg(int, in msghdr*, uint);
  991. ssize_t sendto(int, in void*, size_t, int, in sockaddr*, socklen_t);
  992. int setsockopt(int, int, int, in void*, socklen_t);
  993. int shutdown(int, int);
  994. int socket(int, int, int);
  995. int socketpair(int, int, int, ref int[2]);
  996. }
  997. else
  998. {
  999. static assert(false, "Unsupported platform");
  1000. }
  1001. //
  1002. // IPV6 (IP6)
  1003. //
  1004. /*
  1005. AF_INET6
  1006. */
  1007. version( linux )
  1008. {
  1009. enum
  1010. {
  1011. AF_INET6 = 10
  1012. }
  1013. }
  1014. else version( OSX )
  1015. {
  1016. enum
  1017. {
  1018. AF_INET6 = 30
  1019. }
  1020. }
  1021. else version( FreeBSD )
  1022. {
  1023. enum
  1024. {
  1025. AF_INET6 = 28
  1026. }
  1027. }
  1028. else version (Solaris)
  1029. {
  1030. enum
  1031. {
  1032. AF_INET6 = 26,
  1033. }
  1034. }
  1035. else version( Android )
  1036. {
  1037. enum
  1038. {
  1039. AF_INET6 = 10
  1040. }
  1041. }
  1042. else
  1043. {
  1044. static assert(false, "Unsupported platform");
  1045. }
  1046. //
  1047. // Raw Sockets (RS)
  1048. //
  1049. /*
  1050. SOCK_RAW
  1051. */
  1052. version( linux )
  1053. {
  1054. enum
  1055. {
  1056. SOCK_RAW = 3
  1057. }
  1058. }
  1059. else version( OSX )
  1060. {
  1061. enum
  1062. {
  1063. SOCK_RAW = 3
  1064. }
  1065. }
  1066. else version( FreeBSD )
  1067. {
  1068. enum
  1069. {
  1070. SOCK_RAW = 3
  1071. }
  1072. }
  1073. else version (Solaris)
  1074. {
  1075. enum
  1076. {
  1077. SOCK_RAW = 4,
  1078. }
  1079. }
  1080. else version( Android )
  1081. {
  1082. enum
  1083. {
  1084. SOCK_RAW = 3
  1085. }
  1086. }
  1087. else
  1088. {
  1089. static assert(false, "Unsupported platform");
  1090. }