diff options
| author | Luqman Aden <me@luqman.ca> | 2013-07-25 19:42:19 -0400 |
|---|---|---|
| committer | Luqman Aden <me@luqman.ca> | 2013-07-25 19:42:19 -0400 |
| commit | a5c6b85091e171c9ec85bad68774aece81af74fa (patch) | |
| tree | 1d87e6872d135a662cc8364686efc04eccdc74a5 /src/libstd | |
| parent | 005ea3b17375584f823c51d141248e3bcbc04115 (diff) | |
| download | rust-a5c6b85091e171c9ec85bad68774aece81af74fa.tar.gz rust-a5c6b85091e171c9ec85bad68774aece81af74fa.zip | |
libstd: Implement some missing tcp methods.
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/rt/rtio.rs | 12 | ||||
| -rw-r--r-- | src/libstd/rt/uv/uvio.rs | 75 |
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); |
