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 }