diff --git a/src/main.rs b/src/main.rs index bf3a7aeffb85656e8d0f25d45e14c888c2e731fa..de9b76fb4c2430ce0a3e0a67e8272607ba297337 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,6 @@ use nix::sys::signal; use nix::sys::termios::{tcgetattr, tcsetattr, SetArg::TCSADRAIN}; -use nix::sys::wait::WaitStatus; +use nix::sys::wait::{waitpid, WaitStatus}; use nix::unistd::{self, fork, ForkResult}; use serde::{Deserialize, Serialize}; @@ -412,24 +412,14 @@ fn main_run(args: args::Run) -> ! { let msg = from_child.recv().ok(); - let mut rc: i32 = 0; - unsafe { - libc::waitpid( - child.into(), // pid_t - &mut rc as *mut libc::c_int, // int* - 0, // int options - ) - }; + let status = waitpid(child, None); // Restore termios configuration as planned if let Some(tcattr) = tcattr.as_ref() { tcsetattr(0, TCSADRAIN, tcattr).unwrap(); } - println!( - "[supervisor:{parent}] subprocess finished: {:?}", - WaitStatus::from_raw(child, rc) - ); + println!("[supervisor:{parent}] subprocess finished: {status:?}"); if let Some(msg) = msg { entrypoint = msg.next_entrypoint; @@ -438,7 +428,12 @@ fn main_run(args: args::Run) -> ! { rm_tarantool_files(&args.data_dir); } } else { - std::process::exit(libc::WEXITSTATUS(rc)); + let rc = match status.unwrap() { + WaitStatus::Exited(_, rc) => rc, + WaitStatus::Signaled(_, sig, _) => sig as _, + _ => unreachable!("unexpected exit status"), + }; + std::process::exit(rc); } } };