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