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 39 40 41 42 43 44 45 46 47 48 49
// @adjivas - github.com/adjivas. See the LICENSE // file at the top-level directory of this distribution and at // https://github.com/adjivas/sig // // This file may not be copied, modified, or distributed // except according to those terms. //! # Sig //! //! [![Crate][crate-badge]][crate] [![license-badge][]][license] [![travis-badge][]][travis] [![circle-badge][]][circle] //! //! [crate-badge]: https://img.shields.io/badge/crates.io-v0.1.1-orange.svg?style=flat-square //! [crate]: https://crates.io/crates/sig //! [license-badge]: https://img.shields.io/crates/l/cublas.svg?style=flat-square //! [license]: https://github.com/adjivas/sig/blob/master/README.md#license //! [travis-badge]: https://travis-ci.org/adjivas/sig.svg?style=flat-square //! [travis]: https://travis-ci.org/adjivas/sig //! [circle-badge]: https://circleci.com/gh/adjivas/sig/tree/master.svg?style=svg //! [circle]: https://circleci.com/gh/adjivas/sig/tree/master extern crate libc; #[macro_use] mod macros; pub mod ffi; use libc::{sigaction, sighandler_t, sigfillset}; use std::{mem, ptr}; #[inline] pub unsafe fn set_signal_handler(signal: ffi::c_int, handler: unsafe extern "C" fn(ffi::c_int)) { let mut sigset = mem::uninitialized(); // Block all signals during the handler. This is the expected behavior, but // it's not guaranteed by `signal()`. if sigfillset(&mut sigset) != -1 { // Done because sigaction has private members. // This is safe because sa_restorer and sa_handlers are pointers that // might be null (that is, zero). let mut action: sigaction = mem::zeroed(); // action.sa_flags = 0; action.sa_mask = sigset; action.sa_sigaction = handler as sighandler_t; sigaction(signal, &action, ptr::null_mut()); } }