Fix broken build on ESP-IDF caused by #115108

This commit is contained in:
ivmarkov 2023-10-14 09:35:31 +00:00
parent 481d45abec
commit b3c95c522c
3 changed files with 24 additions and 4 deletions

View File

@ -6,6 +6,9 @@
#[cfg_attr(any(target_os = "espidf", target_os = "horizon"), allow(unused))]
mod process_common;
#[cfg(any(target_os = "espidf", target_os = "horizon", target_os = "vita"))]
mod process_unsupported;
cfg_if::cfg_if! {
if #[cfg(target_os = "fuchsia")] {
#[path = "process_fuchsia.rs"]
@ -15,8 +18,9 @@
#[path = "process_vxworks.rs"]
mod process_inner;
} else if #[cfg(any(target_os = "espidf", target_os = "horizon", target_os = "vita"))] {
#[path = "process_unsupported.rs"]
mod process_inner;
mod process_inner {
pub use super::process_unsupported::*;
}
} else {
#[path = "process_unix.rs"]
mod process_inner;

View File

@ -63,12 +63,12 @@ pub fn try_wait(&mut self) -> io::Result<Option<ExitStatus>> {
impl Into<ExitStatus> for ExitStatusError {
fn into(self) -> ExitStatus {
ExitStatus(self.0.into())
ExitStatus::from(c_int::from(self.0))
}
}
impl ExitStatusError {
pub fn code(self) -> Option<NonZeroI32> {
ExitStatus(self.0.into()).code().map(|st| st.try_into().unwrap())
ExitStatus::from(c_int::from(self.0)).code().map(|st| st.try_into().unwrap())
}
}

View File

@ -1,10 +1,13 @@
//! Emulated wait status for non-Unix #[cfg(unix) platforms
//!
//! Separate module to facilitate testing against a real Unix implementation.
use core::ffi::NonZero_c_int;
use crate::ffi::c_int;
use crate::fmt;
use super::ExitStatusError;
/// Emulated wait status for use by `process_unsupported.rs`
///
/// Uses the "traditional unix" encoding. For use on platfors which are `#[cfg(unix)]`
@ -40,6 +43,19 @@ pub fn code(&self) -> Option<i32> {
if (w & 0x7f) == 0 { Some((w & 0xff00) >> 8) } else { None }
}
#[allow(unused)]
pub fn exit_ok(&self) -> Result<(), ExitStatusError> {
// This assumes that WIFEXITED(status) && WEXITSTATUS==0 corresponds to status==0. This is
// true on all actual versions of Unix, is widely assumed, and is specified in SuS
// https://pubs.opengroup.org/onlinepubs/9699919799/functions/wait.html. If it is not
// true for a platform pretending to be Unix, the tests (our doctests, and also
// process_unix/tests.rs) will spot it. `ExitStatusError::code` assumes this too.
match NonZero_c_int::try_from(self.wait_status) {
/* was nonzero */ Ok(failure) => Err(ExitStatusError(failure)),
/* was zero, couldn't convert */ Err(_) => Ok(()),
}
}
pub fn signal(&self) -> Option<i32> {
let signal = self.wait_status & 0x007f;
if signal > 0 && signal < 0x7f { Some(signal) } else { None }