diff options
author | Carl Lerche <me@carllerche.com> | 2014-08-20 17:55:44 -0700 |
---|---|---|
committer | Carl Lerche <me@carllerche.com> | 2014-08-20 17:55:47 -0700 |
commit | bbc24ea90eb9814db71a1297c4deb4eef91f9c2d (patch) | |
tree | 1c58cac016618e19df8d10c900303347234fcf7a /src | |
parent | d55f55674bee15bfc3c2afa63949d9037b3f5c6f (diff) | |
download | nix-bbc24ea90eb9814db71a1297c4deb4eef91f9c2d.zip |
Start binding Darwin
Diffstat (limited to 'src')
-rw-r--r-- | src/errno.rs | 734 | ||||
-rw-r--r-- | src/fcntl.rs | 99 | ||||
-rw-r--r-- | src/lib.rs | 23 | ||||
-rw-r--r-- | src/mount.rs | 2 | ||||
-rw-r--r-- | src/sys/epoll.rs | 2 | ||||
-rw-r--r-- | src/sys/mod.rs | 10 | ||||
-rw-r--r-- | src/sys/socket.rs | 202 | ||||
-rw-r--r-- | src/sys/stat.rs | 2 | ||||
-rw-r--r-- | src/sys/utsname.rs | 3 | ||||
-rw-r--r-- | src/unistd.rs | 44 |
10 files changed, 828 insertions, 293 deletions
diff --git a/src/errno.rs b/src/errno.rs index b0f5baa9..25cfac52 100644 --- a/src/errno.rs +++ b/src/errno.rs @@ -1,10 +1,10 @@ -#![cfg(target_os = "linux")] - use std::fmt; use std::os::errno; use std::num::from_int; use libc::c_int; +pub use self::consts::*; + pub type SysResult<T> = Result<T, SysError>; #[deriving(Clone)] @@ -44,145 +44,6 @@ pub fn from_ffi(res: c_int) -> SysResult<()> { Ok(()) } -#[deriving(Show, Clone, PartialEq, FromPrimitive)] -pub enum Errno { - UnknownErrno = 0, - EPERM = 1, - ENOENT = 2, - ESRCH = 3, - EINTR = 4, - EIO = 5, - ENXIO = 6, - E2BIG = 7, - ENOEXEC = 8, - EBADF = 9, - ECHILD = 10, - EAGAIN = 11, - ENOMEM = 12, - EACCES = 13, - EFAULT = 14, - ENOTBLK = 15, - EBUSY = 16, - EEXIST = 17, - EXDEV = 18, - ENODEV = 19, - ENOTDIR = 20, - EISDIR = 21, - EINVAL = 22, - ENFILE = 23, - EMFILE = 24, - ENOTTY = 25, - ETXTBSY = 26, - EFBIG = 27, - ENOSPC = 28, - ESPIPE = 29, - EROFS = 30, - EMLINK = 31, - EPIPE = 32, - EDOM = 33, - ERANGE = 34, - EDEADLK = 35, - ENAMETOOLONG = 36, - ENOLCK = 37, - ENOSYS = 38, - ENOTEMPTY = 39, - ELOOP = 40, - ENOMSG = 42, - EIDRM = 43, - ECHRNG = 44, - EL2NSYNC = 45, - EL3HLT = 46, - EL3RST = 47, - ELNRNG = 48, - EUNATCH = 49, - ENOCSI = 50, - EL2HLT = 51, - EBADE = 52, - EBADR = 53, - EXFULL = 54, - ENOANO = 55, - EBADRQC = 56, - EBADSLT = 57, - EBFONT = 59, - ENOSTR = 60, - ENODATA = 61, - ETIME = 62, - ENOSR = 63, - ENONET = 64, - ENOPKG = 65, - EREMOTE = 66, - ENOLINK = 67, - EADV = 68, - ESRMNT = 69, - ECOMM = 70, - EPROTO = 71, - EMULTIHOP = 72, - EDOTDOT = 73, - EBADMSG = 74, - EOVERFLOW = 75, - ENOTUNIQ = 76, - EBADFD = 77, - EREMCHG = 78, - ELIBACC = 79, - ELIBBAD = 80, - ELIBSCN = 81, - ELIBMAX = 82, - ELIBEXEC = 83, - EILSEQ = 84, - ERESTART = 85, - ESTRPIPE = 86, - EUSERS = 87, - ENOTSOCK = 88, - EDESTADDRREQ = 89, - EMSGSIZE = 90, - EPROTOTYPE = 91, - ENOPROTOOPT = 92, - EPROTONOSUPPORT = 93, - ESOCKTNOSUPPORT = 94, - EOPNOTSUPP = 95, - EPFNOSUPPORT = 96, - EAFNOSUPPORT = 97, - EADDRINUSE = 98, - EADDRNOTAVAIL = 99, - ENETDOWN = 100, - ENETUNREACH = 101, - ENETRESET = 102, - ECONNABORTED = 103, - ECONNRESET = 104, - ENOBUFS = 105, - EISCONN = 106, - ENOTCONN = 107, - ESHUTDOWN = 108, - ETOOMANYREFS = 109, - ETIMEDOUT = 110, - ECONNREFUSED = 111, - EHOSTDOWN = 112, - EHOSTUNREACH = 113, - EALREADY = 114, - EINPROGRESS = 115, - ESTALE = 116, - EUCLEAN = 117, - ENOTNAM = 118, - ENAVAIL = 119, - EISNAM = 120, - EREMOTEIO = 121, - EDQUOT = 122, - ENOMEDIUM = 123, - EMEDIUMTYPE = 124, - ECANCELED = 125, - ENOKEY = 126, - EKEYEXPIRED = 127, - EKEYREVOKED = 128, - EKEYREJECTED = 129, - EOWNERDEAD = 130, - ENOTRECOVERABLE = 131, - ERFKILL = 132, - EHWPOISON = 133, -} - -pub static EWOULDBLOCK: Errno = EAGAIN; -pub static EDEADLOCK: Errno = EDEADLK; - fn desc(kind: Errno) -> &'static str { match kind { UnknownErrno => "Unknown errno", @@ -228,94 +89,629 @@ fn desc(kind: Errno) -> &'static str { ELOOP => "Too many symbolic links encountered", ENOMSG => "No message of desired type", EIDRM => "Identifier removed", + EINPROGRESS => "Operation now in progress", + EALREADY => "Operation already in progress", + ENOTSOCK => "Socket operation on non-socket", + EDESTADDRREQ => "Destination address required", + EMSGSIZE => "Message too long", + EPROTOTYPE => "Protocol wrong type for socket", + ENOPROTOOPT => "Protocol not available", + EPROTONOSUPPORT => "Protocol not supported", + ESOCKTNOSUPPORT => "Socket type not supported", + EPFNOSUPPORT => "Protocol family not supported", + EAFNOSUPPORT => "Address family not supported by protocol", + EADDRINUSE => "Address already in use", + EADDRNOTAVAIL => "Cannot assign requested address", + ENETDOWN => "Network is down", + ENETUNREACH => "Network is unreachable", + ENETRESET => "Network dropped connection because of reset", + ECONNABORTED => "Software caused connection abort", + ECONNRESET => "Connection reset by peer", + ENOBUFS => "No buffer space available", + EISCONN => "Transport endpoint is already connected", + ENOTCONN => "Transport endpoint is not connected", + ESHUTDOWN => "Cannot send after transport endpoint shutdown", + ETOOMANYREFS => "Too many references: cannot splice", + ETIMEDOUT => "Connection timed out", + ECONNREFUSED => "Connection refused", + EHOSTDOWN => "Host is down", + EHOSTUNREACH => "No route to host", + + #[cfg(target_os = "linux")] ECHRNG => "Channel number out of range", + + #[cfg(target_os = "linux")] EL2NSYNC => "Level 2 not synchronized", + + #[cfg(target_os = "linux")] EL3HLT => "Level 3 halted", + + #[cfg(target_os = "linux")] EL3RST => "Level 3 reset", + + #[cfg(target_os = "linux")] ELNRNG => "Link number out of range", + + #[cfg(target_os = "linux")] EUNATCH => "Protocol driver not attached", + + #[cfg(target_os = "linux")] ENOCSI => "No CSI structure available", + + #[cfg(target_os = "linux")] EL2HLT => "Level 2 halted", + + #[cfg(target_os = "linux")] EBADE => "Invalid exchange", + + #[cfg(target_os = "linux")] EBADR => "Invalid request descriptor", + + #[cfg(target_os = "linux")] EXFULL => "Exchange full", + + #[cfg(target_os = "linux")] ENOANO => "No anode", + + #[cfg(target_os = "linux")] EBADRQC => "Invalid request code", + + #[cfg(target_os = "linux")] EBADSLT => "Invalid slot", + + #[cfg(target_os = "linux")] EBFONT => "Bad font file format", + + #[cfg(target_os = "linux")] ENOSTR => "Device not a stream", + + #[cfg(target_os = "linux")] ENODATA => "No data available", + + #[cfg(target_os = "linux")] ETIME => "Timer expired", + + #[cfg(target_os = "linux")] ENOSR => "Out of streams resources", + + #[cfg(target_os = "linux")] ENONET => "Machine is not on the network", + + #[cfg(target_os = "linux")] ENOPKG => "Package not installed", + + #[cfg(target_os = "linux")] EREMOTE => "Object is remote", + + #[cfg(target_os = "linux")] ENOLINK => "Link has been severed", + + #[cfg(target_os = "linux")] EADV => "Advertise error", + + #[cfg(target_os = "linux")] ESRMNT => "Srmount error", + + #[cfg(target_os = "linux")] ECOMM => "Communication error on send", + + #[cfg(target_os = "linux")] EPROTO => "Protocol error", + + #[cfg(target_os = "linux")] EMULTIHOP => "Multihop attempted", + + #[cfg(target_os = "linux")] EDOTDOT => "RFS specific error", + + #[cfg(target_os = "linux")] EBADMSG => "Not a data message", + + #[cfg(target_os = "linux")] EOVERFLOW => "Value too large for defined data type", + + #[cfg(target_os = "linux")] ENOTUNIQ => "Name not unique on network", + + #[cfg(target_os = "linux")] EBADFD => "File descriptor in bad state", + + #[cfg(target_os = "linux")] EREMCHG => "Remote address changed", + + #[cfg(target_os = "linux")] ELIBACC => "Can not acces a needed shared library", + + #[cfg(target_os = "linux")] ELIBBAD => "Accessing a corrupted shared library", + + #[cfg(target_os = "linux")] ELIBSCN => ".lib section in a.out corrupted", + + #[cfg(target_os = "linux")] ELIBMAX => "Attempting to link in too many shared libraries", + + #[cfg(target_os = "linux")] ELIBEXEC => "Cannot exec a shared library directly", + + #[cfg(target_os = "linux")] EILSEQ => "Illegal byte sequence", + + #[cfg(target_os = "linux")] ERESTART => "Interrupted system call should be restarted", + + #[cfg(target_os = "linux")] ESTRPIPE => "Streams pipe error", + + #[cfg(target_os = "linux")] EUSERS => "Too many users", - ENOTSOCK => "Socket operation on non-socket", - EDESTADDRREQ => "Destination address required", - EMSGSIZE => "Message too long", - EPROTOTYPE => "Protocol wrong type for socket", - ENOPROTOOPT => "Protocol not available", - EPROTONOSUPPORT => "Protocol not supported", - ESOCKTNOSUPPORT => "Socket type not supported", + + #[cfg(target_os = "linux")] EOPNOTSUPP => "Operation not supported on transport endpoint", - EPFNOSUPPORT => "Protocol family not supported", - EAFNOSUPPORT => "Address family not supported by protocol", - EADDRINUSE => "Address already in use", - EADDRNOTAVAIL => "Cannot assign requested address", - ENETDOWN => "Network is down", - ENETUNREACH => "Network is unreachable", - ENETRESET => "Network dropped connection because of reset", - ECONNABORTED => "Software caused connection abort", - ECONNRESET => "Connection reset by peer", - ENOBUFS => "No buffer space available", - EISCONN => "Transport endpoint is already connected", - ENOTCONN => "Transport endpoint is not connected", - ESHUTDOWN => "Cannot send after transport endpoint shutdown", - ETOOMANYREFS => "Too many references: cannot splice", - ETIMEDOUT => "Connection timed out", - ECONNREFUSED => "Connection refused", - EHOSTDOWN => "Host is down", - EHOSTUNREACH => "No route to host", - EALREADY => "Operation already in progress", - EINPROGRESS => "Operation now in progress", + + #[cfg(target_os = "linux")] ESTALE => "Stale file handle", + + #[cfg(target_os = "linux")] EUCLEAN => "Structure needs cleaning", + + #[cfg(target_os = "linux")] ENOTNAM => "Not a XENIX named type file", + + #[cfg(target_os = "linux")] ENAVAIL => "No XENIX semaphores available", + + #[cfg(target_os = "linux")] EISNAM => "Is a named type file", + + #[cfg(target_os = "linux")] EREMOTEIO => "Remote I/O error", + + #[cfg(target_os = "linux")] EDQUOT => "Quota exceeded", + + #[cfg(target_os = "linux")] ENOMEDIUM => "No medium found", + + #[cfg(target_os = "linux")] EMEDIUMTYPE => "Wrong medium type", + + #[cfg(target_os = "linux")] ECANCELED => "Operation canceled", + + #[cfg(target_os = "linux")] ENOKEY => "Required key not available", + + #[cfg(target_os = "linux")] EKEYEXPIRED => "Key has expired", + + #[cfg(target_os = "linux")] EKEYREVOKED => "Key has been revoked", + + #[cfg(target_os = "linux")] EKEYREJECTED => "Key was rejected by service", + + #[cfg(target_os = "linux")] EOWNERDEAD => "Owner died", + + #[cfg(target_os = "linux")] ENOTRECOVERABLE => "State not recoverable", + + #[cfg(target_os = "linux")] ERFKILL => "Operation not possible due to RF-kill", - EHWPOISON => "Memory page has hardware error" + + #[cfg(target_os = "linux")] + EHWPOISON => "Memory page has hardware error", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + ENOTSUP => "Operation not supported", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + EPROCLIM => "Too many processes", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + EUSERS => "Too many users", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + EDQUOT => "Disc quota exceeded", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + ESTALE => "Stale NFS file handle", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + EREMOTE => "Stale NFS file handle", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + EBADRPC => "RPC struct is bad", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + ERPCMISMATCH => "RPC version wrong", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + EPROGUNAVAIL => "RPC prog. not avail", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + EPROGMISMATCH => "Program version wrong", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + EPROCUNAVAIL => "Bad procedure for program", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + EFTYPE => "Inappropriate file type or format", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + EAUTH => "Authentication error", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + ENEEDAUTH => "Need authenticator", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + EPWROFF => "Device power is off", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + EDEVERR => "Device error, e.g. paper out", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + EOVERFLOW => "Value too large to be stored in data type", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + EBADEXEC => "Bad executable", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + EBADARCH => "Bad CPU type in executable", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + ESHLIBVERS => "Shared library version mismatch", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + EBADMACHO => "Malformed Macho file", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + ECANCELED => "Operation canceled", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + EILSEQ => "Illegal byte sequence", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + ENOATTR => "Attribute not found", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + EBADMSG => "Bad message", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + EMULTIHOP => "Reserved", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + ENODATA => "No message available on STREAM", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + ENOLINK => "Reserved", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + ENOSR => "No STREAM resources", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + ENOSTR => "Not a STREAM", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + EPROTO => "Protocol error", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + ETIME => "STREAM ioctl timeout", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + EOPNOTSUPP => "Operation not supported on socket", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + ENOPOLICY => "No such policy registered", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + ENOTRECOVERABLE => "State not recoverable", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + EOWNERDEAD => "Previous owner died", + + #[cfg(target_os = "macos")] + #[cfg(target_os = "ios")] + EQFULL => "Interface output queue is full", + } +} + +#[cfg(target_os = "linux")] +mod consts { + #[deriving(Show, Clone, PartialEq, FromPrimitive)] + pub enum Errno { + UnknownErrno = 0, + EPERM = 1, + ENOENT = 2, + ESRCH = 3, + EINTR = 4, + EIO = 5, + ENXIO = 6, + E2BIG = 7, + ENOEXEC = 8, + EBADF = 9, + ECHILD = 10, + EAGAIN = 11, + ENOMEM = 12, + EACCES = 13, + EFAULT = 14, + ENOTBLK = 15, + EBUSY = 16, + EEXIST = 17, + EXDEV = 18, + ENODEV = 19, + ENOTDIR = 20, + EISDIR = 21, + EINVAL = 22, + ENFILE = 23, + EMFILE = 24, + ENOTTY = 25, + ETXTBSY = 26, + EFBIG = 27, + ENOSPC = 28, + ESPIPE = 29, + EROFS = 30, + EMLINK = 31, + EPIPE = 32, + EDOM = 33, + ERANGE = 34, + EDEADLK = 35, + ENAMETOOLONG = 36, + ENOLCK = 37, + ENOSYS = 38, + ENOTEMPTY = 39, + ELOOP = 40, + ENOMSG = 42, + EIDRM = 43, + ECHRNG = 44, + EL2NSYNC = 45, + EL3HLT = 46, + EL3RST = 47, + ELNRNG = 48, + EUNATCH = 49, + ENOCSI = 50, + EL2HLT = 51, + EBADE = 52, + EBADR = 53, + EXFULL = 54, + ENOANO = 55, + EBADRQC = 56, + EBADSLT = 57, + EBFONT = 59, + ENOSTR = 60, + ENODATA = 61, + ETIME = 62, + ENOSR = 63, + ENONET = 64, + ENOPKG = 65, + EREMOTE = 66, + ENOLINK = 67, + EADV = 68, + ESRMNT = 69, + ECOMM = 70, + EPROTO = 71, + EMULTIHOP = 72, + EDOTDOT = 73, + EBADMSG = 74, + EOVERFLOW = 75, + ENOTUNIQ = 76, + EBADFD = 77, + EREMCHG = 78, + ELIBACC = 79, + ELIBBAD = 80, + ELIBSCN = 81, + ELIBMAX = 82, + ELIBEXEC = 83, + EILSEQ = 84, + ERESTART = 85, + ESTRPIPE = 86, + EUSERS = 87, + ENOTSOCK = 88, + EDESTADDRREQ = 89, + EMSGSIZE = 90, + EPROTOTYPE = 91, + ENOPROTOOPT = 92, + EPROTONOSUPPORT = 93, + ESOCKTNOSUPPORT = 94, + EOPNOTSUPP = 95, + EPFNOSUPPORT = 96, + EAFNOSUPPORT = 97, + EADDRINUSE = 98, + EADDRNOTAVAIL = 99, + ENETDOWN = 100, + ENETUNREACH = 101, + ENETRESET = 102, + ECONNABORTED = 103, + ECONNRESET = 104, + ENOBUFS = 105, + EISCONN = 106, + ENOTCONN = 107, + ESHUTDOWN = 108, + ETOOMANYREFS = 109, + ETIMEDOUT = 110, + ECONNREFUSED = 111, + EHOSTDOWN = 112, + EHOSTUNREACH = 113, + EALREADY = 114, + EINPROGRESS = 115, + ESTALE = 116, + EUCLEAN = 117, + ENOTNAM = 118, + ENAVAIL = 119, + EISNAM = 120, + EREMOTEIO = 121, + EDQUOT = 122, + ENOMEDIUM = 123, + EMEDIUMTYPE = 124, + ECANCELED = 125, + ENOKEY = 126, + EKEYEXPIRED = 127, + EKEYREVOKED = 128, + EKEYREJECTED = 129, + EOWNERDEAD = 130, + ENOTRECOVERABLE = 131, + ERFKILL = 132, + EHWPOISON = 133, + } + + pub static EWOULDBLOCK: Errno = EAGAIN; + pub static EDEADLOCK: Errno = EDEADLK; +} + +#[cfg(target_os = "macos")] +#[cfg(target_os = "ios")] +mod consts { + #[deriving(Show, Clone, PartialEq, FromPrimitive)] + pub enum Errno { + UnknownErrno = 0, + EPERM = 1, + ENOENT = 2, + ESRCH = 3, + EINTR = 4, + EIO = 5, + ENXIO = 6, + E2BIG = 7, + ENOEXEC = 8, + EBADF = 9, + ECHILD = 10, + EDEADLK = 11, + ENOMEM = 12, + EACCES = 13, + EFAULT = 14, + ENOTBLK = 15, + EBUSY = 16, + EEXIST = 17, + EXDEV = 18, + ENODEV = 19, + ENOTDIR = 20, + EISDIR = 21, + EINVAL = 22, + ENFILE = 23, + EMFILE = 24, + ENOTTY = 25, + ETXTBSY = 26, + EFBIG = 27, + ENOSPC = 28, + ESPIPE = 29, + EROFS = 30, + EMLINK = 31, + EPIPE = 32, + EDOM = 33, + ERANGE = 34, + EAGAIN = 35, + EINPROGRESS = 36, + EALREADY = 37, + ENOTSOCK = 38, + EDESTADDRREQ = 39, + EMSGSIZE = 40, + EPROTOTYPE = 41, + ENOPROTOOPT = 42, + EPROTONOSUPPORT = 43, + ESOCKTNOSUPPORT = 44, + ENOTSUP = 45, + EPFNOSUPPORT = 46, + EAFNOSUPPORT = 47, + EADDRINUSE = 48, + EADDRNOTAVAIL = 49, + ENETDOWN = 50, + ENETUNREACH = 51, + ENETRESET = 52, + ECONNABORTED = 53, + ECONNRESET = 54, + ENOBUFS = 55, + EISCONN = 56, + ENOTCONN = 57, + ESHUTDOWN = 58, + ETOOMANYREFS = 59, + ETIMEDOUT = 60, + ECONNREFUSED = 61, + ELOOP = 62, + ENAMETOOLONG = 63, + EHOSTDOWN = 64, + EHOSTUNREACH = 65, + ENOTEMPTY = 66, + EPROCLIM = 67, + EUSERS = 68, + EDQUOT = 69, + ESTALE = 70, + EREMOTE = 71, + EBADRPC = 72, + ERPCMISMATCH = 73, + EPROGUNAVAIL = 74, + EPROGMISMATCH = 75, + EPROCUNAVAIL = 76, + ENOLCK = 77, + ENOSYS = 78, + EFTYPE = 79, + EAUTH = 80, + ENEEDAUTH = 81, + EPWROFF = 82, + EDEVERR = 83, + EOVERFLOW = 84, + EBADEXEC = 85, + EBADARCH = 86, + ESHLIBVERS = 87, + EBADMACHO = 88, + ECANCELED = 89, + EIDRM = 90, + ENOMSG = 91, + EILSEQ = 92, + ENOATTR = 93, + EBADMSG = 94, + EMULTIHOP = 95, + ENODATA = 96, + ENOLINK = 97, + ENOSR = 98, + ENOSTR = 99, + EPROTO = 100, + ETIME = 101, + EOPNOTSUPP = 102, + ENOPOLICY = 103, + ENOTRECOVERABLE = 104, + EOWNERDEAD = 105, + EQFULL = 106, } + + pub static ELAST: Errno = EQFULL; + pub static EWOULDBLOCK: Errno = EAGAIN; + pub static EDEADLOCK: Errno = EDEADLK; + + pub static EL2NSYNC: Errno = UnknownErrno; } diff --git a/src/fcntl.rs b/src/fcntl.rs index 486b95fe..ccaee9bc 100644 --- a/src/fcntl.rs +++ b/src/fcntl.rs @@ -1,44 +1,18 @@ -#![cfg(target_os = "linux")] - use std::path::Path; use std::io::FilePermission; -use libc::c_int; -use errno::{SysResult, SysError, from_ffi}; +use libc::{c_int, mode_t}; +use errno::{SysResult, SysError}; -pub type Fd = c_int; +pub use self::consts::*; -bitflags!( - flags OFlag: c_int { - static O_ACCMODE = 0o00000003, - static O_RDONLY = 0o00000000, - static O_WRONLY = 0o00000001, - static O_RDWR = 0o00000002, - static O_CREAT = 0o00000100, - static O_EXCL = 0o00000200, - static O_NOCTTY = 0o00000400, - static O_TRUNC = 0o00001000, - static O_APPEND = 0o00002000, - static O_NONBLOCK = 0o00004000, - static O_DSYNC = 0o00010000, - static O_DIRECT = 0o00040000, - static O_LARGEFILE = 0o00100000, - static O_DIRECTORY = 0o00200000, - static O_NOFOLLOW = 0o00400000, - static O_NOATIME = 0o01000000, - static O_CLOEXEC = 0o02000000, - static O_SYNC = 0o04000000, - static O_PATH = 0o10000000, - static O_TMPFILE = 0o20000000, - static O_NDELAY = O_NONBLOCK.bits - } -) +pub type Fd = c_int; mod ffi { pub use libc::open; } pub fn open(path: &Path, oflag: OFlag, mode: FilePermission) -> SysResult<Fd> { - let fd = unsafe { ffi::open(path.to_c_str().as_ptr(), oflag.bits, mode.bits()) }; + let fd = unsafe { ffi::open(path.to_c_str().as_ptr(), oflag.bits(), mode.bits() as mode_t) }; if fd < 0 { return Err(SysError::last()); @@ -46,3 +20,66 @@ pub fn open(path: &Path, oflag: OFlag, mode: FilePermission) -> SysResult<Fd> { Ok(fd) } + +#[cfg(target_os = "linux")] +mod consts { + use libc::c_int; + + bitflags!( + flags OFlag: c_int { + static O_ACCMODE = 0o00000003, + static O_RDONLY = 0o00000000, + static O_WRONLY = 0o00000001, + static O_RDWR = 0o00000002, + static O_CREAT = 0o00000100, + static O_EXCL = 0o00000200, + static O_NOCTTY = 0o00000400, + static O_TRUNC = 0o00001000, + static O_APPEND = 0o00002000, + static O_NONBLOCK = 0o00004000, + static O_DSYNC = 0o00010000, + static O_DIRECT = 0o00040000, + static O_LARGEFILE = 0o00100000, + static O_DIRECTORY = 0o00200000, + static O_NOFOLLOW = 0o00400000, + static O_NOATIME = 0o01000000, + static O_CLOEXEC = 0o02000000, + static O_SYNC = 0o04000000, + static O_PATH = 0o10000000, + static O_TMPFILE = 0o20000000, + static O_NDELAY = O_NONBLOCK.bits + } + ) +} + +#[cfg(target_os = "macos")] +#[cfg(target_os = "ios")] +mod consts { + use libc::c_int; + + bitflags!( + flags OFlag: c_int { + static O_ACCMODE = 0o00000003, + static O_RDONLY = 0o00000000, + static O_WRONLY = 0o00000001, + static O_RDWR = 0o00000002, + static O_CREAT = 0o00000100, + static O_EXCL = 0o00000200, + static O_NOCTTY = 0o00000400, + static O_TRUNC = 0o00001000, + static O_APPEND = 0o00002000, + static O_NONBLOCK = 0o00004000, + static O_DSYNC = 0o00010000, + static O_DIRECT = 0o00040000, + static O_LARGEFILE = 0o00100000, + static O_DIRECTORY = 0o00200000, + static O_NOFOLLOW = 0o00400000, + static O_NOATIME = 0o01000000, + static O_CLOEXEC = 0o02000000, + static O_SYNC = 0o04000000, + static O_PATH = 0o10000000, + static O_TMPFILE = 0o20000000, + static O_NDELAY = O_NONBLOCK.bits + } + ) +} @@ -5,11 +5,34 @@ extern crate libc; pub use errno::{SysResult, SysError}; +#[cfg(target_os = "linux")] +#[cfg(target_os = "macos")] +#[cfg(target_os = "ios")] pub mod errno; + +#[cfg(target_os = "linux")] pub mod features; + +#[cfg(target_os = "linux")] +#[cfg(target_os = "macos")] +#[cfg(target_os = "ios")] pub mod fcntl; + +#[cfg(target_os = "linux")] pub mod mount; + +#[cfg(target_os = "linux")] pub mod sched; + +#[cfg(target_os = "linux")] +#[cfg(target_os = "macos")] +#[cfg(target_os = "ios")] pub mod sys; + +#[cfg(target_os = "linux")] pub mod syscall; + +#[cfg(target_os = "linux")] +#[cfg(target_os = "macos")] +#[cfg(target_os = "ios")] pub mod unistd; diff --git a/src/mount.rs b/src/mount.rs index 9e6a2cbb..5256b4d1 100644 --- a/src/mount.rs +++ b/src/mount.rs @@ -1,5 +1,3 @@ -#![cfg(target_os = "linux")] - use std::ptr; use std::path::Path; use libc::{c_ulong, c_int, c_void}; 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] } diff --git a/src/unistd.rs b/src/unistd.rs index 4b141f17..c418b1e9 100644 --- a/src/unistd.rs +++ b/src/unistd.rs @@ -1,13 +1,12 @@ -#![cfg(target_os = "linux")] - use std::ptr; use std::c_str::{CString, ToCStr}; -use std::path::Path; use libc::{c_char, c_void, size_t}; use fcntl::{Fd, OFlag}; -use syscall::{syscall, SysPivotRoot}; use errno::{SysResult, SysError, from_ffi}; +#[cfg(target_os = "linux")] +pub use self::linux::*; + mod ffi { use libc::{c_char, c_int}; pub use libc::{close, read, write}; @@ -94,21 +93,6 @@ pub fn execve(filename: CString, args: &[CString], env: &[CString]) -> SysResult Ok(()) } -pub fn pivot_root(new_root: &Path, put_old: &Path) -> SysResult<()> { - let new_root = new_root.to_c_str(); - let put_old = put_old.to_c_str(); - - let res = unsafe { - syscall(SysPivotRoot, new_root.as_ptr(), put_old.as_ptr()) - }; - - if res != 0 { - return Err(SysError::last()); - } - - Ok(()) -} - pub fn close(fd: Fd) -> SysResult<()> { let res = unsafe { ffi::close(fd) }; from_ffi(res) @@ -133,3 +117,25 @@ pub fn write(fd: Fd, buf: &[u8]) -> SysResult<uint> { return Ok(res as uint) } + +#[cfg(target_os = "linux")] +mod linux { + use std::path::Path; + use syscall::{syscall, SysPivotRoot}; + use errno::{SysResult, SysError}; + + pub fn pivot_root(new_root: &Path, put_old: &Path) -> SysResult<()> { + let new_root = new_root.to_c_str(); + let put_old = put_old.to_c_str(); + + let res = unsafe { + syscall(SysPivotRoot, new_root.as_ptr(), put_old.as_ptr()) + }; + + if res != 0 { + return Err(SysError::last()); + } + + Ok(()) + } +} |