Skip to content

Commit

Permalink
Fix broken build on ESP-IDF caused by rust-lang#115108
Browse files Browse the repository at this point in the history
  • Loading branch information
ivmarkov committed Oct 14, 2023
1 parent 481d45a commit a756cd6
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 4 deletions.
8 changes: 6 additions & 2 deletions library/std/src/sys/unix/process/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ pub use crate::sys_common::process::CommandEnvs;
#[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"]
Expand All @@ -15,8 +18,9 @@ cfg_if::cfg_if! {
#[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;
Expand Down
4 changes: 2 additions & 2 deletions library/std/src/sys/unix/process/process_unsupported.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,12 +63,12 @@ pub struct ExitStatusError(NonZero_c_int);

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())
}
}
Original file line number Diff line number Diff line change
@@ -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)]`
Expand Down Expand Up @@ -40,6 +43,18 @@ impl ExitStatus {
if (w & 0x7f) == 0 { Some((w & 0xff00) >> 8) } else { None }
}

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 }
Expand Down

0 comments on commit a756cd6

Please sign in to comment.