| 1 | cfg_if::cfg_if! { |
| 2 | if #[cfg(target_family = "unix" )] { |
| 3 | mod unix; |
| 4 | use unix as imp; |
| 5 | } else if #[cfg(target_os = "windows" )] { |
| 6 | mod windows; |
| 7 | use windows as imp; |
| 8 | } else if #[cfg(target_os = "uefi" )] { |
| 9 | mod uefi; |
| 10 | use uefi as imp; |
| 11 | } else { |
| 12 | mod unsupported; |
| 13 | use unsupported as imp; |
| 14 | } |
| 15 | } |
| 16 | |
| 17 | // This module is shared by all platforms, but nearly all platforms except for |
| 18 | // the "normal" UNIX ones leave some of this code unused. |
| 19 | #[cfg_attr (not(target_os = "linux" ), allow(dead_code))] |
| 20 | mod env; |
| 21 | |
| 22 | pub use env::CommandEnvs; |
| 23 | pub use imp::{ |
| 24 | Command, CommandArgs, EnvKey, ExitCode, ExitStatus, ExitStatusError, Process, Stdio, StdioPipes, |
| 25 | }; |
| 26 | |
| 27 | #[cfg (any( |
| 28 | all( |
| 29 | target_family = "unix" , |
| 30 | not(any( |
| 31 | target_os = "espidf" , |
| 32 | target_os = "horizon" , |
| 33 | target_os = "vita" , |
| 34 | target_os = "nuttx" |
| 35 | )) |
| 36 | ), |
| 37 | target_os = "windows" , |
| 38 | ))] |
| 39 | pub fn output(cmd: &mut Command) -> crate::io::Result<(ExitStatus, Vec<u8>, Vec<u8>)> { |
| 40 | use crate::sys::pipe::read2; |
| 41 | |
| 42 | let (mut process, mut pipes) = cmd.spawn(Stdio::MakePipe, false)?; |
| 43 | |
| 44 | drop(pipes.stdin.take()); |
| 45 | let (mut stdout, mut stderr) = (Vec::new(), Vec::new()); |
| 46 | match (pipes.stdout.take(), pipes.stderr.take()) { |
| 47 | (None, None) => {} |
| 48 | (Some(out), None) => { |
| 49 | let res = out.read_to_end(&mut stdout); |
| 50 | res.unwrap(); |
| 51 | } |
| 52 | (None, Some(err)) => { |
| 53 | let res = err.read_to_end(&mut stderr); |
| 54 | res.unwrap(); |
| 55 | } |
| 56 | (Some(out), Some(err)) => { |
| 57 | let res = read2(out, &mut stdout, err, &mut stderr); |
| 58 | res.unwrap(); |
| 59 | } |
| 60 | } |
| 61 | |
| 62 | let status = process.wait()?; |
| 63 | Ok((status, stdout, stderr)) |
| 64 | } |
| 65 | |
| 66 | #[cfg (not(any( |
| 67 | all( |
| 68 | target_family = "unix" , |
| 69 | not(any( |
| 70 | target_os = "espidf" , |
| 71 | target_os = "horizon" , |
| 72 | target_os = "vita" , |
| 73 | target_os = "nuttx" |
| 74 | )) |
| 75 | ), |
| 76 | target_os = "windows" , |
| 77 | )))] |
| 78 | pub use imp::output; |
| 79 | |