diff options
| author | bors <bors@rust-lang.org> | 2015-05-30 04:20:20 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2015-05-30 04:20:20 +0000 |
| commit | 474c6e0ae47578b3e608c893e18bc83798b565aa (patch) | |
| tree | b451ed04c4312a8dc36938b90b8ea34ad14a8626 /src/libstd/sys/common | |
| parent | a0f028da07d313ad554623d5700dcbd16f3a4bde (diff) | |
| parent | b5c6c7ed408c1c7afb8d4f0430f67255a140d183 (diff) | |
| download | rust-474c6e0ae47578b3e608c893e18bc83798b565aa.tar.gz rust-474c6e0ae47578b3e608c893e18bc83798b565aa.zip | |
Auto merge of #25818 - sfackler:socket-timeouts, r=alexcrichton
Closes #25619 r? @alexcrichton
Diffstat (limited to 'src/libstd/sys/common')
| -rw-r--r-- | src/libstd/sys/common/net.rs | 46 |
1 files changed, 39 insertions, 7 deletions
diff --git a/src/libstd/sys/common/net.rs b/src/libstd/sys/common/net.rs index efbcda3fece..5890e6a7889 100644 --- a/src/libstd/sys/common/net.rs +++ b/src/libstd/sys/common/net.rs @@ -20,12 +20,13 @@ use str::from_utf8; use sys::c; use sys::net::{cvt, cvt_r, cvt_gai, Socket, init, wrlen_t}; use sys_common::{AsInner, FromInner, IntoInner}; +use time::Duration; //////////////////////////////////////////////////////////////////////////////// // sockaddr and misc bindings //////////////////////////////////////////////////////////////////////////////// -fn setsockopt<T>(sock: &Socket, opt: c_int, val: c_int, +pub fn setsockopt<T>(sock: &Socket, opt: c_int, val: c_int, payload: T) -> io::Result<()> { unsafe { let payload = &payload as *const T as *const c_void; @@ -35,16 +36,15 @@ fn setsockopt<T>(sock: &Socket, opt: c_int, val: c_int, } } -#[allow(dead_code)] -fn getsockopt<T: Copy>(sock: &Socket, opt: c_int, +pub fn getsockopt<T: Copy>(sock: &Socket, opt: c_int, val: c_int) -> io::Result<T> { unsafe { let mut slot: T = mem::zeroed(); let mut len = mem::size_of::<T>() as socklen_t; - let ret = try!(cvt(c::getsockopt(*sock.as_inner(), opt, val, - &mut slot as *mut _ as *mut _, - &mut len))); - assert_eq!(ret as usize, mem::size_of::<T>()); + try!(cvt(c::getsockopt(*sock.as_inner(), opt, val, + &mut slot as *mut _ as *mut _, + &mut len))); + assert_eq!(len as usize, mem::size_of::<T>()); Ok(slot) } } @@ -220,6 +220,22 @@ impl TcpStream { Ok(()) } + pub fn set_read_timeout(&self, dur: Option<Duration>) -> io::Result<()> { + self.inner.set_timeout(dur, libc::SO_RCVTIMEO) + } + + pub fn set_write_timeout(&self, dur: Option<Duration>) -> io::Result<()> { + self.inner.set_timeout(dur, libc::SO_SNDTIMEO) + } + + pub fn read_timeout(&self) -> io::Result<Option<Duration>> { + self.inner.timeout(libc::SO_RCVTIMEO) + } + + pub fn write_timeout(&self) -> io::Result<Option<Duration>> { + self.inner.timeout(libc::SO_SNDTIMEO) + } + pub fn read(&self, buf: &mut [u8]) -> io::Result<usize> { self.inner.read(buf) } @@ -471,6 +487,22 @@ impl UdpSocket { pub fn duplicate(&self) -> io::Result<UdpSocket> { self.inner.duplicate().map(|s| UdpSocket { inner: s }) } + + pub fn set_read_timeout(&self, dur: Option<Duration>) -> io::Result<()> { + self.inner.set_timeout(dur, libc::SO_RCVTIMEO) + } + + pub fn set_write_timeout(&self, dur: Option<Duration>) -> io::Result<()> { + self.inner.set_timeout(dur, libc::SO_SNDTIMEO) + } + + pub fn read_timeout(&self) -> io::Result<Option<Duration>> { + self.inner.timeout(libc::SO_RCVTIMEO) + } + + pub fn write_timeout(&self) -> io::Result<Option<Duration>> { + self.inner.timeout(libc::SO_SNDTIMEO) + } } impl FromInner<Socket> for UdpSocket { |
