Skip to content

Commit

Permalink
auto merge of #16421 : ipetkov/rust/cmd-fd-fix-retry, r=alexcrichton
Browse files Browse the repository at this point in the history
Retry pull requesting of #16407 after accidentally messing up rebasing of branches and making bors think the PR was merged
  • Loading branch information
bors committed Aug 13, 2014
2 parents 6291781 + 3fe0ba9 commit 9d55421
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 2 deletions.
2 changes: 1 addition & 1 deletion src/libnative/io/process.rs
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ impl Process {
rtio::Ignored => { ret.push(None); Ok(None) }
rtio::InheritFd(fd) => {
ret.push(None);
Ok(Some(file::FileDesc::new(fd, true)))
Ok(Some(file::FileDesc::new(fd, false)))
}
rtio::CreatePipe(readable, _writable) => {
let (reader, writer) = try!(pipe());
Expand Down
25 changes: 24 additions & 1 deletion src/libstd/io/process.rs
Original file line number Diff line number Diff line change
Expand Up @@ -378,7 +378,8 @@ pub enum StdioContainer {
Ignored,

/// The specified file descriptor is inherited for the stream which it is
/// specified for.
/// specified for. Ownership of the file descriptor is *not* taken, so the
/// caller must clean it up.
InheritFd(libc::c_int),

/// Creates a pipe for the specified file descriptor which will be created
Expand Down Expand Up @@ -605,6 +606,7 @@ impl Drop for Process {

#[cfg(test)]
mod tests {
extern crate native;
use io::process::{Command, Process};
use prelude::*;

Expand Down Expand Up @@ -1017,4 +1019,25 @@ mod tests {
assert!(Process::kill(id, 0).is_ok());
assert!(Process::kill(id, PleaseExitSignal).is_ok());
})

iotest!(fn dont_close_fd_on_command_spawn() {
use std::rt::rtio::{Truncate, Write};
use native::io::file;

let path = if cfg!(windows) {
Path::new("NUL")
} else {
Path::new("/dev/null")
};

let mut fdes = match file::open(&path.to_c_str(), Truncate, Write) {
Ok(f) => f,
Err(_) => fail!("failed to open file descriptor"),
};

let mut cmd = pwd_cmd();
let _ = cmd.stdout(InheritFd(fdes.fd()));
assert!(cmd.status().unwrap().success());
assert!(fdes.inner_write("extra write\n".as_bytes()).is_ok());
})
}

0 comments on commit 9d55421

Please sign in to comment.