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