1use simple_signal::{self};
2use std::sync::mpsc;
3
4#[derive(Clone, Copy, PartialEq, Eq, Debug)]
6pub enum Signal {
7 Hup,
8 Int,
9 Quit,
10 Ill,
11 Abrt,
12 Fpe,
13 Kill,
14 Segv,
15 Pipe,
16 Alrm,
17 Term,
18}
19
20pub fn all() -> Vec<simple_signal::Signal> {
21 vec![
22 simple_signal::Signal::Hup, simple_signal::Signal::Int, simple_signal::Signal::Ill, simple_signal::Signal::Abrt, simple_signal::Signal::Fpe, simple_signal::Signal::Pipe, simple_signal::Signal::Alrm, simple_signal::Signal::Term, ]
31}
32
33pub fn from_i32(sig_num: i32) -> Result<Signal, String> {
34 match sig_num {
35 0 => Ok(Signal::Hup),
36 1 => Ok(Signal::Int),
37 3 => Ok(Signal::Ill),
38 4 => Ok(Signal::Abrt),
39 5 => Ok(Signal::Fpe),
40 8 => Ok(Signal::Pipe),
41 9 => Ok(Signal::Alrm),
42 10 => Ok(Signal::Term),
43 _ => Err(format!("Got unsupported signal: {:?}", sig_num)),
44 }
45}
46
47pub trait SignalSender {
48 fn prepare_signals(&self);
49}
50
51impl SignalSender for mpsc::Sender<i32> {
52 fn prepare_signals(&self) {
53 let s = self.clone();
54 simple_signal::set_handler(&all(), move |signals| {
55 for sig in signals {
56 s.send(*sig as i32).unwrap();
57 }
58 });
59 }
60}
61
62pub trait SignalReceiver {
63 fn listen(&self) -> Result<Signal, String>;
64}
65
66impl SignalReceiver for mpsc::Receiver<i32> {
67 fn listen(&self) -> Result<Signal, String> {
68 from_i32(self.recv().unwrap())
69 }
70}
71
72pub fn new() -> (mpsc::Sender<i32>, mpsc::Receiver<i32>) {
73 mpsc::channel()
74}