2015-11-24 01:00:51 +00:00
|
|
|
/*
|
|
|
|
* This file is part of the uutils coreutils package.
|
|
|
|
*
|
|
|
|
* (c) Maciej Dziardziel <fiedzia@gmail.com>
|
|
|
|
*
|
|
|
|
* For the full copyright and license information, please view the LICENSE file
|
|
|
|
* that was distributed with this source code.
|
|
|
|
*/
|
|
|
|
|
2018-03-12 08:20:58 +00:00
|
|
|
pub static DEFAULT_SIGNAL: usize = 15;
|
2015-11-24 01:00:51 +00:00
|
|
|
|
2018-03-12 08:20:58 +00:00
|
|
|
pub struct Signal<'a> {
|
|
|
|
pub name: &'a str,
|
|
|
|
pub value: usize,
|
|
|
|
}
|
2015-11-24 01:00:51 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
Linux Programmer's Manual
|
|
|
|
|
|
|
|
1 HUP 2 INT 3 QUIT 4 ILL 5 TRAP 6 ABRT 7 BUS
|
|
|
|
8 FPE 9 KILL 10 USR1 11 SEGV 12 USR2 13 PIPE 14 ALRM
|
|
|
|
15 TERM 16 STKFLT 17 CHLD 18 CONT 19 STOP 20 TSTP 21 TTIN
|
|
|
|
22 TTOU 23 URG 24 XCPU 25 XFSZ 26 VTALRM 27 PROF 28 WINCH
|
|
|
|
29 POLL 30 PWR 31 SYS
|
|
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
#[cfg(target_os = "linux")]
|
2018-03-12 08:20:58 +00:00
|
|
|
pub static ALL_SIGNALS: [Signal<'static>; 31] = [
|
|
|
|
Signal {
|
|
|
|
name: "HUP",
|
|
|
|
value: 1,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "INT",
|
|
|
|
value: 2,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "QUIT",
|
|
|
|
value: 3,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "ILL",
|
|
|
|
value: 4,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "TRAP",
|
|
|
|
value: 5,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "ABRT",
|
|
|
|
value: 6,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "BUS",
|
|
|
|
value: 7,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "FPE",
|
|
|
|
value: 8,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "KILL",
|
|
|
|
value: 9,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "USR1",
|
|
|
|
value: 10,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "SEGV",
|
|
|
|
value: 11,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "USR2",
|
|
|
|
value: 12,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "PIPE",
|
|
|
|
value: 13,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "ALRM",
|
|
|
|
value: 14,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "TERM",
|
|
|
|
value: 15,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "STKFLT",
|
|
|
|
value: 16,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "CHLD",
|
|
|
|
value: 17,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "CONT",
|
|
|
|
value: 18,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "STOP",
|
|
|
|
value: 19,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "TSTP",
|
|
|
|
value: 20,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "TTIN",
|
|
|
|
value: 21,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "TTOU",
|
|
|
|
value: 22,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "URG",
|
|
|
|
value: 23,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "XCPU",
|
|
|
|
value: 24,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "XFSZ",
|
|
|
|
value: 25,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "VTALRM",
|
|
|
|
value: 26,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "PROF",
|
|
|
|
value: 27,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "WINCH",
|
|
|
|
value: 28,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "POLL",
|
|
|
|
value: 29,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "PWR",
|
|
|
|
value: 30,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "SYS",
|
|
|
|
value: 31,
|
|
|
|
},
|
2015-11-24 01:00:51 +00:00
|
|
|
];
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
|
|
|
|
https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/signal.3.html
|
|
|
|
|
|
|
|
|
|
|
|
No Name Default Action Description
|
|
|
|
1 SIGHUP terminate process terminal line hangup
|
|
|
|
2 SIGINT terminate process interrupt program
|
|
|
|
3 SIGQUIT create core image quit program
|
|
|
|
4 SIGILL create core image illegal instruction
|
|
|
|
5 SIGTRAP create core image trace trap
|
|
|
|
6 SIGABRT create core image abort program (formerly SIGIOT)
|
|
|
|
7 SIGEMT create core image emulate instruction executed
|
|
|
|
8 SIGFPE create core image floating-point exception
|
|
|
|
9 SIGKILL terminate process kill program
|
|
|
|
10 SIGBUS create core image bus error
|
|
|
|
11 SIGSEGV create core image segmentation violation
|
|
|
|
12 SIGSYS create core image non-existent system call invoked
|
|
|
|
13 SIGPIPE terminate process write on a pipe with no reader
|
|
|
|
14 SIGALRM terminate process real-time timer expired
|
|
|
|
15 SIGTERM terminate process software termination signal
|
|
|
|
16 SIGURG discard signal urgent condition present on socket
|
|
|
|
17 SIGSTOP stop process stop (cannot be caught or ignored)
|
|
|
|
18 SIGTSTP stop process stop signal generated from keyboard
|
|
|
|
19 SIGCONT discard signal continue after stop
|
|
|
|
20 SIGCHLD discard signal child status has changed
|
|
|
|
21 SIGTTIN stop process background read attempted from control terminal
|
|
|
|
22 SIGTTOU stop process background write attempted to control terminal
|
|
|
|
23 SIGIO discard signal I/O is possible on a descriptor (see fcntl(2))
|
|
|
|
24 SIGXCPU terminate process cpu time limit exceeded (see setrlimit(2))
|
|
|
|
25 SIGXFSZ terminate process file size limit exceeded (see setrlimit(2))
|
|
|
|
26 SIGVTALRM terminate process virtual time alarm (see setitimer(2))
|
|
|
|
27 SIGPROF terminate process profiling timer alarm (see setitimer(2))
|
|
|
|
28 SIGWINCH discard signal Window size change
|
|
|
|
29 SIGINFO discard signal status request from keyboard
|
|
|
|
30 SIGUSR1 terminate process User defined signal 1
|
|
|
|
31 SIGUSR2 terminate process User defined signal 2
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
#[cfg(any(target_os = "macos", target_os = "freebsd"))]
|
2018-03-12 08:20:58 +00:00
|
|
|
pub static ALL_SIGNALS: [Signal<'static>; 31] = [
|
|
|
|
Signal {
|
|
|
|
name: "HUP",
|
|
|
|
value: 1,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "INT",
|
|
|
|
value: 2,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "QUIT",
|
|
|
|
value: 3,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "ILL",
|
|
|
|
value: 4,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "TRAP",
|
|
|
|
value: 5,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "ABRT",
|
|
|
|
value: 6,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "EMT",
|
|
|
|
value: 7,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "FPE",
|
|
|
|
value: 8,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "KILL",
|
|
|
|
value: 9,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "BUS",
|
|
|
|
value: 10,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "SEGV",
|
|
|
|
value: 11,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "SYS",
|
|
|
|
value: 12,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "PIPE",
|
|
|
|
value: 13,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "ALRM",
|
|
|
|
value: 14,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "TERM",
|
|
|
|
value: 15,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "URG",
|
|
|
|
value: 16,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "STOP",
|
|
|
|
value: 17,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "TSTP",
|
|
|
|
value: 18,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "CONT",
|
|
|
|
value: 19,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "CHLD",
|
|
|
|
value: 20,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "TTIN",
|
|
|
|
value: 21,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "TTOU",
|
|
|
|
value: 22,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "IO",
|
|
|
|
value: 23,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "XCPU",
|
|
|
|
value: 24,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "XFSZ",
|
|
|
|
value: 25,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "VTALRM",
|
|
|
|
value: 26,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "PROF",
|
|
|
|
value: 27,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "WINCH",
|
|
|
|
value: 28,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "INFO",
|
|
|
|
value: 29,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "USR1",
|
|
|
|
value: 30,
|
|
|
|
},
|
|
|
|
Signal {
|
|
|
|
name: "USR2",
|
|
|
|
value: 31,
|
|
|
|
},
|
2015-11-24 01:00:51 +00:00
|
|
|
];
|
|
|
|
|
|
|
|
pub fn signal_by_name_or_value(signal_name_or_value: &str) -> Option<usize> {
|
2019-04-30 01:53:14 +00:00
|
|
|
if let Ok(value) = signal_name_or_value.parse() {
|
|
|
|
if is_signal(value) {
|
|
|
|
return Some(value);
|
|
|
|
} else {
|
|
|
|
return None;
|
2015-11-24 01:00:51 +00:00
|
|
|
}
|
|
|
|
}
|
2019-04-30 01:53:14 +00:00
|
|
|
let signal_name = if signal_name_or_value.starts_with("SIG") {
|
|
|
|
&signal_name_or_value[3..]
|
|
|
|
} else {
|
|
|
|
&signal_name_or_value[..]
|
|
|
|
};
|
|
|
|
|
|
|
|
ALL_SIGNALS
|
|
|
|
.iter()
|
|
|
|
.find(|s| s.name == signal_name)
|
|
|
|
.map(|s| s.value)
|
2015-11-24 01:00:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#[inline(always)]
|
|
|
|
pub fn is_signal(num: usize) -> bool {
|
2019-04-30 01:35:07 +00:00
|
|
|
// Named signals start at 1
|
|
|
|
num <= ALL_SIGNALS.len()
|
2015-11-24 01:00:51 +00:00
|
|
|
}
|
2019-04-30 01:32:28 +00:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn signals_all_contiguous() {
|
|
|
|
for (i, signal) in ALL_SIGNALS.iter().enumerate() {
|
|
|
|
assert_eq!(signal.value, i + 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn signals_all_are_signal() {
|
|
|
|
for signal in &ALL_SIGNALS {
|
|
|
|
assert!(is_signal(signal.value));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn signal_by_value() {
|
|
|
|
assert_eq!(signal_by_name_or_value("0"), Some(0));
|
|
|
|
for signal in &ALL_SIGNALS {
|
2019-04-30 01:53:14 +00:00
|
|
|
assert_eq!(
|
|
|
|
signal_by_name_or_value(&signal.value.to_string()),
|
|
|
|
Some(signal.value)
|
|
|
|
);
|
2019-04-30 01:32:28 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn signal_by_short_name() {
|
|
|
|
for signal in &ALL_SIGNALS {
|
|
|
|
assert_eq!(signal_by_name_or_value(signal.name), Some(signal.value));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn signal_by_long_name() {
|
|
|
|
for signal in &ALL_SIGNALS {
|
2019-04-30 01:53:14 +00:00
|
|
|
assert_eq!(
|
|
|
|
signal_by_name_or_value(&format!("SIG{}", signal.name)),
|
|
|
|
Some(signal.value)
|
|
|
|
);
|
2019-04-30 01:32:28 +00:00
|
|
|
}
|
|
|
|
}
|