about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorLuqman Aden <me@luqman.ca>2013-07-25 19:42:19 -0400
committerLuqman Aden <me@luqman.ca>2013-07-25 19:42:19 -0400
commita5c6b85091e171c9ec85bad68774aece81af74fa (patch)
tree1d87e6872d135a662cc8364686efc04eccdc74a5 /src/libstd
parent005ea3b17375584f823c51d141248e3bcbc04115 (diff)
downloadrust-a5c6b85091e171c9ec85bad68774aece81af74fa.tar.gz
rust-a5c6b85091e171c9ec85bad68774aece81af74fa.zip
libstd: Implement some missing tcp methods.
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/rt/rtio.rs12
-rw-r--r--src/libstd/rt/uv/uvio.rs75
2 files changed, 72 insertions, 15 deletions
diff --git a/src/libstd/rt/rtio.rs b/src/libstd/rt/rtio.rs
index 73b38c4a40d..728ee4ba035 100644
--- a/src/libstd/rt/rtio.rs
+++ b/src/libstd/rt/rtio.rs
@@ -52,18 +52,18 @@ pub trait IoFactory {
 
 pub trait RtioTcpListener : RtioSocket {
     fn accept(&mut self) -> Result<~RtioTcpStreamObject, IoError>;
-    fn accept_simultaneously(&mut self);
-    fn dont_accept_simultaneously(&mut self);
+    fn accept_simultaneously(&mut self) -> Result<(), IoError>;
+    fn dont_accept_simultaneously(&mut self) -> Result<(), IoError>;
 }
 
 pub trait RtioTcpStream : RtioSocket {
     fn read(&mut self, buf: &mut [u8]) -> Result<uint, IoError>;
     fn write(&mut self, buf: &[u8]) -> Result<(), IoError>;
     fn peer_name(&mut self) -> Result<IpAddr, IoError>;
-    fn control_congestion(&mut self);
-    fn nodelay(&mut self);
-    fn keepalive(&mut self, delay_in_seconds: uint);
-    fn letdie(&mut self);
+    fn control_congestion(&mut self) -> Result<(), IoError>;
+    fn nodelay(&mut self) -> Result<(), IoError>;
+    fn keepalive(&mut self, delay_in_seconds: uint) -> Result<(), IoError>;
+    fn letdie(&mut self) -> Result<(), IoError>;
 }
 
 pub trait RtioSocket {
diff --git a/src/libstd/rt/uv/uvio.rs b/src/libstd/rt/uv/uvio.rs
index 42408507f5d..203248c4483 100644
--- a/src/libstd/rt/uv/uvio.rs
+++ b/src/libstd/rt/uv/uvio.rs
@@ -15,7 +15,7 @@ use cell::Cell;
 use cast;
 use cast::transmute;
 use clone::Clone;
-use libc::c_void;
+use libc::{c_int, c_uint, c_void};
 use rt::io::IoError;
 use rt::io::net::ip::IpAddr;
 use rt::uv::*;
@@ -404,9 +404,27 @@ impl RtioTcpListener for UvTcpListener {
         return self.incoming_streams.recv();
     }
 
-    // XXX implement
-    fn accept_simultaneously(&mut self) { fail!(); }
-    fn dont_accept_simultaneously(&mut self) { fail!(); }
+    fn accept_simultaneously(&mut self) -> Result<(), IoError> {
+        let r = unsafe {
+            uvll::rust_uv_tcp_simultaneous_accepts(self.watcher.native_handle(), 1 as c_int)
+        };
+
+        match status_to_maybe_uv_error(self.watcher, r) {
+            Some(err) => Err(uv_error_to_io_error(err)),
+            None => Ok(())
+        }
+    }
+
+    fn dont_accept_simultaneously(&mut self) -> Result<(), IoError> {
+        let r = unsafe {
+            uvll::rust_uv_tcp_simultaneous_accepts(self.watcher.native_handle(), 0 as c_int)
+        };
+
+        match status_to_maybe_uv_error(self.watcher, r) {
+            Some(err) => Err(uv_error_to_io_error(err)),
+            None => Ok(())
+        }
+    }
 }
 
 pub struct UvTcpStream(TcpWatcher);
@@ -507,11 +525,50 @@ impl RtioTcpStream for UvTcpStream {
         socket_name(TcpPeer, **self)
     }
 
-    // XXX implement
-    fn control_congestion(&mut self) { fail!(); }
-    fn nodelay(&mut self) { fail!(); }
-    fn keepalive(&mut self, _delay_in_seconds: uint) { fail!(); }
-    fn letdie(&mut self) { fail!(); }
+    fn control_congestion(&mut self) -> Result<(), IoError> {
+        let r = unsafe {
+            uvll::rust_uv_tcp_nodelay(self.native_handle(), 0 as c_int)
+        };
+
+        match status_to_maybe_uv_error(**self, r) {
+            Some(err) => Err(uv_error_to_io_error(err)),
+            None => Ok(())
+        }
+    }
+
+    fn nodelay(&mut self) -> Result<(), IoError> {
+        let r = unsafe {
+            uvll::rust_uv_tcp_nodelay(self.native_handle(), 1 as c_int)
+        };
+
+        match status_to_maybe_uv_error(**self, r) {
+            Some(err) => Err(uv_error_to_io_error(err)),
+            None => Ok(())
+        }
+    }
+
+    fn keepalive(&mut self, delay_in_seconds: uint) -> Result<(), IoError> {
+        let r = unsafe {
+            uvll::rust_uv_tcp_keepalive(self.native_handle(), 1 as c_int,
+                                        delay_in_seconds as c_uint)
+        };
+
+        match status_to_maybe_uv_error(**self, r) {
+            Some(err) => Err(uv_error_to_io_error(err)),
+            None => Ok(())
+        }
+    }
+
+    fn letdie(&mut self) -> Result<(), IoError> {
+        let r = unsafe {
+            uvll::rust_uv_tcp_keepalive(self.native_handle(), 0 as c_int, 0 as c_uint)
+        };
+
+        match status_to_maybe_uv_error(**self, r) {
+            Some(err) => Err(uv_error_to_io_error(err)),
+            None => Ok(())
+        }
+    }
 }
 
 pub struct UvUdpSocket(UdpWatcher);