use crossbeam_channel::{bounded, Receiver};
use signal_hook::consts::signal::*;
use signal_hook::consts::{SIGCONT, SIGTSTP};
use signal_hook::iterator::Signals;
use signal_hook::low_level;
use std::io::Error;
use std::os::raw::c_int;
use std::thread;
const SIGNALS: &[c_int] = &[SIGTERM, SIGQUIT, SIGINT, SIGTSTP, SIGCONT];
pub fn sys_sig_listener() -> Result<Receiver<i32>, Error> {
let (sender, receiver) = bounded(1);
thread::spawn(move || {
info!("Start system signal listener");
let mut sigs = Signals::new(SIGNALS).unwrap();
for signal in &mut sigs {
warn!("Received signal {:?}", signal);
if signal != SIGTERM {
low_level::emulate_default_handler(signal).unwrap();
}
let _ = sender.send(signal);
}
});
Ok(receiver)
}