Skip to content

Commit

Permalink
Merge pull request #9 from Jokler/windows-support
Browse files Browse the repository at this point in the history
Add Windows support
  • Loading branch information
dtolnay committed Jun 28, 2018
2 parents 3cfdc2e + 4e8ff03 commit 197316f
Showing 1 changed file with 22 additions and 8 deletions.
30 changes: 22 additions & 8 deletions src/main.rs
Expand Up @@ -166,30 +166,44 @@ impl Drop for Wait {
}
}

#[cfg(target_os = "linux")]
unsafe fn create_stdios(child: &Child) -> (Stdio, Stdio) {
use std::os::unix::io::{AsRawFd, FromRawFd};
let stdout = Stdio::from_raw_fd(child.stdout.as_ref().map(AsRawFd::as_raw_fd).unwrap());
let stderr = Stdio::from_raw_fd(child.stderr.as_ref().map(AsRawFd::as_raw_fd).unwrap());

(stdout, stderr)
}

#[cfg(target_os = "windows")]
unsafe fn create_stdios(child: &Child) -> (Stdio, Stdio) {
use std::os::windows::io::{AsRawHandle, FromRawHandle};
let stdout = Stdio::from_raw_handle(child.stdout.as_ref().map(AsRawHandle::as_raw_handle).unwrap());
let stderr = Stdio::from_raw_handle(child.stderr.as_ref().map(AsRawHandle::as_raw_handle).unwrap());

(stdout, stderr)
}

trait PipeTo {
fn pipe_to(&mut self, out: &[&OsStr], err: &[&OsStr]) -> io::Result<Wait>;
}

impl PipeTo for Command {
fn pipe_to(&mut self, out: &[&OsStr], err: &[&OsStr]) -> io::Result<Wait> {
use std::os::unix::io::{AsRawFd, FromRawFd};

self.stdout(Stdio::piped());
self.stderr(Stdio::piped());

let child = self.spawn()?;

let (stdout, stderr) = unsafe { create_stdios(&child) };

*self = Command::new(out[0]);
self.args(&out[1..]);
self.stdin(unsafe {
Stdio::from_raw_fd(child.stdout.as_ref().map(AsRawFd::as_raw_fd).unwrap())
});
self.stdin(stdout);

let mut errcmd = Command::new(err[0]);
errcmd.args(&err[1..]);
errcmd.stdin(unsafe {
Stdio::from_raw_fd(child.stderr.as_ref().map(AsRawFd::as_raw_fd).unwrap())
});
errcmd.stdin(stderr);
errcmd.stdout(Stdio::null());
errcmd.stderr(Stdio::inherit());
let spawn = errcmd.spawn()?;
Expand Down

0 comments on commit 197316f

Please sign in to comment.