diff options
Diffstat (limited to 'src/libstd/sys/unix')
| -rw-r--r-- | src/libstd/sys/unix/ext/process.rs | 28 | ||||
| -rw-r--r-- | src/libstd/sys/unix/fs.rs | 2 | ||||
| -rw-r--r-- | src/libstd/sys/unix/pipe.rs | 2 | ||||
| -rw-r--r-- | src/libstd/sys/unix/process.rs | 33 |
4 files changed, 17 insertions, 48 deletions
diff --git a/src/libstd/sys/unix/ext/process.rs b/src/libstd/sys/unix/ext/process.rs index 2d30b016a2d..cfe7a1f2dda 100644 --- a/src/libstd/sys/unix/ext/process.rs +++ b/src/libstd/sys/unix/ext/process.rs @@ -65,46 +65,28 @@ impl ExitStatusExt for process::ExitStatus { } } -#[stable(feature = "from_raw_os", since = "1.1.0")] +#[stable(feature = "process_extensions", since = "1.2.0")] impl FromRawFd for process::Stdio { - /// Creates a new instance of `Stdio` from the raw underlying file - /// descriptor. - /// - /// When this `Stdio` is used as an I/O handle for a child process the given - /// file descriptor will be `dup`d into the destination file descriptor in - /// the child process. - /// - /// Note that this function **does not** take ownership of the file - /// descriptor provided and it will **not** be closed when `Stdio` goes out - /// of scope. As a result this method is unsafe because due to the lack of - /// knowledge about the lifetime of the provided file descriptor, this could - /// cause another I/O primitive's ownership property of its file descriptor - /// to be violated. - /// - /// Also note that this file descriptor may be used multiple times to spawn - /// processes. For example the `Command::spawn` function could be called - /// more than once to spawn more than one process sharing this file - /// descriptor. unsafe fn from_raw_fd(fd: RawFd) -> process::Stdio { - process::Stdio::from_inner(sys::process::Stdio::Fd(fd)) + process::Stdio::from_inner(sys::fd::FileDesc::new(fd)) } } -#[stable(feature = "from_raw_os", since = "1.1.0")] +#[stable(feature = "process_extensions", since = "1.2.0")] impl AsRawFd for process::ChildStdin { fn as_raw_fd(&self) -> RawFd { self.as_inner().fd().raw() } } -#[stable(feature = "from_raw_os", since = "1.1.0")] +#[stable(feature = "process_extensions", since = "1.2.0")] impl AsRawFd for process::ChildStdout { fn as_raw_fd(&self) -> RawFd { self.as_inner().fd().raw() } } -#[stable(feature = "from_raw_os", since = "1.1.0")] +#[stable(feature = "process_extensions", since = "1.2.0")] impl AsRawFd for process::ChildStderr { fn as_raw_fd(&self) -> RawFd { self.as_inner().fd().raw() diff --git a/src/libstd/sys/unix/fs.rs b/src/libstd/sys/unix/fs.rs index 51a85a276ed..58e205a01ca 100644 --- a/src/libstd/sys/unix/fs.rs +++ b/src/libstd/sys/unix/fs.rs @@ -283,8 +283,6 @@ impl File { Ok(File(fd)) } - pub fn into_fd(self) -> FileDesc { self.0 } - pub fn file_attr(&self) -> io::Result<FileAttr> { let mut stat: raw::stat = unsafe { mem::zeroed() }; try!(cvt(unsafe { diff --git a/src/libstd/sys/unix/pipe.rs b/src/libstd/sys/unix/pipe.rs index 6283a29ae46..946857c05bc 100644 --- a/src/libstd/sys/unix/pipe.rs +++ b/src/libstd/sys/unix/pipe.rs @@ -44,6 +44,6 @@ impl AnonPipe { self.0.write(buf) } + pub fn raw(&self) -> libc::c_int { self.0.raw() } pub fn fd(&self) -> &FileDesc { &self.0 } - pub fn into_fd(self) -> FileDesc { self.0 } } diff --git a/src/libstd/sys/unix/process.rs b/src/libstd/sys/unix/process.rs index 76af42d9348..9178ca7aba4 100644 --- a/src/libstd/sys/unix/process.rs +++ b/src/libstd/sys/unix/process.rs @@ -18,9 +18,10 @@ use fmt; use io::{self, Error, ErrorKind}; use libc::{self, pid_t, c_void, c_int, gid_t, uid_t}; use ptr; +use sys::fd::FileDesc; +use sys::fs::{File, OpenOptions}; use sys::pipe::AnonPipe; use sys::{self, c, cvt, cvt_r}; -use sys::fs::{File, OpenOptions}; //////////////////////////////////////////////////////////////////////////////// // Command @@ -121,11 +122,12 @@ pub struct Process { pub enum Stdio { Inherit, - Piped(AnonPipe), None, - Fd(c_int), + Raw(c_int), } +pub type RawStdio = FileDesc; + const CLOEXEC_MSG_FOOTER: &'static [u8] = b"NOEX"; impl Process { @@ -252,10 +254,9 @@ impl Process { } let setup = |src: Stdio, dst: c_int| { - let fd = match src { - Stdio::Inherit => return true, - Stdio::Fd(fd) => return cvt_r(|| libc::dup2(fd, dst)).is_ok(), - Stdio::Piped(pipe) => pipe.into_fd(), + match src { + Stdio::Inherit => true, + Stdio::Raw(fd) => cvt_r(|| libc::dup2(fd, dst)).is_ok(), // If a stdio file descriptor is set to be ignored, we open up // /dev/null into that file descriptor. Otherwise, the first @@ -269,13 +270,12 @@ impl Process { let devnull = CStr::from_ptr(b"/dev/null\0".as_ptr() as *const _); if let Ok(f) = File::open_c(devnull, &opts) { - f.into_fd() + cvt_r(|| libc::dup2(f.fd().raw(), dst)).is_ok() } else { - return false + false } } - }; - cvt_r(|| libc::dup2(fd.raw(), dst)).is_ok() + } }; if !setup(in_fd, libc::STDIN_FILENO) { fail(&mut output) } @@ -418,14 +418,3 @@ fn translate_status(status: c_int) -> ExitStatus { ExitStatus::Signal(imp::WTERMSIG(status)) } } - -impl Stdio { - pub fn clone_if_copy(&self) -> Stdio { - match *self { - Stdio::Inherit => Stdio::Inherit, - Stdio::None => Stdio::None, - Stdio::Fd(fd) => Stdio::Fd(fd), - Stdio::Piped(_) => unreachable!(), - } - } -} |
