summaryrefslogtreecommitdiff
path: root/init/src/signals
diff options
context:
space:
mode:
Diffstat (limited to 'init/src/signals')
-rw-r--r--init/src/signals/mod.rs1
-rw-r--r--init/src/signals/sigchld.rs24
2 files changed, 23 insertions, 2 deletions
diff --git a/init/src/signals/mod.rs b/init/src/signals/mod.rs
new file mode 100644
index 0000000..0e86476
--- /dev/null
+++ b/init/src/signals/mod.rs
@@ -0,0 +1 @@
+pub mod sigchld;
diff --git a/init/src/signals/sigchld.rs b/init/src/signals/sigchld.rs
index 78b72d4..185e56e 100644
--- a/init/src/signals/sigchld.rs
+++ b/init/src/signals/sigchld.rs
@@ -1,10 +1,17 @@
-use libc::{signal, sighandler_t, SIGCHILD, SIG_DFL, SIG_IGN};
+use libc::{pid_t,
+ SIGCHLD,
+ waitpid,
+ WNOHANG,
+ sigaction,
+ sigemptyset,
+ SA_RESTART};
+
use std::ffi::c_int;
fn sigchild_handler(_signal: c_int) {
loop {
let mut status: c_int = 0;
- ket pid: pid_t = unsafe {
+ let pid: pid_t = unsafe {
waitpid(-1 , &mut status, WNOHANG)
};
@@ -15,4 +22,17 @@ fn sigchild_handler(_signal: c_int) {
}
+pub fn sigchild_handler() -> Result<(), Box<dyn std::error::Error>> {
+ unsafe {
+ let mut sigact: sigaction = std::mem::zeroed();
+ sigact.sa_sigaction = sigchild_handler as usize;
+ sigemptyset(&mut sigact.sa_mask);
+ sigact.sa_flags = SA_RESTART;
+ if sigaction(SIGCHLD, &sigact, std::ptr::null_mut()) == -1 {
+ Err("Sigaction check returned -1".into())
+ } else {
+ Ok(())
+ }
+ }
+}