Mercurial > projects > ldc
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 |