comparison tango/tango/sys/linux/socket.d @ 132:1700239cab2e trunk

[svn r136] MAJOR UNSTABLE UPDATE!!! Initial commit after moving to Tango instead of Phobos. Lots of bugfixes... This build is not suitable for most things.
author lindquist
date Fri, 11 Jan 2008 17:57:40 +0100
parents
children
comparison
equal deleted inserted replaced
131:5825d48b27d1 132:1700239cab2e
1 module tango.sys.linux.socket;
2
3 private import tango.stdc.stdint;
4 public import tango.stdc.posix.fcntl;
5 public import tango.stdc.posix.unistd; // for gethostname
6
7 extern(C):
8
9 alias int socklen_t;
10
11 int socket(int af, int type, int protocol);
12 int bind(int s, sockaddr* name, int namelen);
13 int connect(int s, sockaddr* name, int namelen);
14 int listen(int s, int backlog);
15 int accept(int s, sockaddr* addr, int* addrlen);
16 int shutdown(int s, int how);
17 int getpeername(int s, sockaddr* name, int* namelen);
18 int getsockname(int s, sockaddr* name, int* namelen);
19 int send(int s, void* buf, int len, int flags);
20 int sendto(int s, void* buf, int len, int flags, sockaddr* to, int tolen);
21 int recv(int s, void* buf, int len, int flags);
22 int recvfrom(int s, void* buf, int len, int flags, sockaddr* from, int* fromlen);
23 int getsockopt(int s, int level, int optname, void* optval, int* optlen);
24 int setsockopt(int s, int level, int optname, void* optval, int optlen);
25 uint inet_addr(char* cp);
26 char* inet_ntoa(in_addr ina);
27 hostent* gethostbyname(char* name);
28 hostent* gethostbyaddr(void* addr, int len, int type);
29 protoent* getprotobyname(char* name);
30 protoent* getprotobynumber(int number);
31 servent* getservbyname(char* name, char* proto);
32 servent* getservbyport(int port, char* proto);
33 int getaddrinfo(char* nodename, char* servname, addrinfo* hints, addrinfo** res);
34 void freeaddrinfo(addrinfo* ai);
35 int getnameinfo(sockaddr* sa, socklen_t salen, char* node, socklen_t nodelen, char* service, socklen_t servicelen, int flags);
36
37
38 enum: int
39 {
40 AF_UNSPEC = 0,
41 AF_UNIX = 1,
42 AF_INET = 2,
43 AF_IPX = 4,
44 AF_APPLETALK = 5,
45 AF_INET6 = 10,
46 // ...
47
48 PF_UNSPEC = AF_UNSPEC,
49 PF_UNIX = AF_UNIX,
50 PF_INET = AF_INET,
51 PF_IPX = AF_IPX,
52 PF_APPLETALK = AF_APPLETALK,
53 PF_INET6 = AF_INET6,
54 }
55
56
57 version( X86 )
58 {
59 enum: int
60 {
61 SOL_SOCKET = 1,
62 }
63 }
64 else version( X86_64 )
65 {
66 enum: int
67 {
68 SOL_SOCKET = 1,
69 }
70 }else
71 {
72 // Different values on other platforms.
73 static assert(0);
74 }
75
76
77 enum: int
78 {
79 SO_DEBUG = 1,
80 SO_BROADCAST = 6,
81 SO_REUSEADDR = 2,
82 SO_LINGER = 13,
83 SO_DONTLINGER = ~SO_LINGER,
84 SO_OOBINLINE = 10,
85 SO_SNDBUF = 7,
86 SO_RCVBUF = 8,
87 SO_ACCEPTCONN = 30,
88 SO_DONTROUTE = 5,
89 SO_TYPE = 3,
90
91 TCP_NODELAY = 1,
92
93 IP_MULTICAST_LOOP = 34,
94 IP_ADD_MEMBERSHIP = 35,
95 IP_DROP_MEMBERSHIP = 36,
96
97 // ...
98
99 IPV6_ADDRFORM = 1,
100 IPV6_PKTINFO = 2,
101 IPV6_HOPOPTS = 3,
102 IPV6_DSTOPTS = 4,
103 IPV6_RTHDR = 5,
104 IPV6_PKTOPTIONS = 6,
105 IPV6_CHECKSUM = 7,
106 IPV6_HOPLIMIT = 8,
107 IPV6_NEXTHOP = 9,
108 IPV6_AUTHHDR = 10,
109 IPV6_UNICAST_HOPS = 16,
110 IPV6_MULTICAST_IF = 17,
111 IPV6_MULTICAST_HOPS = 18,
112 IPV6_MULTICAST_LOOP = 19,
113 IPV6_JOIN_GROUP = 20,
114 IPV6_LEAVE_GROUP = 21,
115 IPV6_ROUTER_ALERT = 22,
116 IPV6_MTU_DISCOVER = 23,
117 IPV6_MTU = 24,
118 IPV6_RECVERR = 25,
119 IPV6_V6ONLY = 26,
120 IPV6_JOIN_ANYCAST = 27,
121 IPV6_LEAVE_ANYCAST = 28,
122 IPV6_IPSEC_POLICY = 34,
123 IPV6_XFRM_POLICY = 35,
124 }
125
126
127 struct linger
128 {
129 int32_t l_onoff;
130 int32_t l_linger;
131 }
132
133
134 struct protoent
135 {
136 char* p_name;
137 char** p_aliases;
138 int32_t p_proto;
139 }
140
141
142 struct servent
143 {
144 char* s_name;
145 char** s_aliases;
146 int32_t s_port;
147 char* s_proto;
148 }
149
150
151 version( BigEndian )
152 {
153 uint16_t htons(uint16_t x)
154 {
155 return x;
156 }
157
158
159 uint32_t htonl(uint32_t x)
160 {
161 return x;
162 }
163 }
164 else version( LittleEndian )
165 {
166 private import tango.core.BitManip;
167
168
169 uint16_t htons(uint16_t x)
170 {
171 return cast(uint16_t) ((x >> 8) | (x << 8));
172 }
173
174
175 uint32_t htonl(uint32_t x)
176 {
177 return bswap(x);
178 }
179 }
180 else
181 {
182 static assert(0);
183 }
184
185
186 uint16_t ntohs(uint16_t x)
187 {
188 return htons(x);
189 }
190
191
192 uint32_t ntohl(uint32_t x)
193 {
194 return htonl(x);
195 }
196
197
198 enum: int
199 {
200 SOCK_STREAM = 1,
201 SOCK_DGRAM = 2,
202 SOCK_RAW = 3,
203 SOCK_RDM = 4,
204 SOCK_SEQPACKET = 5,
205 }
206
207
208 enum: int
209 {
210 IPPROTO_IP = 0,
211 IPPROTO_ICMP = 1,
212 IPPROTO_IGMP = 2,
213 IPPROTO_GGP = 3,
214 IPPROTO_TCP = 6,
215 IPPROTO_PUP = 12,
216 IPPROTO_UDP = 17,
217 IPPROTO_IDP = 22,
218 IPPROTO_IPV6 = 41,
219 IPPROTO_ND = 77,
220 IPPROTO_RAW = 255,
221
222 IPPROTO_MAX = 256,
223 }
224
225
226 enum: int
227 {
228 MSG_OOB = 0x1,
229 MSG_PEEK = 0x2,
230 MSG_DONTROUTE = 0x4,
231 }
232
233
234 enum: int
235 {
236 SD_RECEIVE = 0,
237 SD_SEND = 1,
238 SD_BOTH = 2,
239 }
240
241
242 enum: uint
243 {
244 INADDR_ANY = 0,
245 INADDR_LOOPBACK = 0x7F000001,
246 INADDR_BROADCAST = 0xFFFFFFFF,
247 INADDR_NONE = 0xFFFFFFFF,
248 ADDR_ANY = INADDR_ANY,
249 }
250
251
252 enum: int
253 {
254 AI_PASSIVE = 0x1,
255 AI_CANONNAME = 0x2,
256 AI_NUMERICHOST = 0x4,
257 }
258
259
260 union in_addr
261 {
262 private union _S_un_t
263 {
264 private struct _S_un_b_t
265 {
266 uint8_t s_b1, s_b2, s_b3, s_b4;
267 }
268 _S_un_b_t S_un_b;
269
270 private struct _S_un_w_t
271 {
272 uint16_t s_w1, s_w2;
273 }
274 _S_un_w_t S_un_w;
275
276 uint32_t S_addr;
277 }
278 _S_un_t S_un;
279
280 uint32_t s_addr;
281
282 struct
283 {
284 uint8_t s_net, s_host;
285
286 union
287 {
288 uint16_t s_imp;
289
290 struct
291 {
292 uint8_t s_lh, s_impno;
293 }
294 }
295 }
296 }
297
298
299 union in6_addr
300 {
301 private union _in6_u_t
302 {
303 uint8_t[16] u6_addr8;
304 uint16_t[8] u6_addr16;
305 uint32_t[4] u6_addr32;
306 }
307 _in6_u_t in6_u;
308
309 uint8_t[16] s6_addr8;
310 uint16_t[8] s6_addr16;
311 uint32_t[4] s6_addr32;
312 }
313
314
315 const in6_addr IN6ADDR_ANY = { s6_addr8: [0] };
316 const in6_addr IN6ADDR_LOOPBACK = { s6_addr8: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1] };
317 //alias IN6ADDR_ANY IN6ADDR_ANY_INIT;
318 //alias IN6ADDR_LOOPBACK IN6ADDR_LOOPBACK_INIT;
319
320 const uint INET_ADDRSTRLEN = 16;
321 const uint INET6_ADDRSTRLEN = 46;
322
323
324 struct sockaddr
325 {
326 int16_t sa_family;
327 ubyte[14] sa_data;
328 }
329
330
331 struct sockaddr_in
332 {
333 int16_t sin_family = AF_INET;
334 uint16_t sin_port;
335 in_addr sin_addr;
336 ubyte[8] sin_zero;
337 }
338
339
340 struct sockaddr_in6
341 {
342 int16_t sin6_family = AF_INET6;
343 uint16_t sin6_port;
344 uint32_t sin6_flowinfo;
345 in6_addr sin6_addr;
346 uint32_t sin6_scope_id;
347 }
348
349
350 struct addrinfo
351 {
352 int32_t ai_flags;
353 int32_t ai_family;
354 int32_t ai_socktype;
355 int32_t ai_protocol;
356 size_t ai_addrlen;
357 sockaddr* ai_addr;
358 char* ai_canonname;
359 addrinfo* ai_next;
360 }
361
362
363 struct hostent
364 {
365 char* h_name;
366 char** h_aliases;
367 int32_t h_addrtype;
368 int32_t h_length;
369 char** h_addr_list;
370
371
372 char* h_addr()
373 {
374 return h_addr_list[0];
375 }
376 }
377