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