summaryrefslogtreecommitdiff
path: root/src/sys
diff options
context:
space:
mode:
authorCarl Lerche <me@carllerche.com>2014-08-20 17:55:44 -0700
committerCarl Lerche <me@carllerche.com>2014-08-20 17:55:47 -0700
commitbbc24ea90eb9814db71a1297c4deb4eef91f9c2d (patch)
tree1c58cac016618e19df8d10c900303347234fcf7a /src/sys
parentd55f55674bee15bfc3c2afa63949d9037b3f5c6f (diff)
downloadnix-bbc24ea90eb9814db71a1297c4deb4eef91f9c2d.zip
Start binding Darwin
Diffstat (limited to 'src/sys')
-rw-r--r--src/sys/epoll.rs2
-rw-r--r--src/sys/mod.rs10
-rw-r--r--src/sys/socket.rs202
-rw-r--r--src/sys/stat.rs2
-rw-r--r--src/sys/utsname.rs3
5 files changed, 147 insertions, 72 deletions
diff --git a/src/sys/epoll.rs b/src/sys/epoll.rs
index 1a828af7..211333f1 100644
--- a/src/sys/epoll.rs
+++ b/src/sys/epoll.rs
@@ -1,5 +1,3 @@
-#![cfg(target_os = "linux")]
-
use libc::c_int;
use fcntl::Fd;
use errno::{SysResult, SysError, from_ffi};
diff --git a/src/sys/mod.rs b/src/sys/mod.rs
index 5023cce8..ccab75fd 100644
--- a/src/sys/mod.rs
+++ b/src/sys/mod.rs
@@ -1,4 +1,14 @@
+
+#[cfg(target_os = "linux")]
pub mod epoll;
+
+#[cfg(target_os = "linux")]
+#[cfg(target_os = "macos")]
+#[cfg(target_os = "ios")]
pub mod socket;
+
+#[cfg(target_os = "linux")]
pub mod stat;
+
+#[cfg(target_os = "linux")]
pub mod utsname;
diff --git a/src/sys/socket.rs b/src/sys/socket.rs
index 9f523ef3..46db7ab4 100644
--- a/src/sys/socket.rs
+++ b/src/sys/socket.rs
@@ -1,12 +1,12 @@
-#![cfg(target_os = "linux")]
-
use std::{mem, ptr};
-use libc::{c_int, c_void, sockaddr, socklen_t};
+use libc::{c_int, socklen_t};
use fcntl::Fd;
use errno::{SysResult, SysError, from_ffi};
pub use libc::{in_addr, sockaddr_in, sockaddr_in6, sockaddr_un, sa_family_t};
+pub use self::consts::*;
+
mod ffi {
use libc::{c_int, c_void, sockaddr, socklen_t};
pub use libc::{socket, listen, bind, accept, connect, setsockopt};
@@ -27,22 +27,7 @@ mod ffi {
}
}
-pub type AddressFamily = c_int;
-
-pub static AF_UNIX: AddressFamily = 1;
-pub static AF_LOCAL: AddressFamily = AF_UNIX;
-pub static AF_INET: AddressFamily = 2;
-pub static AF_INET6: AddressFamily = 10;
-
-pub type SockType = c_int;
-
-pub static SOCK_STREAM: SockType = 1;
-pub static SOCK_DGRAM: SockType = 1;
-pub static SOCK_SEQPACKET: SockType = 1;
-pub static SOCK_RAW: SockType = 1;
-pub static SOCK_RDM: SockType = 1;
-
-// Extra flags - Linux 2.6.27
+// Extra flags - Supported by Linux 2.6.27, normalized on other platforms
bitflags!(
flags SockFlag: c_int {
static SOCK_NONBLOCK = 0o0004000,
@@ -50,6 +35,138 @@ bitflags!(
}
)
+pub enum SockAddr {
+ SockIpV4(sockaddr_in),
+ SockIpV6(sockaddr_in6),
+ SockUnix(sockaddr_un)
+}
+
+#[cfg(target_os = "linux")]
+mod consts {
+ use libc::{c_int};
+
+ pub type AddressFamily = c_int;
+
+ pub static AF_UNIX: AddressFamily = 1;
+ pub static AF_LOCAL: AddressFamily = AF_UNIX;
+ pub static AF_INET: AddressFamily = 2;
+ pub static AF_INET6: AddressFamily = 10;
+
+ pub type SockType = c_int;
+
+ pub static SOCK_STREAM: SockType = 1;
+ pub static SOCK_DGRAM: SockType = 2;
+ pub static SOCK_SEQPACKET: SockType = 5;
+ pub static SOCK_RAW: SockType = 3;
+ pub static SOCK_RDM: SockType = 4;
+
+ pub type SockLevel = c_int;
+
+ pub static SOL_IP: SockLevel = 0;
+ pub static SOL_SOCKET: SockLevel = 1;
+ pub static SOL_TCP: SockLevel = 6;
+ pub static SOL_UDP: SockLevel = 17;
+ pub static SOL_IPV6: SockLevel = 41;
+
+ pub type SockOpt = c_int;
+
+ pub static SO_ACCEPTCONN: SockOpt = 30;
+ pub static SO_BINDTODEVICE: SockOpt = 25;
+ pub static SO_BROADCAST: SockOpt = 6;
+ pub static SO_BSDCOMPAT: SockOpt = 14;
+ pub static SO_DEBUG: SockOpt = 1;
+ pub static SO_DOMAIN: SockOpt = 39;
+ pub static SO_ERROR: SockOpt = 4;
+ pub static SO_DONTROUTE: SockOpt = 5;
+ pub static SO_KEEPALIVE: SockOpt = 9;
+ pub static SO_LINGER: SockOpt = 13;
+ pub static SO_MARK: SockOpt = 36;
+ pub static SO_OOBINLINE: SockOpt = 10;
+ pub static SO_PASSCRED: SockOpt = 16;
+ pub static SO_PEEK_OFF: SockOpt = 42;
+ pub static SO_PEERCRED: SockOpt = 17;
+ pub static SO_PRIORITY: SockOpt = 12;
+ pub static SO_PROTOCOL: SockOpt = 38;
+ pub static SO_RCVBUF: SockOpt = 8;
+ pub static SO_RCVBUFFORCE: SockOpt = 33;
+ pub static SO_RCVLOWAT: SockOpt = 18;
+ pub static SO_SNDLOWAT: SockOpt = 19;
+ pub static SO_RCVTIMEO: SockOpt = 20;
+ pub static SO_SNDTIMEO: SockOpt = 21;
+ pub static SO_REUSEADDR: SockOpt = 2;
+ pub static SO_RXQ_OVFL: SockOpt = 40;
+ pub static SO_SNDBUF: SockOpt = 7;
+ pub static SO_SNDBUFFORCE: SockOpt = 32;
+ pub static SO_TIMESTAMP: SockOpt = 29;
+ pub static SO_TYPE: SockOpt = 3;
+ pub static SO_BUSY_POLL: SockOpt = 46;
+}
+
+#[cfg(target_os = "macos")]
+#[cfg(target_os = "ios")]
+mod consts {
+ use libc::{c_int};
+
+ pub type AddressFamily = c_int;
+
+ pub static AF_UNIX: AddressFamily = 1;
+ pub static AF_LOCAL: AddressFamily = AF_UNIX;
+ pub static AF_INET: AddressFamily = 2;
+ pub static AF_INET6: AddressFamily = 30;
+
+ pub type SockType = c_int;
+
+ pub static SOCK_STREAM: SockType = 1;
+ pub static SOCK_DGRAM: SockType = 2;
+ pub static SOCK_SEQPACKET: SockType = 5;
+ pub static SOCK_RAW: SockType = 3;
+ pub static SOCK_RDM: SockType = 4;
+
+ pub type SockLevel = c_int;
+
+ pub static SOL_SOCKET: SockLevel = 0xffff;
+
+ pub type SockOpt = c_int;
+
+ pub static SO_ACCEPTCONN: SockOpt = 0x0002;
+ pub static SO_BROADCAST: SockOpt = 0x0020;
+ pub static SO_DEBUG: SockOpt = 0x0001;
+ pub static SO_DONTTRUNC: SockOpt = 0x2000;
+ pub static SO_ERROR: SockOpt = 0x1007;
+ pub static SO_DONTROUTE: SockOpt = 0x0010;
+ pub static SO_KEEPALIVE: SockOpt = 0x0008;
+ pub static SO_LABEL: SockOpt = 0x1010;
+ pub static SO_LINGER: SockOpt = 0x0080;
+ pub static SO_NREAD: SockOpt = 0x1020;
+ pub static SO_NKE: SockOpt = 0x1021;
+ pub static SO_NOSIGPIPE: SockOpt = 0x1022;
+ pub static SO_NOADDRERR: SockOpt = 0x1023;
+ pub static SO_NOTIFYCONFLICT: SockOpt = 0x1026;
+ pub static SO_NP_EXTENSIONS: SockOpt = 0x1083;
+ pub static SO_NWRITE: SockOpt = 0x1024;
+ pub static SO_OOBINLINE: SockOpt = 0x0100;
+ pub static SO_PEERLABEL: SockOpt = 0x1011;
+ pub static SO_RCVBUF: SockOpt = 0x1002;
+ pub static SO_RCVLOWAT: SockOpt = 0x1004;
+ pub static SO_SNDLOWAT: SockOpt = 0x1003;
+ pub static SO_RCVTIMEO: SockOpt = 0x1006;
+ pub static SO_SNDTIMEO: SockOpt = 0x1005;
+ pub static SO_RANDOMPORT: SockOpt = 0x1082;
+ pub static SO_RESTRICTIONS: SockOpt = 0x1081;
+ pub static SO_RESTRICT_DENYIN: SockOpt = 0x00000001;
+ pub static SO_RESTRICT_DENYOUT: SockOpt = 0x00000002;
+ pub static SO_REUSEADDR: SockOpt = 0x0004;
+ pub static SO_REUSESHAREUID: SockOpt = 0x1025;
+ pub static SO_SNDBUF: SockOpt = 0x1001;
+ pub static SO_TIMESTAMP: SockOpt = 0x0400;
+ pub static SO_TIMESTAMP_MONOTONIC: SockOpt = 0x0800;
+ pub static SO_TYPE: SockOpt = 0x1008;
+ pub static SO_WANTMORE: SockOpt = 0x4000;
+ pub static SO_WANTOOBFLAG: SockOpt = 0x8000;
+ #[allow(type_overflow)]
+ pub static SO_RESTRICT_DENYSET: SockOpt = 0x80000000;
+}
+
pub fn socket(domain: AddressFamily, ty: SockType, flags: SockFlag) -> SysResult<Fd> {
// TODO: Check the kernel version
let res = unsafe { ffi::socket(domain, ty | flags.bits(), 0) };
@@ -66,12 +183,6 @@ pub fn listen(sockfd: Fd, backlog: uint) -> SysResult<()> {
from_ffi(res)
}
-pub enum SockAddr {
- SockIpV4(sockaddr_in),
- SockIpV6(sockaddr_in6),
- SockUnix(sockaddr_un)
-}
-
pub fn bind(sockfd: Fd, addr: &SockAddr) -> SysResult<()> {
let res = unsafe {
match *addr {
@@ -117,47 +228,6 @@ pub fn connect(sockfd: Fd, addr: &SockAddr) -> SysResult<()> {
from_ffi(res)
}
-pub type SockLevel = c_int;
-
-pub static SOL_IP: SockLevel = 0;
-pub static SOL_SOCKET: SockLevel = 1;
-pub static SOL_TCP: SockLevel = 6;
-pub static SOL_UDP: SockLevel = 17;
-pub static SOL_IPV6: SockLevel = 41;
-
-pub type SockOpt = c_int;
-
-pub static SO_ACCEPTCONN: SockOpt = 30;
-pub static SO_BINDTODEVICE: SockOpt = 25;
-pub static SO_BROADCAST: SockOpt = 6;
-pub static SO_BSDCOMPAT: SockOpt = 14;
-pub static SO_DEBUG: SockOpt = 1;
-pub static SO_DOMAIN: SockOpt = 39;
-pub static SO_ERROR: SockOpt = 4;
-pub static SO_DONTROUTE: SockOpt = 5;
-pub static SO_KEEPALIVE: SockOpt = 9;
-pub static SO_LINGER: SockOpt = 13;
-pub static SO_MARK: SockOpt = 36;
-pub static SO_OOBINLINE: SockOpt = 10;
-pub static SO_PASSCRED: SockOpt = 16;
-pub static SO_PEEK_OFF: SockOpt = 42;
-pub static SO_PEERCRED: SockOpt = 17;
-pub static SO_PRIORITY: SockOpt = 12;
-pub static SO_PROTOCOL: SockOpt = 38;
-pub static SO_RCVBUF: SockOpt = 8;
-pub static SO_RCVBUFFORCE: SockOpt = 33;
-pub static SO_RCVLOWAT: SockOpt = 18;
-pub static SO_SNDLOWAT: SockOpt = 19;
-pub static SO_RCVTIMEO: SockOpt = 20;
-pub static SO_SNDTIMEO: SockOpt = 21;
-pub static SO_REUSEADDR: SockOpt = 2;
-pub static SO_RXQ_OVFL: SockOpt = 40;
-pub static SO_SNDBUF: SockOpt = 7;
-pub static SO_SNDBUFFORCE: SockOpt = 32;
-pub static SO_TIMESTAMP: SockOpt = 29;
-pub static SO_TYPE: SockOpt = 3;
-pub static SO_BUSY_POLL: SockOpt = 46;
-
pub fn getsockopt<T>(fd: Fd, level: SockLevel, opt: SockOpt, val: &mut T) -> SysResult<uint> {
let mut len = mem::size_of::<T>() as socklen_t;
diff --git a/src/sys/stat.rs b/src/sys/stat.rs
index fc90ca67..c26220c0 100644
--- a/src/sys/stat.rs
+++ b/src/sys/stat.rs
@@ -1,5 +1,3 @@
-#![cfg(target_os = "linux")]
-
pub use libc::dev_t;
use std::fmt;
diff --git a/src/sys/utsname.rs b/src/sys/utsname.rs
index 7414439b..7a0ff408 100644
--- a/src/sys/utsname.rs
+++ b/src/sys/utsname.rs
@@ -1,5 +1,3 @@
-#![cfg(target_os = "linux")]
-
use std::mem;
use std::c_str::CString;
use libc::{c_char};
@@ -24,6 +22,7 @@ pub struct UtsName {
version: [c_char, ..UTSNAME_LEN],
machine: [c_char, ..UTSNAME_LEN],
// ifdef _GNU_SOURCE
+ #[allow(dead_code)]
domainname: [c_char, ..UTSNAME_LEN]
}