use std::sync::atomic::{AtomicBool, Ordering};
pub static STOP: AtomicBool = AtomicBool::new(false);
pub static RELOAD: AtomicBool = AtomicBool::new(false);
pub static STATUS: AtomicBool = AtomicBool::new(false);
const SIGHUP: i32 = 1;
const SIGINT: i32 = 2;
const SIGPIPE: i32 = 13;
const SIGTERM: i32 = 15;
const SIGUSR1: i32 = 10;
const SIG_DFL: usize = 0;
extern "C" {
fn signal(signum: i32, handler: usize) -> usize;
fn sleep(seconds: u32) -> u32;
}
extern "C" fn on_signal(signum: i32) {
match signum {
SIGHUP => RELOAD.store(true, Ordering::SeqCst),
SIGUSR1 => STATUS.store(true, Ordering::SeqCst),
_ => STOP.store(true, Ordering::SeqCst), }
}
pub fn install_signal_handlers() {
let handler = on_signal as extern "C" fn(i32) as usize;
unsafe {
signal(SIGHUP, handler);
signal(SIGINT, handler);
signal(SIGTERM, handler);
signal(SIGUSR1, handler);
signal(SIGPIPE, SIG_DFL);
}
}
pub fn nap(secs: u64) {
unsafe { sleep(secs.min(u32::MAX as u64) as u32) };
}