diff options
| author | Steven Fackler <sfackler@gmail.com> | 2015-05-26 23:47:03 -0700 |
|---|---|---|
| committer | Steven Fackler <sfackler@gmail.com> | 2015-05-28 20:03:20 -0700 |
| commit | 69a0e1af9553ad50ee2d9c9176470ddeef70717c (patch) | |
| tree | 96d0888e821b7787c5387b1c1c55a162c07f9be7 /src/libstd/sys/windows | |
| parent | 1a3cffbddfa21aac6fabd2f07f86703fbf1f26a5 (diff) | |
| download | rust-69a0e1af9553ad50ee2d9c9176470ddeef70717c.tar.gz rust-69a0e1af9553ad50ee2d9c9176470ddeef70717c.zip | |
Implement RFC 1047 - socket timeouts
Closes #25619
Diffstat (limited to 'src/libstd/sys/windows')
| -rw-r--r-- | src/libstd/sys/windows/mod.rs | 1 | ||||
| -rw-r--r-- | src/libstd/sys/windows/net.rs | 29 |
2 files changed, 30 insertions, 0 deletions
diff --git a/src/libstd/sys/windows/mod.rs b/src/libstd/sys/windows/mod.rs index 6b7bff2c1c6..18c8add17a6 100644 --- a/src/libstd/sys/windows/mod.rs +++ b/src/libstd/sys/windows/mod.rs @@ -60,6 +60,7 @@ pub fn decode_error_kind(errno: i32) -> ErrorKind { libc::WSAEINVAL => ErrorKind::InvalidInput, libc::WSAENOTCONN => ErrorKind::NotConnected, libc::WSAEWOULDBLOCK => ErrorKind::WouldBlock, + libc::WSAETIMEDOUT => ErrorKind::TimedOut, _ => ErrorKind::Other, } diff --git a/src/libstd/sys/windows/net.rs b/src/libstd/sys/windows/net.rs index 71e064bcc6b..0b905267236 100644 --- a/src/libstd/sys/windows/net.rs +++ b/src/libstd/sys/windows/net.rs @@ -19,8 +19,11 @@ use num::One; use ops::Neg; use rt; use sync::Once; +use sys; use sys::c; use sys_common::{AsInner, FromInner}; +use sys_common::net::{setsockopt, getsockopt}; +use time::Duration; pub type wrlen_t = i32; @@ -127,6 +130,32 @@ impl Socket { } } } + + pub fn set_timeout(&self, dur: Option<Duration>, kind: libc::c_int) -> io::Result<()> { + let timeout = match dur { + Some(dur) => { + let timeout = sys::dur2timeout(dur); + if timeout == 0 { + return Err(io::Error::new(io::ErrorKind::InvalidInput, + "cannot set a 0 duration timeout")); + } + timeout + } + None => 0 + }; + setsockopt(self, libc::SOL_SOCKET, kind, timeout) + } + + pub fn timeout(&self, kind: libc::c_int) -> io::Result<Option<Duration>> { + let raw: libc::DWORD = try!(getsockopt(self, libc::SOL_SOCKET, kind)); + if raw == 0 { + Ok(None) + } else { + let secs = raw / 1000; + let nsec = (raw % 1000) * 1000000; + Ok(Some(Duration::new(secs as u64, nsec as u32))) + } + } } impl Drop for Socket { |
