1 /**
2 * D header file for POSIX.
3 *
4 * Copyright: Copyright Sean Kelly 2005 - 2009.
5 * License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
6 * Authors: Sean Kelly
7 * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
8 */
9
10 /* Copyright Sean Kelly 2005 - 2009.
11 * Distributed under the Boost Software License, Version 1.0.
12 * (See accompanying file LICENSE or copy at
13 * http://www.boost.org/LICENSE_1_0.txt)
14 */
15 module core.sys.posix.arpa.inet;
16
17 import core.sys.posix.config;
18 public import core.stdc.inttypes; // for uint32_t, uint16_t
19 public import core.sys.posix.sys.socket; // for socklen_t
20
21 version (OSX)
22 version = Darwin;
23 else version (iOS)
24 version = Darwin;
25 else version (TVOS)
26 version = Darwin;
27 else version (WatchOS)
28 version = Darwin;
29
version(Posix)30 version (Posix):
31 extern (C) nothrow @nogc:
32
33 //
34 // Required
35 //
36 /*
37 NOTE: The following must must be defined in core.sys.posix.arpa.inet to break
38 a circular import: in_port_t, in_addr_t, struct in_addr, INET_ADDRSTRLEN.
39
40 in_port_t // from core.sys.posix.netinet.in_
41 in_addr_t // from core.sys.posix.netinet.in_
42
43 struct in_addr // from core.sys.posix.netinet.in_
44 INET_ADDRSTRLEN // from core.sys.posix.netinet.in_
45
46 uint32_t // from core.stdc.inttypes
47 uint16_t // from core.stdc.inttypes
48
49 uint32_t htonl(uint32_t);
50 uint16_t htons(uint16_t);
51 uint32_t ntohl(uint32_t);
52 uint16_t ntohs(uint16_t);
53
54 in_addr_t inet_addr(const scope char*);
55 char* inet_ntoa(in_addr);
56 // per spec: const char* inet_ntop(int, const void*, char*, socklen_t);
57 char* inet_ntop(int, const scope void*, char*, socklen_t);
58 int inet_pton(int, const scope char*, void*);
59 */
60
61 version (CRuntime_Glibc)
62 {
63 alias uint16_t in_port_t;
64 alias uint32_t in_addr_t;
65
66 struct in_addr
67 {
68 in_addr_t s_addr;
69 }
70
71 @trusted pure
72 {
73 uint32_t htonl(uint32_t);
74 uint16_t htons(uint16_t);
75 uint32_t ntohl(uint32_t);
76 uint16_t ntohs(uint16_t);
77 }
78
79 in_addr_t inet_addr(const scope char*);
80 char* inet_ntoa(in_addr);
81 const(char)* inet_ntop(int, const scope void*, char*, socklen_t);
82 int inet_pton(int, const scope char*, void*);
83 }
version(Darwin)84 else version (Darwin)
85 {
86 alias uint16_t in_port_t;
87 alias uint32_t in_addr_t;
88
89 struct in_addr
90 {
91 in_addr_t s_addr;
92 }
93
94 @trusted pure
95 {
96 uint32_t htonl(uint32_t);
97 uint16_t htons(uint16_t);
98 uint32_t ntohl(uint32_t);
99 uint16_t ntohs(uint16_t);
100 }
101
102 in_addr_t inet_addr(const scope char*);
103 char* inet_ntoa(in_addr);
104 const(char)* inet_ntop(int, const scope void*, char*, socklen_t);
105 int inet_pton(int, const scope char*, void*);
106 }
version(FreeBSD)107 else version (FreeBSD)
108 {
109 alias uint16_t in_port_t;
110 alias uint32_t in_addr_t;
111
112 struct in_addr
113 {
114 in_addr_t s_addr;
115 }
116
117 @trusted pure
118 {
119 uint32_t htonl(uint32_t);
120 uint16_t htons(uint16_t);
121 uint32_t ntohl(uint32_t);
122 uint16_t ntohs(uint16_t);
123 }
124
125 in_addr_t inet_addr(const scope char*);
126 char* inet_ntoa(in_addr);
127 const(char)* inet_ntop(int, const scope void*, char*, socklen_t);
128 int inet_pton(int, const scope char*, void*);
129 }
version(NetBSD)130 else version (NetBSD)
131 {
132 alias uint16_t in_port_t;
133 alias uint32_t in_addr_t;
134
135 struct in_addr
136 {
137 in_addr_t s_addr;
138 }
139
140 @trusted pure
141 {
142 uint32_t htonl(uint32_t);
143 uint16_t htons(uint16_t);
144 uint32_t ntohl(uint32_t);
145 uint16_t ntohs(uint16_t);
146 }
147
148 in_addr_t inet_addr(const scope char*);
149 char* inet_ntoa(in_addr);
150 const(char)* inet_ntop(int, const scope void*, char*, socklen_t);
151 int inet_pton(int, const scope char*, void*);
152 }
version(OpenBSD)153 else version (OpenBSD)
154 {
155 alias uint16_t in_port_t;
156 alias uint32_t in_addr_t;
157
158 struct in_addr
159 {
160 in_addr_t s_addr;
161 }
162
163 @safe pure extern (D)
164 {
165 version (BigEndian)
166 {
167 uint32_t htonl(uint32_t x) { return x; }
168 uint16_t htons(uint16_t x) { return x; }
169 }
170 else
171 {
172 import core.bitop : bswap, byteswap;
173
174 uint32_t htonl(uint32_t x) { return bswap(x); }
175 uint16_t htons(uint16_t x) { return byteswap(x); }
176 }
177 alias ntohl = htonl;
178 alias ntohs = htons;
179 }
180
181 in_addr_t inet_addr(const scope char*);
182 char* inet_ntoa(in_addr);
183 const(char)* inet_ntop(int, const scope void*, char*, socklen_t);
184 int inet_pton(int, const scope char*, void*);
185 }
version(DragonFlyBSD)186 else version (DragonFlyBSD)
187 {
188 alias uint16_t in_port_t;
189 alias uint32_t in_addr_t;
190
191 struct in_addr
192 {
193 in_addr_t s_addr;
194 }
195
196 @trusted pure
197 {
198 uint32_t htonl(uint32_t);
199 uint16_t htons(uint16_t);
200 uint32_t ntohl(uint32_t);
201 uint16_t ntohs(uint16_t);
202 }
203
204 in_addr_t inet_addr(const scope char*);
205 char* inet_ntoa(in_addr);
206 const(char)* inet_ntop(int, const scope void*, char*, socklen_t);
207 int inet_pton(int, const scope char*, void*);
208 }
version(Solaris)209 else version (Solaris)
210 {
211 alias uint16_t in_port_t;
212 alias uint32_t in_addr_t;
213
214 struct in_addr
215 {
216 in_addr_t s_addr;
217 }
218
219 @trusted pure
220 {
221 uint32_t htonl(uint32_t);
222 uint16_t htons(uint16_t);
223 uint32_t ntohl(uint32_t);
224 uint16_t ntohs(uint16_t);
225 }
226
227 in_addr_t inet_addr(const scope char*);
228 char* inet_ntoa(in_addr);
229 const(char)* inet_ntop(int, const scope void*, char*, socklen_t);
230 int inet_pton(int, const scope char*, void*);
231 }
version(CRuntime_Bionic)232 else version (CRuntime_Bionic)
233 {
234 alias uint32_t in_addr_t;
235
236 struct in_addr
237 {
238 in_addr_t s_addr;
239 }
240
241 @safe pure extern (D)
242 {
243 version (BigEndian)
244 {
245 uint32_t htonl(uint32_t x) { return x; }
246 uint16_t htons(uint16_t x) { return x; }
247 }
248 else
249 {
250 import core.bitop : bswap, byteswap;
251
252 uint32_t htonl(uint32_t x) { return bswap(x); }
253 uint16_t htons(uint16_t x) { return byteswap(x); }
254 }
255 alias ntohl = htonl;
256 alias ntohs = htons;
257 }
258
259 in_addr_t inet_addr(const scope char*);
260 char* inet_ntoa(in_addr);
261 const(char)* inet_ntop(int, const scope void*, char*, size_t);
262 int inet_pton(int, const scope char*, void*);
263 }
version(CRuntime_Musl)264 else version (CRuntime_Musl)
265 {
266 alias uint16_t in_port_t;
267 alias uint32_t in_addr_t;
268
269 struct in_addr
270 {
271 in_addr_t s_addr;
272 }
273
274 @trusted pure
275 {
276 uint32_t htonl(uint32_t);
277 uint16_t htons(uint16_t);
278 uint32_t ntohl(uint32_t);
279 uint16_t ntohs(uint16_t);
280 }
281
282 in_addr_t inet_addr(const scope char*);
283 char* inet_ntoa(in_addr);
284 const(char)* inet_ntop(int, const scope void*, char*, socklen_t);
285 int inet_pton(int, const scope char*, void*);
286 }
version(CRuntime_UClibc)287 else version (CRuntime_UClibc)
288 {
289 alias uint16_t in_port_t;
290 alias uint32_t in_addr_t;
291
292 struct in_addr
293 {
294 in_addr_t s_addr;
295 }
296
297 @trusted pure
298 {
299 uint32_t htonl(uint32_t);
300 uint16_t htons(uint16_t);
301 uint32_t ntohl(uint32_t);
302 uint16_t ntohs(uint16_t);
303 }
304
305 in_addr_t inet_addr(const scope char*);
306 char* inet_ntoa(in_addr);
307 const(char)* inet_ntop(int, const scope void*, char*, socklen_t);
308 int inet_pton(int, const scope char*, void*);
309 }
310
311 /*
312 NOTE: The following must must be defined in core.sys.posix.arpa.inet to break
313 a circular import: INET6_ADDRSTRLEN.
314
315 INET6_ADDRSTRLEN // from core.sys.posix.netinet.in_
316 */
317
318 enum INET_ADDRSTRLEN = 16;
319 enum INET6_ADDRSTRLEN = 46;
320