1 use crate::convert::{TryFrom, TryInto};
4 use crate::io::ErrorKind;
5 use crate::num::NonZeroI32;
6 use crate::os::raw::NonZero_c_int;
9 use crate::sys::pipe::AnonPipe;
10 use crate::sys::process::process_common::*;
11 use crate::sys::unix::unsupported::*;
13 use libc::{c_int, pid_t};
15 ////////////////////////////////////////////////////////////////////////////////
17 ////////////////////////////////////////////////////////////////////////////////
24 ) -> io::Result<(Process, StdioPipes)> {
28 pub fn exec(&mut self, default: Stdio) -> io::Error {
33 ////////////////////////////////////////////////////////////////////////////////
35 ////////////////////////////////////////////////////////////////////////////////
42 pub fn id(&self) -> u32 {
46 pub fn kill(&mut self) -> io::Result<()> {
50 pub fn wait(&mut self) -> io::Result<ExitStatus> {
54 pub fn try_wait(&mut self) -> io::Result<Option<ExitStatus>> {
59 #[derive(PartialEq, Eq, Clone, Copy, Debug)]
60 pub struct ExitStatus(c_int);
63 pub fn success(&self) -> bool {
64 self.code() == Some(0)
67 pub fn exit_ok(&self) -> Result<(), ExitStatusError> {
68 Err(ExitStatusError(1.try_into().unwrap()))
71 pub fn code(&self) -> Option<i32> {
75 pub fn signal(&self) -> Option<i32> {
79 pub fn core_dumped(&self) -> bool {
83 pub fn stopped_signal(&self) -> Option<i32> {
87 pub fn continued(&self) -> bool {
91 pub fn into_raw(&self) -> c_int {
96 /// Converts a raw `c_int` to a type-safe `ExitStatus` by wrapping it without copying.
97 impl From<c_int> for ExitStatus {
98 fn from(a: c_int) -> ExitStatus {
103 impl fmt::Display for ExitStatus {
104 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
105 write!(f, "exit code: {}", self.0)
109 #[derive(PartialEq, Eq, Clone, Copy, Debug)]
110 pub struct ExitStatusError(NonZero_c_int);
112 impl Into<ExitStatus> for ExitStatusError {
113 fn into(self) -> ExitStatus {
114 ExitStatus(self.0.into())
118 impl ExitStatusError {
119 pub fn code(self) -> Option<NonZeroI32> {
120 ExitStatus(self.0.into()).code().map(|st| st.try_into().unwrap())