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