comparison lphobos/std/c/linux/socket.d @ 1:c53b6e3fe49a trunk

[svn r5] Initial commit. Most things are very rough.
author lindquist
date Sat, 01 Sep 2007 21:43:27 +0200
parents
children 058d3925950e
comparison
equal deleted inserted replaced
0:a9e71648e74d 1:c53b6e3fe49a
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
334 const in6_addr IN6ADDR_ANY = { s6_addr8: [0] };
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