about summary refs log tree commit diff
path: root/src/libstd/sys/windows
diff options
context:
space:
mode:
authorSteven Fackler <sfackler@gmail.com>2015-05-26 23:47:03 -0700
committerSteven Fackler <sfackler@gmail.com>2015-05-28 20:03:20 -0700
commit69a0e1af9553ad50ee2d9c9176470ddeef70717c (patch)
tree96d0888e821b7787c5387b1c1c55a162c07f9be7 /src/libstd/sys/windows
parent1a3cffbddfa21aac6fabd2f07f86703fbf1f26a5 (diff)
downloadrust-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.rs1
-rw-r--r--src/libstd/sys/windows/net.rs29
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 {