about summary refs log tree commit diff
path: root/src/libstd/sys/windows
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2015-05-30 04:20:20 +0000
committerbors <bors@rust-lang.org>2015-05-30 04:20:20 +0000
commit474c6e0ae47578b3e608c893e18bc83798b565aa (patch)
treeb451ed04c4312a8dc36938b90b8ea34ad14a8626 /src/libstd/sys/windows
parenta0f028da07d313ad554623d5700dcbd16f3a4bde (diff)
parentb5c6c7ed408c1c7afb8d4f0430f67255a140d183 (diff)
downloadrust-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/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 {