pyc_shell/shell/
unixsignal.rs

1//! ## UnixSignal
2//!
3//! `UnixSignal` module provides an API to instantiate nix::sys::signal
4
5/*
6*
7*   Copyright (C) 2020 Christian Visintin - christian.visintin1997@gmail.com
8*
9* 	This file is part of "Pyc"
10*
11*   Pyc is free software: you can redistribute it and/or modify
12*   it under the terms of the GNU General Public License as published by
13*   the Free Software Foundation, either version 3 of the License, or
14*   (at your option) any later version.
15*
16*   Pyc is distributed in the hope that it will be useful,
17*   but WITHOUT ANY WARRANTY; without even the implied warranty of
18*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19*   GNU General Public License for more details.
20*
21*   You should have received a copy of the GNU General Public License
22*   along with Pyc.  If not, see <http://www.gnu.org/licenses/>.
23*
24*/
25
26extern crate nix;
27
28use nix::sys::signal::Signal;
29
30/// ## UnixSignal
31///
32/// The UnixSignal enums represents the UNIX signals
33#[derive(Copy, Clone, PartialEq, std::fmt::Debug)]
34#[allow(dead_code)]
35pub enum UnixSignal {
36    Sighup = 1,
37    Sigint = 2,
38    Sigquit = 3,
39    Sigill = 4,
40    Sigtrap = 5,
41    Sigabrt = 6,
42    Sigbus = 7,
43    Sigfpe = 8,
44    Sigkill = 9,
45    Sigusr1 = 10,
46    Sigsegv = 11,
47    Sigusr2 = 12,
48    Sigpipe = 13,
49    Sigalrm = 14,
50    Sigterm = 15,
51    Sigstkflt = 16,
52    Sigchld = 17,
53    Sigcont = 18,
54    Sigstop = 19,
55    Sigtstp = 20,
56    Sigttin = 21,
57    Sigttou = 22,
58    Sigurg = 23,
59    Sigxcpu = 24,
60    Sigxfsz = 25,
61    Sigvtalrm = 26,
62    Sigprof = 27,
63    Sigwinch = 28,
64    Sigio = 29,
65    Sigpwr = 30,
66    Sigsys = 31
67}
68
69impl UnixSignal {
70
71    /// ### from_u8
72    /// 
73    /// Convert a u8 to a Unix Signal
74    #[allow(dead_code)]
75    pub fn from_u8(sig: u8) -> Option<UnixSignal> {
76        match sig {
77            1 => Some(UnixSignal::Sighup),
78            2 => Some(UnixSignal::Sigint),
79            3 => Some(UnixSignal::Sigquit),
80            4 => Some(UnixSignal::Sigill),
81            5 => Some(UnixSignal::Sigtrap),
82            6 => Some(UnixSignal::Sigabrt),
83            7 => Some(UnixSignal::Sigbus),
84            8 => Some(UnixSignal::Sigfpe),
85            9 => Some(UnixSignal::Sigkill),
86            10 => Some(UnixSignal::Sigusr1),
87            11 => Some(UnixSignal::Sigsegv),
88            12 => Some(UnixSignal::Sigusr2),
89            13 => Some(UnixSignal::Sigpipe),
90            14 => Some(UnixSignal::Sigalrm),
91            15 => Some(UnixSignal::Sigterm),
92            16 => Some(UnixSignal::Sigstkflt),
93            17 => Some(UnixSignal::Sigchld),
94            18 => Some(UnixSignal::Sigcont),
95            19 => Some(UnixSignal::Sigstop),
96            20 => Some(UnixSignal::Sigtstp),
97            21 => Some(UnixSignal::Sigttin),
98            22 => Some(UnixSignal::Sigttou),
99            23 => Some(UnixSignal::Sigurg),
100            24 => Some(UnixSignal::Sigxcpu),
101            25 => Some(UnixSignal::Sigxfsz),
102            26 => Some(UnixSignal::Sigvtalrm),
103            27 => Some(UnixSignal::Sigprof),
104            28 => Some(UnixSignal::Sigwinch),
105            29 => Some(UnixSignal::Sigio),
106            30 => Some(UnixSignal::Sigpwr),
107            31 => Some(UnixSignal::Sigsys),
108            _ => None
109        }
110    }
111
112    #[cfg(target_os = "macos")]
113    #[cfg(not(tarpaulin_include))]
114    /// ### to_nix_signal
115    /// 
116    /// Converts a UnixSignal to a nix::signal
117    pub fn to_nix_signal(&self) -> Signal {
118        match self {
119            UnixSignal::Sigabrt => Signal::SIGABRT,
120            UnixSignal::Sigalrm => Signal::SIGALRM,
121            UnixSignal::Sigbus => Signal::SIGBUS,
122            UnixSignal::Sigchld => Signal::SIGCHLD,
123            UnixSignal::Sigcont => Signal::SIGCONT,
124            UnixSignal::Sigfpe => Signal::SIGFPE,
125            UnixSignal::Sighup => Signal::SIGHUP,
126            UnixSignal::Sigill => Signal::SIGILL,
127            UnixSignal::Sigint => Signal::SIGINT,
128            UnixSignal::Sigio => Signal::SIGIO,
129            UnixSignal::Sigkill => Signal::SIGKILL,
130            UnixSignal::Sigpipe => Signal::SIGPIPE,
131            UnixSignal::Sigprof => Signal::SIGPROF,
132            UnixSignal::Sigpwr => Signal::SIGABRT,
133            UnixSignal::Sigquit => Signal::SIGQUIT,
134            UnixSignal::Sigsegv => Signal::SIGSEGV,
135            UnixSignal::Sigstkflt => Signal::SIGABRT,
136            UnixSignal::Sigstop => Signal::SIGSTOP,
137            UnixSignal::Sigsys => Signal::SIGSYS,
138            UnixSignal::Sigterm => Signal::SIGTERM,
139            UnixSignal::Sigtrap => Signal::SIGTRAP,
140            UnixSignal::Sigtstp => Signal::SIGTSTP,
141            UnixSignal::Sigttin => Signal::SIGTTIN,
142            UnixSignal::Sigttou => Signal::SIGTTOU,
143            UnixSignal::Sigurg => Signal::SIGURG,
144            UnixSignal::Sigusr1 => Signal::SIGUSR1,
145            UnixSignal::Sigusr2 => Signal::SIGUSR2,
146            UnixSignal::Sigvtalrm => Signal::SIGVTALRM,
147            UnixSignal::Sigwinch => Signal::SIGWINCH,
148            UnixSignal::Sigxcpu => Signal::SIGXCPU,
149            UnixSignal::Sigxfsz => Signal::SIGXFSZ
150        }
151    }
152
153    #[cfg(any(target_os = "freebsd", target_os =  "linux", target_os =  "openbsd", target_os =  "netbsd"))]
154    /// ### to_nix_signal
155    /// 
156    /// Converts a UnixSignal to a nix::signal
157    pub fn to_nix_signal(&self) -> Signal {
158        match self {
159            UnixSignal::Sigabrt => Signal::SIGABRT,
160            UnixSignal::Sigalrm => Signal::SIGALRM,
161            UnixSignal::Sigbus => Signal::SIGBUS,
162            UnixSignal::Sigchld => Signal::SIGCHLD,
163            UnixSignal::Sigcont => Signal::SIGCONT,
164            UnixSignal::Sigfpe => Signal::SIGFPE,
165            UnixSignal::Sighup => Signal::SIGHUP,
166            UnixSignal::Sigill => Signal::SIGILL,
167            UnixSignal::Sigint => Signal::SIGINT,
168            UnixSignal::Sigio => Signal::SIGIO,
169            UnixSignal::Sigkill => Signal::SIGKILL,
170            UnixSignal::Sigpipe => Signal::SIGPIPE,
171            UnixSignal::Sigprof => Signal::SIGPROF,
172            UnixSignal::Sigpwr => Signal::SIGPWR,
173            UnixSignal::Sigquit => Signal::SIGQUIT,
174            UnixSignal::Sigsegv => Signal::SIGSEGV,
175            UnixSignal::Sigstkflt => Signal::SIGSTKFLT,
176            UnixSignal::Sigstop => Signal::SIGSTOP,
177            UnixSignal::Sigsys => Signal::SIGSYS,
178            UnixSignal::Sigterm => Signal::SIGTERM,
179            UnixSignal::Sigtrap => Signal::SIGTRAP,
180            UnixSignal::Sigtstp => Signal::SIGTSTP,
181            UnixSignal::Sigttin => Signal::SIGTTIN,
182            UnixSignal::Sigttou => Signal::SIGTTOU,
183            UnixSignal::Sigurg => Signal::SIGURG,
184            UnixSignal::Sigusr1 => Signal::SIGUSR1,
185            UnixSignal::Sigusr2 => Signal::SIGUSR2,
186            UnixSignal::Sigvtalrm => Signal::SIGVTALRM,
187            UnixSignal::Sigwinch => Signal::SIGWINCH,
188            UnixSignal::Sigxcpu => Signal::SIGXCPU,
189            UnixSignal::Sigxfsz => Signal::SIGXFSZ
190        }
191    }
192}
193
194#[cfg(test)]
195mod tests {
196
197    use super::*;
198
199    #[test]
200    fn test_unixsignal_from_u8() {
201        assert_eq!(UnixSignal::from_u8(1).unwrap(), UnixSignal::Sighup);
202        assert_eq!(UnixSignal::from_u8(2).unwrap(), UnixSignal::Sigint);
203        assert_eq!(UnixSignal::from_u8(3).unwrap(), UnixSignal::Sigquit);
204        assert_eq!(UnixSignal::from_u8(4).unwrap(), UnixSignal::Sigill);
205        assert_eq!(UnixSignal::from_u8(5).unwrap(), UnixSignal::Sigtrap);
206        assert_eq!(UnixSignal::from_u8(6).unwrap(), UnixSignal::Sigabrt);
207        assert_eq!(UnixSignal::from_u8(7).unwrap(), UnixSignal::Sigbus);
208        assert_eq!(UnixSignal::from_u8(8).unwrap(), UnixSignal::Sigfpe);
209        assert_eq!(UnixSignal::from_u8(9).unwrap(), UnixSignal::Sigkill);
210        assert_eq!(UnixSignal::from_u8(10).unwrap(), UnixSignal::Sigusr1);
211        assert_eq!(UnixSignal::from_u8(11).unwrap(), UnixSignal::Sigsegv);
212        assert_eq!(UnixSignal::from_u8(12).unwrap(), UnixSignal::Sigusr2);
213        assert_eq!(UnixSignal::from_u8(13).unwrap(), UnixSignal::Sigpipe);
214        assert_eq!(UnixSignal::from_u8(14).unwrap(), UnixSignal::Sigalrm);
215        assert_eq!(UnixSignal::from_u8(15).unwrap(), UnixSignal::Sigterm);
216        assert_eq!(UnixSignal::from_u8(16).unwrap(), UnixSignal::Sigstkflt);
217        assert_eq!(UnixSignal::from_u8(17).unwrap(), UnixSignal::Sigchld);
218        assert_eq!(UnixSignal::from_u8(18).unwrap(), UnixSignal::Sigcont);
219        assert_eq!(UnixSignal::from_u8(19).unwrap(), UnixSignal::Sigstop);
220        assert_eq!(UnixSignal::from_u8(20).unwrap(), UnixSignal::Sigtstp);
221        assert_eq!(UnixSignal::from_u8(21).unwrap(), UnixSignal::Sigttin);
222        assert_eq!(UnixSignal::from_u8(22).unwrap(), UnixSignal::Sigttou);
223        assert_eq!(UnixSignal::from_u8(23).unwrap(), UnixSignal::Sigurg);
224        assert_eq!(UnixSignal::from_u8(24).unwrap(), UnixSignal::Sigxcpu);
225        assert_eq!(UnixSignal::from_u8(25).unwrap(), UnixSignal::Sigxfsz);
226        assert_eq!(UnixSignal::from_u8(26).unwrap(), UnixSignal::Sigvtalrm);
227        assert_eq!(UnixSignal::from_u8(27).unwrap(), UnixSignal::Sigprof);
228        assert_eq!(UnixSignal::from_u8(28).unwrap(), UnixSignal::Sigwinch);
229        assert_eq!(UnixSignal::from_u8(29).unwrap(), UnixSignal::Sigio);
230        assert_eq!(UnixSignal::from_u8(30).unwrap(), UnixSignal::Sigpwr);
231        assert_eq!(UnixSignal::from_u8(31).unwrap(), UnixSignal::Sigsys);
232        assert!(UnixSignal::from_u8(255).is_none());
233    }
234
235    #[test]
236    #[cfg(any(target_os = "freebsd", target_os =  "linux", target_os =  "openbsd", target_os =  "netbsd"))]
237    fn test_unixsignal_to_nix() {
238        assert_eq!(UnixSignal::Sigabrt.to_nix_signal(), Signal::SIGABRT);
239        assert_eq!(UnixSignal::Sighup.to_nix_signal(), Signal::SIGHUP);
240        assert_eq!(UnixSignal::Sigint.to_nix_signal(), Signal::SIGINT);
241        assert_eq!(UnixSignal::Sigquit.to_nix_signal(), Signal::SIGQUIT);
242        assert_eq!(UnixSignal::Sigill.to_nix_signal(), Signal::SIGILL);
243        assert_eq!(UnixSignal::Sigtrap.to_nix_signal(), Signal::SIGTRAP);
244        assert_eq!(UnixSignal::Sigbus.to_nix_signal(), Signal::SIGBUS);
245        assert_eq!(UnixSignal::Sigfpe.to_nix_signal(), Signal::SIGFPE);
246        assert_eq!(UnixSignal::Sigkill.to_nix_signal(), Signal::SIGKILL);
247        assert_eq!(UnixSignal::Sigusr1.to_nix_signal(), Signal::SIGUSR1);
248        assert_eq!(UnixSignal::Sigsegv.to_nix_signal(), Signal::SIGSEGV);
249        assert_eq!(UnixSignal::Sigusr2.to_nix_signal(), Signal::SIGUSR2);
250        assert_eq!(UnixSignal::Sigpipe.to_nix_signal(), Signal::SIGPIPE);
251        assert_eq!(UnixSignal::Sigalrm.to_nix_signal(), Signal::SIGALRM);
252        assert_eq!(UnixSignal::Sigterm.to_nix_signal(), Signal::SIGTERM);
253        assert_eq!(UnixSignal::Sigstkflt.to_nix_signal(), Signal::SIGSTKFLT);
254        assert_eq!(UnixSignal::Sigchld.to_nix_signal(), Signal::SIGCHLD);
255        assert_eq!(UnixSignal::Sigcont.to_nix_signal(), Signal::SIGCONT);
256        assert_eq!(UnixSignal::Sigstop.to_nix_signal(), Signal::SIGSTOP);
257        assert_eq!(UnixSignal::Sigtstp.to_nix_signal(), Signal::SIGTSTP);
258        assert_eq!(UnixSignal::Sigttin.to_nix_signal(), Signal::SIGTTIN);
259        assert_eq!(UnixSignal::Sigttou.to_nix_signal(), Signal::SIGTTOU);
260        assert_eq!(UnixSignal::Sigurg.to_nix_signal(), Signal::SIGURG);
261        assert_eq!(UnixSignal::Sigxcpu.to_nix_signal(), Signal::SIGXCPU);
262        assert_eq!(UnixSignal::Sigxfsz.to_nix_signal(), Signal::SIGXFSZ);
263        assert_eq!(UnixSignal::Sigvtalrm.to_nix_signal(), Signal::SIGVTALRM);
264        assert_eq!(UnixSignal::Sigprof.to_nix_signal(), Signal::SIGPROF);
265        assert_eq!(UnixSignal::Sigwinch.to_nix_signal(), Signal::SIGWINCH);
266        assert_eq!(UnixSignal::Sigio.to_nix_signal(), Signal::SIGIO);
267        assert_eq!(UnixSignal::Sigpwr.to_nix_signal(), Signal::SIGPWR);
268        assert_eq!(UnixSignal::Sigsys.to_nix_signal(), Signal::SIGSYS);
269    }
270
271    #[test]
272    #[cfg(target_os = "macos")]
273    fn test_unixsignal_to_nix() {
274        assert_eq!(UnixSignal::Sigabrt.to_nix_signal(), Signal::SIGABRT);
275        assert_eq!(UnixSignal::Sighup.to_nix_signal(), Signal::SIGHUP);
276        assert_eq!(UnixSignal::Sigint.to_nix_signal(), Signal::SIGINT);
277        assert_eq!(UnixSignal::Sigquit.to_nix_signal(), Signal::SIGQUIT);
278        assert_eq!(UnixSignal::Sigill.to_nix_signal(), Signal::SIGILL);
279        assert_eq!(UnixSignal::Sigtrap.to_nix_signal(), Signal::SIGTRAP);
280        assert_eq!(UnixSignal::Sigbus.to_nix_signal(), Signal::SIGBUS);
281        assert_eq!(UnixSignal::Sigfpe.to_nix_signal(), Signal::SIGFPE);
282        assert_eq!(UnixSignal::Sigkill.to_nix_signal(), Signal::SIGKILL);
283        assert_eq!(UnixSignal::Sigusr1.to_nix_signal(), Signal::SIGUSR1);
284        assert_eq!(UnixSignal::Sigsegv.to_nix_signal(), Signal::SIGSEGV);
285        assert_eq!(UnixSignal::Sigusr2.to_nix_signal(), Signal::SIGUSR2);
286        assert_eq!(UnixSignal::Sigpipe.to_nix_signal(), Signal::SIGPIPE);
287        assert_eq!(UnixSignal::Sigalrm.to_nix_signal(), Signal::SIGALRM);
288        assert_eq!(UnixSignal::Sigterm.to_nix_signal(), Signal::SIGTERM);
289        assert_eq!(UnixSignal::Sigstkflt.to_nix_signal(), Signal::SIGABRT);
290        assert_eq!(UnixSignal::Sigchld.to_nix_signal(), Signal::SIGCHLD);
291        assert_eq!(UnixSignal::Sigcont.to_nix_signal(), Signal::SIGCONT);
292        assert_eq!(UnixSignal::Sigstop.to_nix_signal(), Signal::SIGSTOP);
293        assert_eq!(UnixSignal::Sigtstp.to_nix_signal(), Signal::SIGTSTP);
294        assert_eq!(UnixSignal::Sigttin.to_nix_signal(), Signal::SIGTTIN);
295        assert_eq!(UnixSignal::Sigttou.to_nix_signal(), Signal::SIGTTOU);
296        assert_eq!(UnixSignal::Sigurg.to_nix_signal(), Signal::SIGURG);
297        assert_eq!(UnixSignal::Sigxcpu.to_nix_signal(), Signal::SIGXCPU);
298        assert_eq!(UnixSignal::Sigxfsz.to_nix_signal(), Signal::SIGXFSZ);
299        assert_eq!(UnixSignal::Sigvtalrm.to_nix_signal(), Signal::SIGVTALRM);
300        assert_eq!(UnixSignal::Sigprof.to_nix_signal(), Signal::SIGPROF);
301        assert_eq!(UnixSignal::Sigwinch.to_nix_signal(), Signal::SIGWINCH);
302        assert_eq!(UnixSignal::Sigio.to_nix_signal(), Signal::SIGIO);
303        assert_eq!(UnixSignal::Sigpwr.to_nix_signal(), Signal::SIGABRT);
304        assert_eq!(UnixSignal::Sigsys.to_nix_signal(), Signal::SIGSYS);
305    }
306}