From a762ce5426cbfc107fc67218e4dee7a6a87c95a4 Mon Sep 17 00:00:00 2001 From: Dean Li Date: Sat, 6 Nov 2021 19:39:36 +0800 Subject: [PATCH] os: implement waitstatus_to_exitcode --- vm/src/stdlib/os.rs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/vm/src/stdlib/os.rs b/vm/src/stdlib/os.rs index 63bddbcf0..6e591d3dc 100644 --- a/vm/src/stdlib/os.rs +++ b/vm/src/stdlib/os.rs @@ -1668,6 +1668,31 @@ pub(super) mod _os { Ok((loadavg[0], loadavg[1], loadavg[2])) } + #[cfg(any(unix, windows))] + #[pyfunction] + fn waitstatus_to_exitcode(status: i32, vm: &VirtualMachine) -> PyResult { + let status = u32::try_from(status) + .map_err(|_| vm.new_value_error(format!("invalid WEXITSTATUS: {}", status)))?; + + cfg_if::cfg_if! { + if #[cfg(not(windows))] { + let status = status as libc::c_int; + if libc::WIFEXITED(status) { + return Ok(libc::WEXITSTATUS(status)); + } + + if libc::WIFSIGNALED(status) { + return Ok(-libc::WTERMSIG(status)); + } + + Err(vm.new_value_error(format!("Invalid wait status: {}", status))) + } else { + i32::try_from(status.rotate_right(8)) + .map_err(|_| vm.new_value_error(format!("invalid wait status: {}", status))) + } + } + } + #[pyattr] #[pyclass(module = "os", name = "terminal_size")] #[derive(PyStructSequence)]