From c0d989ed6b4b840a290a80ec0cdbc8edbce2ee57 Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Wed, 16 Mar 2016 20:50:45 -0700 Subject: Add unix socket support to the standard library --- src/libstd/sys/common/io.rs | 43 +++++++++++++++++++++++++++++++++++++++++-- src/libstd/sys/common/net.rs | 21 +++------------------ 2 files changed, 44 insertions(+), 20 deletions(-) (limited to 'src/libstd/sys/common') diff --git a/src/libstd/sys/common/io.rs b/src/libstd/sys/common/io.rs index 9f2f0df3a64..7b08852ba51 100644 --- a/src/libstd/sys/common/io.rs +++ b/src/libstd/sys/common/io.rs @@ -51,6 +51,46 @@ pub unsafe fn read_to_end_uninitialized(r: &mut Read, buf: &mut Vec) -> io:: } } +#[cfg(test)] +pub mod test { + use prelude::v1::*; + use path::{Path, PathBuf}; + use env; + use rand::{self, Rng}; + use fs; + + pub struct TempDir(PathBuf); + + impl TempDir { + pub fn join(&self, path: &str) -> PathBuf { + let TempDir(ref p) = *self; + p.join(path) + } + + pub fn path<'a>(&'a self) -> &'a Path { + let TempDir(ref p) = *self; + p + } + } + + impl Drop for TempDir { + fn drop(&mut self) { + // Gee, seeing how we're testing the fs module I sure hope that we + // at least implement this correctly! + let TempDir(ref p) = *self; + fs::remove_dir_all(p).unwrap(); + } + } + + pub fn tmpdir() -> TempDir { + let p = env::temp_dir(); + let mut r = rand::thread_rng(); + let ret = p.join(&format!("rust-{}", r.next_u32())); + fs::create_dir(&ret).unwrap(); + TempDir(ret) + } +} + #[cfg(test)] mod tests { use prelude::v1::*; @@ -58,7 +98,6 @@ mod tests { use super::*; use io; use io::{ErrorKind, Take, Repeat, repeat}; - use test; use slice::from_raw_parts; struct ErrorRepeat { @@ -129,7 +168,7 @@ mod tests { } #[bench] - fn bench_uninitialized(b: &mut test::Bencher) { + fn bench_uninitialized(b: &mut ::test::Bencher) { b.iter(|| { let mut lr = repeat(1).take(10000000); let mut vec = Vec::with_capacity(1024); diff --git a/src/libstd/sys/common/net.rs b/src/libstd/sys/common/net.rs index 42714feb921..3fa70d0ce4b 100644 --- a/src/libstd/sys/common/net.rs +++ b/src/libstd/sys/common/net.rs @@ -257,12 +257,7 @@ impl TcpStream { } pub fn take_error(&self) -> io::Result> { - let raw: c_int = try!(getsockopt(&self.inner, c::SOL_SOCKET, c::SO_ERROR)); - if raw == 0 { - Ok(None) - } else { - Ok(Some(io::Error::from_raw_os_error(raw as i32))) - } + self.inner.take_error() } pub fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()> { @@ -367,12 +362,7 @@ impl TcpListener { } pub fn take_error(&self) -> io::Result> { - let raw: c_int = try!(getsockopt(&self.inner, c::SOL_SOCKET, c::SO_ERROR)); - if raw == 0 { - Ok(None) - } else { - Ok(Some(io::Error::from_raw_os_error(raw as i32))) - } + self.inner.take_error() } pub fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()> { @@ -564,12 +554,7 @@ impl UdpSocket { } pub fn take_error(&self) -> io::Result> { - let raw: c_int = try!(getsockopt(&self.inner, c::SOL_SOCKET, c::SO_ERROR)); - if raw == 0 { - Ok(None) - } else { - Ok(Some(io::Error::from_raw_os_error(raw as i32))) - } + self.inner.take_error() } pub fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()> { -- cgit 1.4.1-3-g733a5