From efe81bc39d2debabf80c1779ebd6c86cd51407b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Sala=C3=BCn?= Date: Wed, 19 Nov 2014 21:08:42 +0100 Subject: [PATCH 1/2] libstd: Export AsFileDesc, FileDesc and fd_t --- src/libstd/io/fs.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/libstd/io/fs.rs b/src/libstd/io/fs.rs index cd4141e045cb5..48c857f4abb5e 100644 --- a/src/libstd/io/fs.rs +++ b/src/libstd/io/fs.rs @@ -71,6 +71,9 @@ use vec::Vec; use sys::fs as fs_imp; use sys_common; +pub use sys_common::AsFileDesc; +pub use sys::fs::{fd_t, FileDesc}; + /// Unconstrained file access type that exposes read and write operations /// /// Can be constructed via `File::open()`, `File::create()`, and From 5e197ab969dc6fac3158792a5813fd11929d50ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Sala=C3=BCn?= Date: Wed, 19 Nov 2014 21:13:17 +0100 Subject: [PATCH 2/2] libstd: Add AsFileDesc trait to UnixStream for unix Replace Inner::fd from fd_t to FileDesc. --- src/libstd/io/net/pipe.rs | 10 ++++++++++ src/libstd/sys/unix/pipe.rs | 26 ++++++++++++++------------ 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/libstd/io/net/pipe.rs b/src/libstd/io/net/pipe.rs index 8e934d221d22c..3218e7c5076d2 100644 --- a/src/libstd/io/net/pipe.rs +++ b/src/libstd/io/net/pipe.rs @@ -29,6 +29,9 @@ use prelude::*; use io::{Listener, Acceptor, IoResult, TimedOut, standard_error}; use time::Duration; +#[cfg(unix)] +use io::fs::{AsFileDesc, FileDesc}; + use sys::pipe::UnixStream as UnixStreamImp; use sys::pipe::UnixListener as UnixListenerImp; use sys::pipe::UnixAcceptor as UnixAcceptorImp; @@ -127,6 +130,13 @@ impl UnixStream { } } +#[cfg(unix)] +impl AsFileDesc for UnixStream { + fn as_fd(&self) -> &FileDesc { + self.inner.as_fd() + } +} + impl Clone for UnixStream { fn clone(&self) -> UnixStream { UnixStream { inner: self.inner.clone() } diff --git a/src/libstd/sys/unix/pipe.rs b/src/libstd/sys/unix/pipe.rs index 3fba06e0c7f1c..02222fcc7e83b 100644 --- a/src/libstd/sys/unix/pipe.rs +++ b/src/libstd/sys/unix/pipe.rs @@ -20,7 +20,7 @@ use prelude::*; use sys::{mod, timer, retry, c, set_nonblocking, wouldblock}; use sys::fs::{fd_t, FileDesc}; use sys_common::net::*; -use sys_common::{eof, mkerr_libc}; +use sys_common::{AsFileDesc, eof, mkerr_libc}; fn unix_socket(ty: libc::c_int) -> IoResult { match unsafe { libc::socket(libc::AF_UNIX, ty, 0) } { @@ -56,7 +56,7 @@ fn addr_to_sockaddr_un(addr: &CString, } struct Inner { - fd: fd_t, + fd: FileDesc, // Unused on Linux, where this lock is not necessary. #[allow(dead_code)] @@ -65,14 +65,10 @@ struct Inner { impl Inner { fn new(fd: fd_t) -> Inner { - Inner { fd: fd, lock: unsafe { mutex::NativeMutex::new() } } + Inner { fd: FileDesc::new(fd, true), lock: unsafe { mutex::NativeMutex::new() } } } } -impl Drop for Inner { - fn drop(&mut self) { unsafe { let _ = libc::close(self.fd); } } -} - fn connect(addr: &CString, ty: libc::c_int, timeout: Option) -> IoResult { let mut storage = unsafe { mem::zeroed() }; @@ -82,13 +78,13 @@ fn connect(addr: &CString, ty: libc::c_int, match timeout { None => { - match retry(|| unsafe { libc::connect(inner.fd, addrp, len) }) { + match retry(|| unsafe { libc::connect(inner.fd.fd(), addrp, len) }) { -1 => Err(super::last_error()), _ => Ok(inner) } } Some(timeout_ms) => { - try!(connect_timeout(inner.fd, addrp, len, timeout_ms)); + try!(connect_timeout(inner.fd.fd(), addrp, len, timeout_ms)); Ok(inner) } } @@ -100,7 +96,7 @@ fn bind(addr: &CString, ty: libc::c_int) -> IoResult { let inner = Inner::new(try!(unix_socket(ty))); let addrp = &storage as *const _ as *const libc::sockaddr; match unsafe { - libc::bind(inner.fd, addrp, len) + libc::bind(inner.fd.fd(), addrp, len) } { -1 => Err(super::last_error()), _ => Ok(inner) @@ -133,7 +129,7 @@ impl UnixStream { } } - fn fd(&self) -> fd_t { self.inner.fd } + fn fd(&self) -> fd_t { self.inner.fd.fd() } #[cfg(target_os = "linux")] fn lock_nonblocking(&self) {} @@ -200,6 +196,12 @@ impl UnixStream { } } +impl AsFileDesc for UnixStream { + fn as_fd(&self) -> &FileDesc { + &self.inner.fd + } +} + impl Clone for UnixStream { fn clone(&self) -> UnixStream { UnixStream::new(self.inner.clone()) @@ -222,7 +224,7 @@ impl UnixListener { }) } - fn fd(&self) -> fd_t { self.inner.fd } + fn fd(&self) -> fd_t { self.inner.fd.fd() } pub fn listen(self) -> IoResult { match unsafe { libc::listen(self.fd(), 128) } {