1 pub use self::os::*;
2 
3 #[cfg(any(target_os = "linux", target_os = "android"))]
4 mod os {
5     use libc::{self, c_int, uint8_t};
6 
7     pub const AF_UNIX: c_int  = libc::AF_UNIX;
8     pub const AF_LOCAL: c_int = libc::AF_LOCAL;
9     pub const AF_INET: c_int  = libc::AF_INET;
10     pub const AF_INET6: c_int = libc::AF_INET6;
11     pub const AF_NETLINK: c_int = libc::AF_NETLINK;
12     pub const AF_PACKET: c_int = libc::AF_PACKET;
13 
14     pub const SOCK_STREAM: c_int = libc::SOCK_STREAM;
15     pub const SOCK_DGRAM: c_int = libc::SOCK_DGRAM;
16     pub const SOCK_SEQPACKET: c_int = libc::SOCK_SEQPACKET;
17     pub const SOCK_RAW: c_int = libc::SOCK_RAW;
18     pub const SOCK_RDM: c_int = 4;
19 
20     pub const SOL_IP: c_int = libc::SOL_IP;
21     pub const SOL_SOCKET: c_int = libc::SOL_SOCKET;
22     pub const SOL_TCP: c_int = libc::SOL_TCP;
23     pub const SOL_UDP: c_int = 17;
24     pub const SOL_IPV6: c_int = libc::SOL_IPV6;
25     pub const SOL_NETLINK: c_int = libc::SOL_NETLINK;
26     pub const IPPROTO_IP: c_int = libc::IPPROTO_IP;
27     pub const IPPROTO_IPV6: c_int = libc::IPPROTO_IPV6;
28     pub const IPPROTO_TCP: c_int = libc::IPPROTO_TCP;
29     pub const IPPROTO_UDP: c_int = SOL_UDP;
30 
31     pub const SO_ACCEPTCONN: c_int = libc::SO_ACCEPTCONN;
32     pub const SO_BINDTODEVICE: c_int = libc::SO_BINDTODEVICE;
33     pub const SO_BROADCAST: c_int = libc::SO_BROADCAST;
34     pub const SO_BSDCOMPAT: c_int = libc::SO_BSDCOMPAT;
35     pub const SO_DEBUG: c_int = libc::SO_DEBUG;
36     pub const SO_DOMAIN: c_int = libc::SO_DOMAIN;
37     pub const SO_ERROR: c_int = libc::SO_ERROR;
38     pub const SO_DONTROUTE: c_int = libc::SO_DONTROUTE;
39     pub const SO_KEEPALIVE: c_int = libc::SO_KEEPALIVE;
40     pub const SO_LINGER: c_int = libc::SO_LINGER;
41     pub const SO_MARK: c_int = libc::SO_MARK;
42     pub const SO_OOBINLINE: c_int = libc::SO_OOBINLINE;
43     pub const SO_PASSCRED: c_int = libc::SO_PASSCRED;
44     pub const SO_PEEK_OFF: c_int = libc::SO_PEEK_OFF;
45     pub const SO_PEERCRED: c_int = libc::SO_PEERCRED;
46     pub const SO_PRIORITY: c_int = libc::SO_PRIORITY;
47     pub const SO_PROTOCOL: c_int = libc::SO_PROTOCOL;
48     pub const SO_RCVBUF: c_int = libc::SO_RCVBUF;
49     pub const SO_RCVBUFFORCE: c_int = 33;
50     pub const SO_RCVLOWAT: c_int = libc::SO_RCVLOWAT;
51     pub const SO_SNDLOWAT: c_int = libc::SO_SNDLOWAT;
52     pub const SO_RCVTIMEO: c_int = libc::SO_RCVTIMEO;
53     pub const SO_SNDTIMEO: c_int = libc::SO_SNDTIMEO;
54     pub const SO_REUSEADDR: c_int = libc::SO_REUSEADDR;
55     pub const SO_REUSEPORT: c_int = libc::SO_REUSEPORT;
56     pub const SO_RXQ_OVFL: c_int = libc::SO_RXQ_OVFL;
57     pub const SO_SNDBUF: c_int = libc::SO_SNDBUF;
58     pub const SO_SNDBUFFORCE: c_int = libc::SO_SNDBUFFORCE;
59     pub const SO_TIMESTAMP: c_int = libc::SO_TIMESTAMP;
60     pub const SO_TYPE: c_int = libc::SO_TYPE;
61     pub const SO_BUSY_POLL: c_int = libc::SO_BUSY_POLL;
62     #[cfg(target_os = "linux")]
63     pub const SO_ORIGINAL_DST: c_int = 80;
64 
65     // Socket options for TCP sockets
66     pub const TCP_NODELAY: c_int = libc::TCP_NODELAY;
67     pub const TCP_MAXSEG: c_int = libc::TCP_MAXSEG;
68     pub const TCP_CORK: c_int = libc::TCP_CORK;
69     pub const TCP_KEEPIDLE: c_int = libc::TCP_KEEPIDLE;
70 
71     // Socket options for the IP layer of the socket
72     pub const IP_MULTICAST_IF: c_int = 32;
73 
74     pub type IpMulticastTtl = uint8_t;
75 
76     pub const IP_MULTICAST_TTL: c_int = libc::IP_MULTICAST_TTL;
77     pub const IP_MULTICAST_LOOP: c_int = libc::IP_MULTICAST_LOOP;
78     pub const IP_ADD_MEMBERSHIP: c_int = libc::IP_ADD_MEMBERSHIP;
79     pub const IP_DROP_MEMBERSHIP: c_int = libc::IP_DROP_MEMBERSHIP;
80 
81     pub const IPV6_ADD_MEMBERSHIP: c_int = libc::IPV6_ADD_MEMBERSHIP;
82     pub const IPV6_DROP_MEMBERSHIP: c_int = libc::IPV6_DROP_MEMBERSHIP;
83 
84     pub type InAddrT = u32;
85 
86     // Declarations of special addresses
87     pub const INADDR_ANY: InAddrT = 0;
88     pub const INADDR_NONE: InAddrT = 0xffffffff;
89     pub const INADDR_BROADCAST: InAddrT = 0xffffffff;
90 
91     // Flags for send/recv and their relatives
92     libc_bitflags!{
93         pub flags MsgFlags: libc::c_int {
94             MSG_OOB,
95             MSG_PEEK,
96             MSG_CTRUNC,
97             MSG_TRUNC,
98             MSG_DONTWAIT,
99             MSG_EOR,
100             MSG_ERRQUEUE,
101             MSG_CMSG_CLOEXEC,
102         }
103     }
104 
105     // shutdown flags
106     pub const SHUT_RD: c_int = libc::SHUT_RD;
107     pub const SHUT_WR: c_int = libc::SHUT_WR;
108     pub const SHUT_RDWR: c_int = libc::SHUT_RDWR;
109 
110     // Ancillary message types
111     pub const SCM_RIGHTS: c_int = libc::SCM_RIGHTS;
112 }
113 
114 // Not all of these constants exist on freebsd
115 #[cfg(any(target_os = "macos", target_os = "freebsd", target_os = "ios", target_os = "openbsd", target_os = "netbsd"))]
116 mod os {
117     #[cfg(any(target_os = "macos",
118               target_os = "ios",
119               target_os = "freebsd"))]
120     use libc::{self, c_int, uint8_t};
121     #[cfg(any(target_os = "openbsd", target_os = "netbsd"))]
122     use libc::{self, c_int, uint8_t};
123 
124     pub const AF_UNIX: c_int  = libc::AF_UNIX;
125     pub const AF_LOCAL: c_int = libc::AF_LOCAL;
126     pub const AF_INET: c_int  = libc::AF_INET;
127     pub const AF_INET6: c_int = libc::AF_INET6;
128     #[cfg(any(target_os = "macos", target_os = "ios"))]
129     pub const AF_SYSTEM: c_int = libc::AF_SYSTEM;
130 
131     #[cfg(any(target_os = "macos", target_os = "ios"))]
132     pub const AF_SYS_CONTROL: c_int = 2;
133 
134     pub const SOCK_STREAM: c_int = libc::SOCK_STREAM;
135     pub const SOCK_DGRAM: c_int = libc::SOCK_DGRAM;
136     pub const SOCK_SEQPACKET: c_int = libc::SOCK_SEQPACKET;
137     pub const SOCK_RAW: c_int = libc::SOCK_RAW;
138     pub const SOCK_RDM: c_int = libc::SOCK_RDM;
139 
140     pub const SOL_SOCKET: c_int = libc::SOL_SOCKET;
141     pub const IPPROTO_IP: c_int = libc::IPPROTO_IP;
142     pub const IPPROTO_IPV6: c_int = libc::IPPROTO_IPV6;
143     pub const IPPROTO_TCP: c_int = libc::IPPROTO_TCP;
144     pub const IPPROTO_UDP: c_int = 17;
145     #[cfg(any(target_os = "macos", target_os = "ios"))]
146     pub const SYSPROTO_CONTROL: c_int = 2;
147 
148     pub const SO_ACCEPTCONN: c_int          = libc::SO_ACCEPTCONN;
149     pub const SO_BROADCAST: c_int           = libc::SO_BROADCAST;
150     pub const SO_DEBUG: c_int               = libc::SO_DEBUG;
151     #[cfg(not(target_os = "netbsd"))]
152     pub const SO_DONTTRUNC: c_int           = 0x2000;
153     pub const SO_USELOOPBACK: c_int         = libc::SO_USELOOPBACK;
154     pub const SO_ERROR: c_int               = libc::SO_ERROR;
155     pub const SO_DONTROUTE: c_int           = libc::SO_DONTROUTE;
156     pub const SO_KEEPALIVE: c_int           = libc::SO_KEEPALIVE;
157     pub const SO_LABEL: c_int               = 0x1010;
158     pub const SO_LINGER: c_int              = libc::SO_LINGER;
159     pub const SO_NREAD: c_int               = 0x1020;
160     pub const SO_NKE: c_int                 = 0x1021;
161     pub const SO_NOSIGPIPE: c_int           = 0x1022;
162     pub const SO_NOADDRERR: c_int           = 0x1023;
163     pub const SO_NOTIFYCONFLICT: c_int      = 0x1026;
164     pub const SO_NP_EXTENSIONS: c_int       = 0x1083;
165     pub const SO_NWRITE: c_int              = 0x1024;
166     pub const SO_OOBINLINE: c_int           = libc::SO_OOBINLINE;
167     pub const SO_PEERLABEL: c_int           = 0x1011;
168     pub const SO_RCVBUF: c_int              = libc::SO_RCVBUF;
169     pub const SO_RCVLOWAT: c_int            = libc::SO_RCVLOWAT;
170     pub const SO_SNDLOWAT: c_int            = libc::SO_SNDLOWAT;
171     pub const SO_RCVTIMEO: c_int            = libc::SO_RCVTIMEO;
172     pub const SO_SNDTIMEO: c_int            = libc::SO_SNDTIMEO;
173     pub const SO_RANDOMPORT: c_int          = 0x1082;
174     pub const SO_RESTRICTIONS: c_int        = 0x1081;
175     pub const SO_RESTRICT_DENYIN: c_int     = 0x00000001;
176     pub const SO_RESTRICT_DENYOUT: c_int    = 0x00000002;
177     pub const SO_REUSEADDR: c_int           = libc::SO_REUSEADDR;
178     pub const SO_REUSEPORT: c_int           = libc::SO_REUSEPORT;
179     pub const SO_REUSESHAREUID: c_int       = 0x1025;
180     pub const SO_SNDBUF: c_int              = libc::SO_SNDBUF;
181     pub const SO_TIMESTAMP: c_int           = libc::SO_TIMESTAMP;
182     #[cfg(not(target_os = "netbsd"))]
183     pub const SO_TIMESTAMP_MONOTONIC: c_int = 0x0800;
184     pub const SO_TYPE: c_int                = libc::SO_TYPE;
185     #[cfg(not(target_os = "netbsd"))]
186     pub const SO_WANTMORE: c_int            = 0x4000;
187     pub const SO_WANTOOBFLAG: c_int         = 0x8000;
188     #[allow(overflowing_literals)]
189     pub const SO_RESTRICT_DENYSET: c_int    = 0x80000000;
190 
191     // Socket options for TCP sockets
192     pub const TCP_NODELAY: c_int = libc::TCP_NODELAY;
193     pub const TCP_MAXSEG: c_int = 2;
194     #[cfg(any(target_os = "macos", target_os = "ios"))]
195     pub const TCP_KEEPALIVE: c_int = libc::TCP_KEEPALIVE;
196     #[cfg(target_os = "freebsd")]
197     pub const TCP_KEEPIDLE: c_int = libc::TCP_KEEPIDLE;
198 
199     // Socket options for the IP layer of the socket
200     pub const IP_MULTICAST_IF: c_int = 9;
201 
202     pub type IpMulticastTtl = uint8_t;
203 
204     pub const IP_MULTICAST_TTL: c_int = libc::IP_MULTICAST_TTL;
205     pub const IP_MULTICAST_LOOP: c_int = libc::IP_MULTICAST_LOOP;
206     pub const IP_ADD_MEMBERSHIP: c_int = libc::IP_ADD_MEMBERSHIP;
207     pub const IP_DROP_MEMBERSHIP: c_int = libc::IP_DROP_MEMBERSHIP;
208 
209     pub const IPV6_JOIN_GROUP: c_int = libc::IPV6_JOIN_GROUP;
210     pub const IPV6_LEAVE_GROUP: c_int = libc::IPV6_LEAVE_GROUP;
211 
212     pub type InAddrT = u32;
213 
214     // Declarations of special addresses
215     pub const INADDR_ANY: InAddrT = 0;
216     pub const INADDR_NONE: InAddrT = 0xffffffff;
217     pub const INADDR_BROADCAST: InAddrT = 0xffffffff;
218 
219     // Flags for send/recv and their relatives
220     libc_bitflags!{
221         pub flags MsgFlags: libc::c_int {
222             MSG_OOB,
223             MSG_PEEK,
224             MSG_EOR,
225             MSG_TRUNC,
226             MSG_CTRUNC,
227             MSG_DONTWAIT,
228         }
229     }
230 
231     // shutdown flags
232     pub const SHUT_RD: c_int = libc::SHUT_RD;
233     pub const SHUT_WR: c_int = libc::SHUT_WR;
234     pub const SHUT_RDWR: c_int = libc::SHUT_RDWR;
235 
236     // Ancillary message types
237     pub const SCM_RIGHTS: c_int = 1;
238 }
239 
240 #[cfg(target_os = "dragonfly")]
241 mod os {
242     use libc::{c_int, uint8_t};
243 
244     pub const AF_UNIX: c_int  = libc::AF_UNIX;
245     pub const AF_LOCAL: c_int = libc::AF_LOCAL;
246     pub const AF_INET: c_int  = libc::AF_INET;
247     pub const AF_INET6: c_int = libc::AF_INET6;
248 
249     pub const SOCK_STREAM: c_int = libc::SOCK_STREAM;
250     pub const SOCK_DGRAM: c_int = libc::SOCK_DGRAM;
251     pub const SOCK_SEQPACKET: c_int = libc::SOCK_SEQPACKET;
252     pub const SOCK_RAW: c_int = libc::SOCK_RAW;
253     pub const SOCK_RDM: c_int = libc::SOCK_RDM;
254 
255     pub const SOL_SOCKET: c_int = libc::SOL_SOCKET;
256     pub const IPPROTO_IP: c_int = libc::IPPROTO_IP;
257     pub const IPPROTO_IPV6: c_int = libc::IPPROTO_IPV6;
258     pub const IPPROTO_TCP: c_int = libc::IPPROTO_TCP;
259     pub const IPPROTO_UDP: c_int = libc::IPPROTO_UDP;
260 
261     pub const SO_ACCEPTCONN: c_int = libc::SO_ACCEPTCONN;
262     pub const SO_BROADCAST: c_int = libc::SO_BROADCAST;
263     pub const SO_DEBUG: c_int = libc::SO_DEBUG;
264     pub const SO_ERROR: c_int = libc::SO_ERROR;
265     pub const SO_DONTROUTE: c_int = libc::SO_DONTROUTE;
266     pub const SO_KEEPALIVE: c_int = libc::SO_KEEPALIVE;
267     pub const SO_LINGER: c_int = libc::SO_LINGER;
268     pub const SO_NOSIGPIPE: c_int = libc::SO_NOSIGPIPE;
269     pub const SO_OOBINLINE: c_int = libc::SO_OOBINLINE;
270     pub const SO_RCVBUF: c_int = libc::SO_RCVBUF;
271     pub const SO_RCVLOWAT: c_int = libc::RCVLOWAT;
272     pub const SO_SNDLOWAT: c_int = libc::SO_SNDLOWAT;
273     pub const SO_RCVTIMEO: c_int = libc::SO_RCVTIMEO;
274     pub const SO_SNDTIMEO: c_int = libc::SO_SNDTIMEO;
275     pub const SO_REUSEADDR: c_int = libc::SO_REUSEADDR;
276     pub const SO_REUSEPORT: c_int = libc::SO_REUSEPORT;
277     pub const SO_SNDBUF: c_int = libc::SO_SNDBUF;
278     pub const SO_TIMESTAMP: c_int = libc::SO_TIMESTAMP;
279     pub const SO_TYPE: c_int = libc::SO_TYPE;
280 
281     // Socket options for TCP sockets
282     pub const TCP_NODELAY: c_int = libc::TCP_NODELAY;
283     pub const TCP_MAXSEG: c_int = libc::TCP_MAXSEG;
284     pub const TCP_KEEPIDLE: c_int = libc::TCP_KEEPIDLE;
285 
286     // Socket options for the IP layer of the socket
287     pub const IP_MULTICAST_IF: c_int = 9;
288 
289     pub type IpMulticastTtl = uint8_t;
290 
291     pub const IP_MULTICAST_TTL: c_int = libc::IP_MULTICAST_TTL;
292     pub const IP_MULTICAST_LOOP: c_int = libc::IP_MULTICAST_LOOP;
293     pub const IP_ADD_MEMBERSHIP: c_int = libc::IP_ADD_MEMBERSHIP;
294     pub const IP_DROP_MEMBERSHIP: c_int = libc::IP_DROP_MEMBERSHIP;
295     pub const IPV6_JOIN_GROUP: c_int = libc::IPV6_JOIN_GROUP;
296     pub const IPV6_LEAVE_GROUP: c_int = libc::IPV6_LEAVE_GROUP;
297 
298     pub type InAddrT = u32;
299 
300     // Declarations of special addresses
301     pub const INADDR_ANY: InAddrT = 0;
302     pub const INADDR_NONE: InAddrT = 0xffffffff;
303     pub const INADDR_BROADCAST: InAddrT = 0xffffffff;
304 
305     // Flags for send/recv and their relatives
306     libc_bitflags!{
307         pub flags MsgFlags: libc::c_int {
308             MSG_OOB,
309             MSG_PEEK,
310             MSG_DONTWAIT,
311         }
312     }
313 
314     // shutdown flags
315     pub const SHUT_RD: c_int = libc::SHUT_RD;
316     pub const SHUT_WR: c_int = libc::SHUT_WR;
317     pub const SHUT_RDWR: c_int = libc::SHUT_RDWR;
318 }
319 
320 #[cfg(test)]
321 mod test {
322     use super::*;
323     use nixtest::{assert_const_eq,get_int_const,GetConst};
324     use libc::{c_char};
325     use std::fmt;
326 
327     impl fmt::Display for MsgFlags {
fmt(&self, f: &mut fmt::Formatter) -> fmt::Result328         fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
329             write!(f, "{}", self.bits())
330         }
331     }
332 
333     impl GetConst for MsgFlags {
get_const(name: *const c_char) -> MsgFlags334         unsafe fn get_const(name: *const c_char) -> MsgFlags {
335             MsgFlags::from_bits_truncate(get_int_const(name))
336         }
337     }
338 
339     macro_rules! check_const {
340         ($($konst:ident),+) => {{
341             $(assert_const_eq(stringify!($konst), $konst);)+
342         }};
343     }
344 
345     #[test]
test_const_values()346     pub fn test_const_values() {
347         check_const!(
348             AF_UNIX,
349             AF_LOCAL,
350             AF_INET,
351             AF_INET6,
352             SOCK_STREAM,
353             SOCK_DGRAM,
354             SOCK_SEQPACKET,
355             SOCK_RAW,
356             SOCK_RDM,
357             SOL_SOCKET,
358             IPPROTO_IP,
359             IPPROTO_IPV6,
360             IPPROTO_TCP,
361             IPPROTO_UDP,
362             SO_ACCEPTCONN,
363             SO_BROADCAST,
364             SO_DEBUG,
365             SO_ERROR,
366             SO_DONTROUTE,
367             SO_KEEPALIVE,
368             SO_LINGER,
369             SO_OOBINLINE,
370             SO_RCVBUF,
371             SO_RCVLOWAT,
372             SO_SNDLOWAT,
373             SO_RCVTIMEO,
374             SO_SNDTIMEO,
375             SO_REUSEADDR,
376             // SO_REUSEPORT,
377             SO_SNDBUF,
378             SO_TIMESTAMP,
379             SO_TYPE,
380             TCP_NODELAY,
381             TCP_MAXSEG,
382             IP_MULTICAST_IF,
383             IP_MULTICAST_TTL,
384             IP_MULTICAST_LOOP,
385             IP_ADD_MEMBERSHIP,
386             IP_DROP_MEMBERSHIP,
387             INADDR_ANY,
388             INADDR_NONE,
389             INADDR_BROADCAST,
390             MSG_OOB,
391             MSG_PEEK,
392             MSG_DONTWAIT,
393             MSG_EOR,
394             MSG_TRUNC,
395             MSG_CTRUNC,
396             SHUT_RD,
397             SHUT_WR,
398             SHUT_RDWR
399             );
400 
401 
402     }
403 
404     #[cfg(target_os = "linux")]
405     #[test]
test_general_linux_consts()406     pub fn test_general_linux_consts() {
407         // TODO Figure out how to test new constants
408         check_const!(
409             SOL_IP,
410             SOL_TCP,
411             SOL_UDP,
412             SOL_IPV6,
413             SO_BINDTODEVICE,
414             SO_BSDCOMPAT,
415             // SO_DOMAIN,
416             // SO_MARK,
417             TCP_CORK,
418             // SO_BUSY_POLL,
419             // SO_RXQ_OVFL,
420             SO_PRIORITY,
421             // SO_PROTOCOL,
422             SO_RCVBUFFORCE,
423             // SO_PEEK_OFF,
424             MSG_ERRQUEUE);
425     }
426 
427     #[cfg(all(target_os = "linux", not(target_arch="arm")))]
428     #[test]
test_linux_not_arm_consts()429     pub fn test_linux_not_arm_consts() {
430         // TODO Figure out how to test new constants
431         check_const!(
432             SO_PASSCRED,
433             SO_PEERCRED,
434             SO_SNDBUFFORCE);
435     }
436 
437 }
438