1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
#![no_std] #[macro_use] extern crate bitflags; extern crate libc; #[macro_use] extern crate syscall; #[macro_use] extern crate unix; bitflags! { pub struct Flags: usize { } } #[cfg(target_os = "linux")] mod linux; #[cfg(target_os = "linux")] pub use linux::{ucontext, mcontext, sigaction}; #[cfg(target_os = "freebsd")] mod freebsd; #[cfg(target_os = "freebsd")] pub use freebsd::{ucontext, mcontext}; pub type Handler = unsafe extern "C" fn(usize, &::libc::siginfo_t, &ucontext); #[cfg(not(target_os = "linux"))] pub unsafe fn sigaction(signal: usize, handler: Handler, flags: Flags) -> Result<Handler, ::unix::Error> { use core::mem; let mut old = mem::MaybeUninit::<::libc::sigaction>::uninit(); esyscall!(SIGACTION, signal, &::libc::sigaction { sa_sigaction: handler as _, sa_flags: (::libc::SA_SIGINFO as usize | flags.bits()) as _, .. mem::zeroed() } as *const _, &mut old as *mut _)?; Ok(mem::transmute(old.assume_init().sa_sigaction)) }