diff options
-rw-r--r-- | src/sys/aio.rs | 62 | ||||
-rw-r--r-- | src/sys/event.rs | 2 | ||||
-rw-r--r-- | src/sys/reboot.rs | 27 | ||||
-rw-r--r-- | src/sys/signal.rs | 103 | ||||
-rw-r--r-- | src/sys/wait.rs | 35 |
5 files changed, 133 insertions, 96 deletions
diff --git a/src/sys/aio.rs b/src/sys/aio.rs index 4be0da7b..826c0973 100644 --- a/src/sys/aio.rs +++ b/src/sys/aio.rs @@ -13,38 +13,44 @@ use sys::time::TimeSpec; /// Mode for `AioCb::fsync`. Controls whether only data or both data and /// metadata are synced. -#[repr(i32)] -#[derive(Clone, Copy, Debug, PartialEq)] -pub enum AioFsyncMode { - /// do it like `fsync` - O_SYNC = libc::O_SYNC, - /// on supported operating systems only, do it like `fdatasync` - #[cfg(any(target_os = "openbsd", target_os = "bitrig", - target_os = "netbsd", target_os = "macos", target_os = "ios", - target_os = "linux"))] - O_DSYNC = libc::O_DSYNC +libc_enum! { + #[repr(i32)] + pub enum AioFsyncMode { + /// do it like `fsync` + O_SYNC, + /// on supported operating systems only, do it like `fdatasync` + #[cfg(any(target_os = "bitrig", + target_os = "ios", + target_os = "linux", + target_os = "macos", + target_os = "netbsd", + target_os = "openbsd"))] + O_DSYNC + } } -/// When used with `lio_listio`, determines whether a given `aiocb` should be -/// used for a read operation, a write operation, or ignored. Has no effect for -/// any other aio functions. -#[repr(i32)] -#[derive(Clone, Copy, Debug, PartialEq)] -pub enum LioOpcode { - LIO_NOP = libc::LIO_NOP, - LIO_WRITE = libc::LIO_WRITE, - LIO_READ = libc::LIO_READ +libc_enum! { + /// When used with `lio_listio`, determines whether a given `aiocb` should be + /// used for a read operation, a write operation, or ignored. Has no effect for + /// any other aio functions. + #[repr(i32)] + pub enum LioOpcode { + LIO_NOP, + LIO_WRITE, + LIO_READ, + } } -/// Mode for `lio_listio`. -#[repr(i32)] -#[derive(Clone, Copy, Debug, PartialEq)] -pub enum LioMode { - /// Requests that `lio_listio` block until all requested operations have - /// been completed - LIO_WAIT = libc::LIO_WAIT, - /// Requests that `lio_listio` return immediately - LIO_NOWAIT = libc::LIO_NOWAIT, +libc_enum! { + /// Mode for `lio_listio`. + #[repr(i32)] + pub enum LioMode { + /// Requests that `lio_listio` block until all requested operations have + /// been completed + LIO_WAIT, + /// Requests that `lio_listio` return immediately + LIO_NOWAIT, + } } /// Return values for `AioCb::cancel and aio_cancel_all` diff --git a/src/sys/event.rs b/src/sys/event.rs index a96dd07c..189f8239 100644 --- a/src/sys/event.rs +++ b/src/sys/event.rs @@ -34,7 +34,7 @@ type type_of_data = libc::int64_t; type type_of_event_filter = u32; #[cfg(not(target_os = "netbsd"))] type type_of_event_filter = i16; -libc_enum!{ +libc_enum! { #[cfg_attr(target_os = "netbsd", repr(u32))] #[cfg_attr(not(target_os = "netbsd"), repr(i16))] pub enum EventFilter { diff --git a/src/sys/reboot.rs b/src/sys/reboot.rs index 94f30f62..5b340e32 100644 --- a/src/sys/reboot.rs +++ b/src/sys/reboot.rs @@ -5,19 +5,20 @@ use libc; use void::Void; use std::mem::drop; -/// How exactly should the system be rebooted. -/// -/// See [`set_cad_enabled()`](fn.set_cad_enabled.html) for -/// enabling/disabling Ctrl-Alt-Delete. -#[repr(i32)] -#[derive(Clone, Copy, Debug, Eq, PartialEq)] -pub enum RebootMode { - RB_HALT_SYSTEM = libc::RB_HALT_SYSTEM, - RB_KEXEC = libc::RB_KEXEC, - RB_POWER_OFF = libc::RB_POWER_OFF, - RB_AUTOBOOT = libc::RB_AUTOBOOT, - // we do not support Restart2, - RB_SW_SUSPEND = libc::RB_SW_SUSPEND, +libc_enum! { + /// How exactly should the system be rebooted. + /// + /// See [`set_cad_enabled()`](fn.set_cad_enabled.html) for + /// enabling/disabling Ctrl-Alt-Delete. + #[repr(i32)] + pub enum RebootMode { + RB_HALT_SYSTEM, + RB_KEXEC, + RB_POWER_OFF, + RB_AUTOBOOT, + // we do not support Restart2, + RB_SW_SUSPEND, + } } pub fn reboot(how: RebootMode) -> Result<Void> { diff --git a/src/sys/signal.rs b/src/sys/signal.rs index b22b665c..093fdb8e 100644 --- a/src/sys/signal.rs +++ b/src/sys/signal.rs @@ -11,50 +11,52 @@ use std::ptr; #[cfg(not(target_os = "openbsd"))] pub use self::sigevent::*; -// Currently there is only one definition of c_int in libc, as well as only one -// type for signal constants. -// We would prefer to use the libc::c_int alias in the repr attribute. Unfortunately -// this is not (yet) possible. -#[derive(Clone, Copy, Debug, Eq, PartialEq)] -#[repr(i32)] -pub enum Signal { - SIGHUP = libc::SIGHUP, - SIGINT = libc::SIGINT, - SIGQUIT = libc::SIGQUIT, - SIGILL = libc::SIGILL, - SIGTRAP = libc::SIGTRAP, - SIGABRT = libc::SIGABRT, - SIGBUS = libc::SIGBUS, - SIGFPE = libc::SIGFPE, - SIGKILL = libc::SIGKILL, - SIGUSR1 = libc::SIGUSR1, - SIGSEGV = libc::SIGSEGV, - SIGUSR2 = libc::SIGUSR2, - SIGPIPE = libc::SIGPIPE, - SIGALRM = libc::SIGALRM, - SIGTERM = libc::SIGTERM, - #[cfg(all(any(target_os = "linux", target_os = "android", target_os = "emscripten"), not(any(target_arch = "mips", target_arch = "mips64"))))] - SIGSTKFLT = libc::SIGSTKFLT, - SIGCHLD = libc::SIGCHLD, - SIGCONT = libc::SIGCONT, - SIGSTOP = libc::SIGSTOP, - SIGTSTP = libc::SIGTSTP, - SIGTTIN = libc::SIGTTIN, - SIGTTOU = libc::SIGTTOU, - SIGURG = libc::SIGURG, - SIGXCPU = libc::SIGXCPU, - SIGXFSZ = libc::SIGXFSZ, - SIGVTALRM = libc::SIGVTALRM, - SIGPROF = libc::SIGPROF, - SIGWINCH = libc::SIGWINCH, - SIGIO = libc::SIGIO, - #[cfg(any(target_os = "linux", target_os = "android", target_os = "emscripten"))] - SIGPWR = libc::SIGPWR, - SIGSYS = libc::SIGSYS, - #[cfg(not(any(target_os = "linux", target_os = "android", target_os = "emscripten")))] - SIGEMT = libc::SIGEMT, - #[cfg(not(any(target_os = "linux", target_os = "android", target_os = "emscripten")))] - SIGINFO = libc::SIGINFO, +libc_enum!{ + // Currently there is only one definition of c_int in libc, as well as only one + // type for signal constants. + // We would prefer to use the libc::c_int alias in the repr attribute. Unfortunately + // this is not (yet) possible. + #[repr(i32)] + pub enum Signal { + SIGHUP, + SIGINT, + SIGQUIT, + SIGILL, + SIGTRAP, + SIGABRT, + SIGBUS, + SIGFPE, + SIGKILL, + SIGUSR1, + SIGSEGV, + SIGUSR2, + SIGPIPE, + SIGALRM, + SIGTERM, + #[cfg(all(any(target_os = "android", target_os = "emscripten", target_os = "linux"), + not(any(target_arch = "mips", target_arch = "mips64"))))] + SIGSTKFLT, + SIGCHLD, + SIGCONT, + SIGSTOP, + SIGTSTP, + SIGTTIN, + SIGTTOU, + SIGURG, + SIGXCPU, + SIGXFSZ, + SIGVTALRM, + SIGPROF, + SIGWINCH, + SIGIO, + #[cfg(any(target_os = "android", target_os = "emscripten", target_os = "linux"))] + SIGPWR, + SIGSYS, + #[cfg(not(any(target_os = "android", target_os = "emscripten", target_os = "linux")))] + SIGEMT, + #[cfg(not(any(target_os = "android", target_os = "emscripten", target_os = "linux")))] + SIGINFO, + } } pub use self::Signal::*; @@ -241,12 +243,13 @@ libc_bitflags!{ } } -#[repr(i32)] -#[derive(Clone, Copy, PartialEq)] -pub enum SigmaskHow { - SIG_BLOCK = libc::SIG_BLOCK, - SIG_UNBLOCK = libc::SIG_UNBLOCK, - SIG_SETMASK = libc::SIG_SETMASK, +libc_enum! { + #[repr(i32)] + pub enum SigmaskHow { + SIG_BLOCK, + SIG_UNBLOCK, + SIG_SETMASK, + } } #[derive(Clone, Copy)] diff --git a/src/sys/wait.rs b/src/sys/wait.rs index ec1241be..019b751f 100644 --- a/src/sys/wait.rs +++ b/src/sys/wait.rs @@ -8,10 +8,31 @@ libc_bitflags!( pub struct WaitPidFlag: c_int { WNOHANG; WUNTRACED; + #[cfg(any(target_os = "android", + target_os = "freebsd", + target_os = "haiku", + target_os = "ios", + target_os = "linux", + target_os = "macos", + target_os = "netbsd"))] WEXITED; WCONTINUED; + #[cfg(any(target_os = "android", + target_os = "freebsd", + target_os = "haiku", + target_os = "ios", + target_os = "linux", + target_os = "macos", + target_os = "netbsd"))] WSTOPPED; /// Don't reap, just poll status. + #[cfg(any(target_os = "android", + target_os = "freebsd", + target_os = "haiku", + target_os = "ios", + target_os = "linux", + target_os = "macos", + target_os = "netbsd"))] WNOWAIT; /// Don't wait on children of other threads in this group #[cfg(any(target_os = "android", target_os = "linux"))] @@ -74,7 +95,7 @@ pub enum WaitStatus { /// child process. This is only returned if `WaitPidFlag::WNOHANG` /// was used (otherwise `wait()` or `waitpid()` would block until /// there was something to report). - StillAlive + StillAlive, } impl WaitStatus { @@ -140,7 +161,7 @@ fn continued(status: i32) -> bool { unsafe { libc::WIFCONTINUED(status) } } -fn decode(pid : Pid, status: i32) -> WaitStatus { +fn decode(pid: Pid, status: i32) -> WaitStatus { if exited(status) { WaitStatus::Exited(pid, exit_status(status)) } else if signaled(status) { @@ -178,10 +199,16 @@ pub fn waitpid<P: Into<Option<Pid>>>(pid: P, options: Option<WaitPidFlag>) -> Re let option_bits = match options { Some(bits) => bits.bits(), - None => 0 + None => 0, }; - let res = unsafe { libc::waitpid(pid.into().unwrap_or(Pid::from_raw(-1)).into(), &mut status as *mut c_int, option_bits) }; + let res = unsafe { + libc::waitpid( + pid.into().unwrap_or(Pid::from_raw(-1)).into(), + &mut status as *mut c_int, + option_bits, + ) + }; Ok(match try!(Errno::result(res)) { 0 => StillAlive, |