use crate::ffi::signal as raw;
use crate::ffi::types::*;
use crate::error::{OsError, Result};
pub use raw::{
Sigaction,
SIG_DFL, SIG_IGN,
SA_ONSTACK, SA_RESTART, SA_RESETHAND, SA_NOCLDSTOP,
SA_NODEFER, SA_NOCLDWAIT, SA_SIGINFO,
SIG_BLOCK, SIG_UNBLOCK, SIG_SETMASK,
};
pub fn signal(signum: c_int, handler: usize) -> Result<usize> {
let prev = unsafe { raw::signal(signum, handler) };
if prev == raw::SIG_ERR { Err(OsError::last()) } else { Ok(prev) }
}
pub fn sigaction(signum: c_int, act: &Sigaction) -> Result<Sigaction> {
let mut old = Sigaction { sa_handler: SIG_DFL, sa_mask: 0, sa_flags: 0 };
let r = unsafe { raw::sigaction(signum, act as *const _, &mut old as *mut _) };
if r < 0 { Err(OsError::last()) } else { Ok(old) }
}
#[inline]
pub fn ignore_action() -> Sigaction {
Sigaction { sa_handler: SIG_IGN, sa_mask: 0, sa_flags: SA_RESTART }
}
#[inline]
pub fn default_action() -> Sigaction {
Sigaction { sa_handler: SIG_DFL, sa_mask: 0, sa_flags: 0 }
}
#[inline]
pub fn handler_action(f: unsafe extern "C" fn(c_int), flags: c_int) -> Sigaction {
Sigaction { sa_handler: f as usize, sa_mask: 0, sa_flags: flags }
}
pub fn sigprocmask(how: c_int, set: Option<&sigset_t>) -> Result<sigset_t> {
let mut old: sigset_t = 0;
let p = match set {
Some(s) => s as *const sigset_t,
None => core::ptr::null(),
};
let r = unsafe { raw::sigprocmask(how, p, &mut old) };
if r < 0 { Err(OsError::last()) } else { Ok(old) }
}
pub fn kill(pid: pid_t, sig: c_int) -> Result<()> {
let r = unsafe { raw::kill(pid, sig) };
if r < 0 { Err(OsError::last()) } else { Ok(()) }
}
pub fn raise(sig: c_int) -> Result<()> {
let r = unsafe { raw::raise(sig) };
if r < 0 { Err(OsError::last()) } else { Ok(()) }
}