Auto merge of #85490 - CDirkx:fix-vxworks, r=dtolnay

Fix `vxworks`

Some PRs made the `vxworks` target not build anymore. This PR fixes that:

- #82973: copy `ExitStatusError` implementation from `unix`.
- #84716: no `libc::chroot` available on `vxworks`, so for now don't implement `os::unix::fs::chroot`.
This commit is contained in:
bors 2021-05-23 05:40:18 +00:00
commit 6e92fb4098
4 changed files with 31 additions and 5 deletions

View File

@ -906,7 +906,7 @@ impl DirBuilderExt for fs::DirBuilder {
/// } /// }
/// ``` /// ```
#[unstable(feature = "unix_chroot", issue = "84715")] #[unstable(feature = "unix_chroot", issue = "84715")]
#[cfg(not(target_os = "fuchsia"))] #[cfg(not(any(target_os = "fuchsia", target_os = "vxworks")))]
pub fn chroot<P: AsRef<Path>>(dir: P) -> io::Result<()> { pub fn chroot<P: AsRef<Path>>(dir: P) -> io::Result<()> {
sys::fs::chroot(dir.as_ref()) sys::fs::chroot(dir.as_ref())
} }

View File

@ -1329,7 +1329,7 @@ pub fn copy(from: &Path, to: &Path) -> io::Result<u64> {
Ok(bytes_copied as u64) Ok(bytes_copied as u64)
} }
#[cfg(not(target_os = "fuchsia"))] #[cfg(not(any(target_os = "fuchsia", target_os = "vxworks")))]
pub fn chroot(dir: &Path) -> io::Result<()> { pub fn chroot(dir: &Path) -> io::Result<()> {
let dir = cstr(dir)?; let dir = cstr(dir)?;
cvt(unsafe { libc::chroot(dir.as_ptr()) })?; cvt(unsafe { libc::chroot(dir.as_ptr()) })?;

View File

@ -495,7 +495,7 @@ impl ExitStatus {
pub fn exit_ok(&self) -> Result<(), ExitStatusError> { pub fn exit_ok(&self) -> Result<(), ExitStatusError> {
// This assumes that WIFEXITED(status) && WEXITSTATUS==0 corresponds to status==0. This is // This assumes that WIFEXITED(status) && WEXITSTATUS==0 corresponds to status==0. This is
// true on all actual versios of Unix, is widely assumed, and is specified in SuS // 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 // 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 // true for a platform pretending to be Unix, the tests (our doctests, and also
// procsss_unix/tests.rs) will spot it. `ExitStatusError::code` assumes this too. // procsss_unix/tests.rs) will spot it. `ExitStatusError::code` assumes this too.

View File

@ -1,5 +1,8 @@
use crate::convert::{TryFrom, TryInto};
use crate::fmt; use crate::fmt;
use crate::io::{self, Error, ErrorKind}; use crate::io::{self, Error, ErrorKind};
use crate::num::NonZeroI32;
use crate::os::raw::NonZero_c_int;
use crate::sys; use crate::sys;
use crate::sys::cvt; use crate::sys::cvt;
use crate::sys::process::process_common::*; use crate::sys::process::process_common::*;
@ -187,8 +190,16 @@ impl ExitStatus {
libc::WIFEXITED(self.0) libc::WIFEXITED(self.0)
} }
pub fn success(&self) -> bool { pub fn exit_ok(&self) -> Result<(), ExitStatusError> {
self.code() == Some(0) // 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
// procsss_unix/tests.rs) will spot it. `ExitStatusError::code` assumes this too.
match NonZero_c_int::try_from(self.0) {
Ok(failure) => Err(ExitStatusError(failure)),
Err(_) => Ok(()),
}
} }
pub fn code(&self) -> Option<i32> { pub fn code(&self) -> Option<i32> {
@ -235,3 +246,18 @@ impl fmt::Display for ExitStatus {
} }
} }
} }
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
pub struct ExitStatusError(NonZero_c_int);
impl Into<ExitStatus> for ExitStatusError {
fn into(self) -> ExitStatus {
ExitStatus(self.0.into())
}
}
impl ExitStatusError {
pub fn code(self) -> Option<NonZeroI32> {
ExitStatus(self.0.into()).code().map(|st| st.try_into().unwrap())
}
}