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
|
|
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
|