summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/errno.rs734
-rw-r--r--src/fcntl.rs99
-rw-r--r--src/lib.rs23
-rw-r--r--src/mount.rs2
-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
-rw-r--r--src/unistd.rs44
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
+ }
+ )
+}
diff --git a/src/lib.rs b/src/lib.rs
index e215605e..96579a1b 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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(())
+ }
+}