PageRenderTime 28ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/dev/dmd2/src/druntime/src/core/sys/posix/sys/socket.d

http://github.com/soywiz/pspemu
D | 670 lines | 462 code | 62 blank | 146 comment | 11 complexity | 300f87412081a358ec5879033bfddf4e 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
  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_1_0.txt 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. extern (C):
  19. //
  20. // Required
  21. //
  22. /*
  23. socklen_t
  24. sa_family_t
  25. struct sockaddr
  26. {
  27. sa_family_t sa_family;
  28. char sa_data[];
  29. }
  30. struct sockaddr_storage
  31. {
  32. sa_family_t ss_family;
  33. }
  34. struct msghdr
  35. {
  36. void* msg_name;
  37. socklen_t msg_namelen;
  38. struct iovec* msg_iov;
  39. int msg_iovlen;
  40. void* msg_control;
  41. socklen_t msg_controllen;
  42. int msg_flags;
  43. }
  44. struct iovec {} // from core.sys.posix.sys.uio
  45. struct cmsghdr
  46. {
  47. socklen_t cmsg_len;
  48. int cmsg_level;
  49. int cmsg_type;
  50. }
  51. SCM_RIGHTS
  52. CMSG_DATA(cmsg)
  53. CMSG_NXTHDR(mhdr,cmsg)
  54. CMSG_FIRSTHDR(mhdr)
  55. struct linger
  56. {
  57. int l_onoff;
  58. int l_linger;
  59. }
  60. SOCK_DGRAM
  61. SOCK_SEQPACKET
  62. SOCK_STREAM
  63. SOL_SOCKET
  64. SO_ACCEPTCONN
  65. SO_BROADCAST
  66. SO_DEBUG
  67. SO_DONTROUTE
  68. SO_ERROR
  69. SO_KEEPALIVE
  70. SO_LINGER
  71. SO_OOBINLINE
  72. SO_RCVBUF
  73. SO_RCVLOWAT
  74. SO_RCVTIMEO
  75. SO_REUSEADDR
  76. SO_SNDBUF
  77. SO_SNDLOWAT
  78. SO_SNDTIMEO
  79. SO_TYPE
  80. SOMAXCONN
  81. MSG_CTRUNC
  82. MSG_DONTROUTE
  83. MSG_EOR
  84. MSG_OOB
  85. MSG_PEEK
  86. MSG_TRUNC
  87. MSG_WAITALL
  88. AF_INET
  89. AF_UNIX
  90. AF_UNSPEC
  91. SHUT_RD
  92. SHUT_RDWR
  93. SHUT_WR
  94. int accept(int, sockaddr*, socklen_t*);
  95. int bind(int, in sockaddr*, socklen_t);
  96. int connect(int, in sockaddr*, socklen_t);
  97. int getpeername(int, sockaddr*, socklen_t*);
  98. int getsockname(int, sockaddr*, socklen_t*);
  99. int getsockopt(int, int, int, void*, socklen_t*);
  100. int listen(int, int);
  101. ssize_t recv(int, void*, size_t, int);
  102. ssize_t recvfrom(int, void*, size_t, int, sockaddr*, socklen_t*);
  103. ssize_t recvmsg(int, msghdr*, int);
  104. ssize_t send(int, in void*, size_t, int);
  105. ssize_t sendmsg(int, in msghdr*, int);
  106. ssize_t sendto(int, in void*, size_t, int, in sockaddr*, socklen_t);
  107. int setsockopt(int, int, int, in void*, socklen_t);
  108. int shutdown(int, int);
  109. int socket(int, int, int);
  110. int sockatmark(int);
  111. int socketpair(int, int, int, ref int[2]);
  112. */
  113. version( linux )
  114. {
  115. alias uint socklen_t;
  116. alias ushort sa_family_t;
  117. struct sockaddr
  118. {
  119. sa_family_t sa_family;
  120. byte[14] sa_data;
  121. }
  122. private enum : size_t
  123. {
  124. _SS_SIZE = 128,
  125. _SS_PADSIZE = _SS_SIZE - (c_ulong.sizeof * 2)
  126. }
  127. struct sockaddr_storage
  128. {
  129. sa_family_t ss_family;
  130. c_ulong __ss_align;
  131. byte[_SS_PADSIZE] __ss_padding;
  132. }
  133. struct msghdr
  134. {
  135. void* msg_name;
  136. socklen_t msg_namelen;
  137. iovec* msg_iov;
  138. size_t msg_iovlen;
  139. void* msg_control;
  140. size_t msg_controllen;
  141. int msg_flags;
  142. }
  143. struct cmsghdr
  144. {
  145. size_t cmsg_len;
  146. int cmsg_level;
  147. int cmsg_type;
  148. static if( false /* (!is( __STRICT_ANSI__ ) && __GNUC__ >= 2) || __STDC_VERSION__ >= 199901L */ )
  149. {
  150. ubyte[1] __cmsg_data;
  151. }
  152. }
  153. enum : uint
  154. {
  155. SCM_RIGHTS = 0x01
  156. }
  157. static if( false /* (!is( __STRICT_ANSI__ ) && __GNUC__ >= 2) || __STDC_VERSION__ >= 199901L */ )
  158. {
  159. extern (D) ubyte[1] CMSG_DATA( cmsghdr* cmsg ) { return cmsg.__cmsg_data; }
  160. }
  161. else
  162. {
  163. extern (D) ubyte* CMSG_DATA( cmsghdr* cmsg ) { return cast(ubyte*)( cmsg + 1 ); }
  164. }
  165. private cmsghdr* __cmsg_nxthdr(msghdr*, cmsghdr*);
  166. alias __cmsg_nxthdr CMSG_NXTHDR;
  167. extern (D) size_t CMSG_FIRSTHDR( msghdr* mhdr )
  168. {
  169. return cast(size_t)( mhdr.msg_controllen >= cmsghdr.sizeof
  170. ? cast(cmsghdr*) mhdr.msg_control
  171. : cast(cmsghdr*) null );
  172. }
  173. struct linger
  174. {
  175. int l_onoff;
  176. int l_linger;
  177. }
  178. enum
  179. {
  180. SOCK_DGRAM = 2,
  181. SOCK_SEQPACKET = 5,
  182. SOCK_STREAM = 1
  183. }
  184. enum
  185. {
  186. SOL_SOCKET = 1
  187. }
  188. enum
  189. {
  190. SO_ACCEPTCONN = 30,
  191. SO_BROADCAST = 6,
  192. SO_DEBUG = 1,
  193. SO_DONTROUTE = 5,
  194. SO_ERROR = 4,
  195. SO_KEEPALIVE = 9,
  196. SO_LINGER = 13,
  197. SO_OOBINLINE = 10,
  198. SO_RCVBUF = 8,
  199. SO_RCVLOWAT = 18,
  200. SO_RCVTIMEO = 20,
  201. SO_REUSEADDR = 2,
  202. SO_SNDBUF = 7,
  203. SO_SNDLOWAT = 19,
  204. SO_SNDTIMEO = 21,
  205. SO_TYPE = 3
  206. }
  207. enum
  208. {
  209. SOMAXCONN = 128
  210. }
  211. enum : uint
  212. {
  213. MSG_CTRUNC = 0x08,
  214. MSG_DONTROUTE = 0x04,
  215. MSG_EOR = 0x80,
  216. MSG_OOB = 0x01,
  217. MSG_PEEK = 0x02,
  218. MSG_TRUNC = 0x20,
  219. MSG_WAITALL = 0x100
  220. }
  221. enum
  222. {
  223. AF_INET = 2,
  224. AF_UNIX = 1,
  225. AF_UNSPEC = 0
  226. }
  227. enum
  228. {
  229. SHUT_RD,
  230. SHUT_WR,
  231. SHUT_RDWR
  232. }
  233. int accept(int, sockaddr*, socklen_t*);
  234. int bind(int, in sockaddr*, socklen_t);
  235. int connect(int, in sockaddr*, socklen_t);
  236. int getpeername(int, sockaddr*, socklen_t*);
  237. int getsockname(int, sockaddr*, socklen_t*);
  238. int getsockopt(int, int, int, void*, socklen_t*);
  239. int listen(int, int);
  240. ssize_t recv(int, void*, size_t, int);
  241. ssize_t recvfrom(int, void*, size_t, int, sockaddr*, socklen_t*);
  242. ssize_t recvmsg(int, msghdr*, int);
  243. ssize_t send(int, in void*, size_t, int);
  244. ssize_t sendmsg(int, in msghdr*, int);
  245. ssize_t sendto(int, in void*, size_t, int, in sockaddr*, socklen_t);
  246. int setsockopt(int, int, int, in void*, socklen_t);
  247. int shutdown(int, int);
  248. int socket(int, int, int);
  249. int sockatmark(int);
  250. int socketpair(int, int, int, ref int[2]);
  251. }
  252. else version( OSX )
  253. {
  254. alias uint socklen_t;
  255. alias ubyte sa_family_t;
  256. struct sockaddr
  257. {
  258. ubyte sa_len;
  259. sa_family_t sa_family;
  260. byte[14] sa_data;
  261. }
  262. private enum : size_t
  263. {
  264. _SS_PAD1 = long.sizeof - ubyte.sizeof - sa_family_t.sizeof,
  265. _SS_PAD2 = 128 - ubyte.sizeof - sa_family_t.sizeof - _SS_PAD1 - long.sizeof
  266. }
  267. struct sockaddr_storage
  268. {
  269. ubyte ss_len;
  270. sa_family_t ss_family;
  271. byte[_SS_PAD1] __ss_pad1;
  272. long __ss_align;
  273. byte[_SS_PAD2] __ss_pad2;
  274. }
  275. struct msghdr
  276. {
  277. void* msg_name;
  278. socklen_t msg_namelen;
  279. iovec* msg_iov;
  280. int msg_iovlen;
  281. void* msg_control;
  282. socklen_t msg_controllen;
  283. int msg_flags;
  284. }
  285. struct cmsghdr
  286. {
  287. socklen_t cmsg_len;
  288. int cmsg_level;
  289. int cmsg_type;
  290. }
  291. enum : uint
  292. {
  293. SCM_RIGHTS = 0x01
  294. }
  295. /+
  296. CMSG_DATA(cmsg) ((unsigned char *)(cmsg) + \
  297. ALIGN(sizeof(struct cmsghdr)))
  298. CMSG_NXTHDR(mhdr, cmsg) \
  299. (((unsigned char *)(cmsg) + ALIGN((cmsg)->cmsg_len) + \
  300. ALIGN(sizeof(struct cmsghdr)) > \
  301. (unsigned char *)(mhdr)->msg_control +(mhdr)->msg_controllen) ? \
  302. (struct cmsghdr *)0 /* NULL */ : \
  303. (struct cmsghdr *)((unsigned char *)(cmsg) + ALIGN((cmsg)->cmsg_len)))
  304. CMSG_FIRSTHDR(mhdr) ((struct cmsghdr *)(mhdr)->msg_control)
  305. +/
  306. struct linger
  307. {
  308. int l_onoff;
  309. int l_linger;
  310. }
  311. enum
  312. {
  313. SOCK_DGRAM = 2,
  314. SOCK_SEQPACKET = 5,
  315. SOCK_STREAM = 1
  316. }
  317. enum : uint
  318. {
  319. SOL_SOCKET = 0xffff
  320. }
  321. enum : uint
  322. {
  323. SO_ACCEPTCONN = 0x0002,
  324. SO_BROADCAST = 0x0020,
  325. SO_DEBUG = 0x0001,
  326. SO_DONTROUTE = 0x0010,
  327. SO_ERROR = 0x1007,
  328. SO_KEEPALIVE = 0x0008,
  329. SO_LINGER = 0x1080,
  330. SO_NOSIGPIPE = 0x1022, // non-standard
  331. SO_OOBINLINE = 0x0100,
  332. SO_RCVBUF = 0x1002,
  333. SO_RCVLOWAT = 0x1004,
  334. SO_RCVTIMEO = 0x1006,
  335. SO_REUSEADDR = 0x0004,
  336. SO_SNDBUF = 0x1001,
  337. SO_SNDLOWAT = 0x1003,
  338. SO_SNDTIMEO = 0x1005,
  339. SO_TYPE = 0x1008
  340. }
  341. enum
  342. {
  343. SOMAXCONN = 128
  344. }
  345. enum : uint
  346. {
  347. MSG_CTRUNC = 0x20,
  348. MSG_DONTROUTE = 0x4,
  349. MSG_EOR = 0x8,
  350. MSG_OOB = 0x1,
  351. MSG_PEEK = 0x2,
  352. MSG_TRUNC = 0x10,
  353. MSG_WAITALL = 0x40
  354. }
  355. enum
  356. {
  357. AF_INET = 2,
  358. AF_UNIX = 1,
  359. AF_UNSPEC = 0
  360. }
  361. enum
  362. {
  363. SHUT_RD,
  364. SHUT_WR,
  365. SHUT_RDWR
  366. }
  367. int accept(int, sockaddr*, socklen_t*);
  368. int bind(int, in sockaddr*, socklen_t);
  369. int connect(int, in sockaddr*, socklen_t);
  370. int getpeername(int, sockaddr*, socklen_t*);
  371. int getsockname(int, sockaddr*, socklen_t*);
  372. int getsockopt(int, int, int, void*, socklen_t*);
  373. int listen(int, int);
  374. ssize_t recv(int, void*, size_t, int);
  375. ssize_t recvfrom(int, void*, size_t, int, sockaddr*, socklen_t*);
  376. ssize_t recvmsg(int, msghdr*, int);
  377. ssize_t send(int, in void*, size_t, int);
  378. ssize_t sendmsg(int, in msghdr*, int);
  379. ssize_t sendto(int, in void*, size_t, int, in sockaddr*, socklen_t);
  380. int setsockopt(int, int, int, in void*, socklen_t);
  381. int shutdown(int, int);
  382. int socket(int, int, int);
  383. int sockatmark(int);
  384. int socketpair(int, int, int, ref int[2]);
  385. }
  386. else version( FreeBSD )
  387. {
  388. alias uint socklen_t;
  389. alias ubyte sa_family_t;
  390. struct sockaddr
  391. {
  392. ubyte sa_len;
  393. sa_family_t sa_family;
  394. byte[14] sa_data;
  395. }
  396. private
  397. {
  398. enum _SS_ALIGNSIZE = long.sizeof;
  399. enum _SS_MAXSIZE = 128;
  400. enum _SS_PAD1SIZE = _SS_ALIGNSIZE - ubyte.sizeof - sa_family_t.sizeof;
  401. enum _SS_PAD2SIZE = _SS_MAXSIZE - ubyte.sizeof - sa_family_t.sizeof - _SS_PAD1SIZE - _SS_ALIGNSIZE;
  402. }
  403. struct sockaddr_storage
  404. {
  405. ubyte ss_len;
  406. sa_family_t ss_family;
  407. byte[_SS_PAD1SIZE] __ss_pad1;
  408. long __ss_align;
  409. byte[_SS_PAD2SIZE] __ss_pad2;
  410. }
  411. struct msghdr
  412. {
  413. void* msg_name;
  414. socklen_t msg_namelen;
  415. iovec* msg_iov;
  416. int msg_iovlen;
  417. void* msg_control;
  418. socklen_t msg_controllen;
  419. int msg_flags;
  420. }
  421. struct cmsghdr
  422. {
  423. socklen_t cmsg_len;
  424. int cmsg_level;
  425. int cmsg_type;
  426. }
  427. enum : uint
  428. {
  429. SCM_RIGHTS = 0x01
  430. }
  431. private // <machine/param.h>
  432. {
  433. enum _ALIGNBYTES = /+c_int+/ int.sizeof - 1;
  434. extern (D) size_t _ALIGN( size_t p ) { return (p + _ALIGNBYTES) & ~_ALIGNBYTES; }
  435. }
  436. extern (D) ubyte* CMSG_DATA( cmsghdr* cmsg )
  437. {
  438. return cast(ubyte*) cmsg + _ALIGN( cmsghdr.sizeof );
  439. }
  440. extern (D) cmsghdr* CMSG_NXTHDR( msghdr* mhdr, cmsghdr* cmsg )
  441. {
  442. if( cmsg == null )
  443. {
  444. return CMSG_FIRSTHDR( mhdr );
  445. }
  446. else
  447. {
  448. if( cast(ubyte*) cmsg + _ALIGN( cmsg.cmsg_len ) + _ALIGN( cmsghdr.sizeof ) >
  449. cast(ubyte*) mhdr.msg_control + mhdr.msg_controllen )
  450. return null;
  451. else
  452. return cast(cmsghdr*) (cast(ubyte*) cmsg + _ALIGN( cmsg.cmsg_len ));
  453. }
  454. }
  455. extern (D) cmsghdr* CMSG_FIRSTHDR( msghdr* mhdr )
  456. {
  457. return mhdr.msg_controllen >= cmsghdr.sizeof ? cast(cmsghdr*) mhdr.msg_control : null;
  458. }
  459. struct linger
  460. {
  461. int l_onoff;
  462. int l_linger;
  463. }
  464. enum
  465. {
  466. SOCK_DGRAM = 2,
  467. SOCK_SEQPACKET = 5,
  468. SOCK_STREAM = 1
  469. }
  470. enum : uint
  471. {
  472. SOL_SOCKET = 0xffff
  473. }
  474. enum : uint
  475. {
  476. SO_ACCEPTCONN = 0x0002,
  477. SO_BROADCAST = 0x0020,
  478. SO_DEBUG = 0x0001,
  479. SO_DONTROUTE = 0x0010,
  480. SO_ERROR = 0x1007,
  481. SO_KEEPALIVE = 0x0008,
  482. SO_LINGER = 0x0080,
  483. SO_NOSIGPIPE = 0x0800, // non-standard
  484. SO_OOBINLINE = 0x0100,
  485. SO_RCVBUF = 0x1002,
  486. SO_RCVLOWAT = 0x1004,
  487. SO_RCVTIMEO = 0x1006,
  488. SO_REUSEADDR = 0x0004,
  489. SO_SNDBUF = 0x1001,
  490. SO_SNDLOWAT = 0x1003,
  491. SO_SNDTIMEO = 0x1005,
  492. SO_TYPE = 0x1008
  493. }
  494. enum
  495. {
  496. SOMAXCONN = 128
  497. }
  498. enum : uint
  499. {
  500. MSG_CTRUNC = 0x20,
  501. MSG_DONTROUTE = 0x4,
  502. MSG_EOR = 0x8,
  503. MSG_OOB = 0x1,
  504. MSG_PEEK = 0x2,
  505. MSG_TRUNC = 0x10,
  506. MSG_WAITALL = 0x40
  507. }
  508. enum
  509. {
  510. AF_INET = 2,
  511. AF_UNIX = 1,
  512. AF_UNSPEC = 0
  513. }
  514. enum
  515. {
  516. SHUT_RD = 0,
  517. SHUT_WR = 1,
  518. SHUT_RDWR = 2
  519. }
  520. int accept(int, sockaddr*, socklen_t*);
  521. int bind(int, in sockaddr*, socklen_t);
  522. int connect(int, in sockaddr*, socklen_t);
  523. int getpeername(int, sockaddr*, socklen_t*);
  524. int getsockname(int, sockaddr*, socklen_t*);
  525. int getsockopt(int, int, int, void*, socklen_t*);
  526. int listen(int, int);
  527. ssize_t recv(int, void*, size_t, int);
  528. ssize_t recvfrom(int, void*, size_t, int, sockaddr*, socklen_t*);
  529. ssize_t recvmsg(int, msghdr*, int);
  530. ssize_t send(int, in void*, size_t, int);
  531. ssize_t sendmsg(int, in msghdr*, int);
  532. ssize_t sendto(int, in void*, size_t, int, in sockaddr*, socklen_t);
  533. int setsockopt(int, int, int, in void*, socklen_t);
  534. int shutdown(int, int);
  535. int socket(int, int, int);
  536. int sockatmark(int);
  537. int socketpair(int, int, int, ref int[2]);
  538. }
  539. //
  540. // IPV6 (IP6)
  541. //
  542. /*
  543. AF_INET6
  544. */
  545. version( linux )
  546. {
  547. enum
  548. {
  549. AF_INET6 = 10
  550. }
  551. }
  552. else version( OSX )
  553. {
  554. enum
  555. {
  556. AF_INET6 = 30
  557. }
  558. }
  559. else version( FreeBSD )
  560. {
  561. enum
  562. {
  563. AF_INET6 = 28
  564. }
  565. }
  566. //
  567. // Raw Sockets (RS)
  568. //
  569. /*
  570. SOCK_RAW
  571. */
  572. version( linux )
  573. {
  574. enum
  575. {
  576. SOCK_RAW = 3
  577. }
  578. }
  579. else version( OSX )
  580. {
  581. enum
  582. {
  583. SOCK_RAW = 3
  584. }
  585. }
  586. else version( FreeBSD )
  587. {
  588. enum
  589. {
  590. SOCK_RAW = 3
  591. }
  592. }