about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2014-01-28 12:01:44 -0800
committerbors <bors@rust-lang.org>2014-01-28 12:01:44 -0800
commitc6bd05303c37d354e08278fcdebd95ca7fec9fd9 (patch)
tree8c37176e48710e36989df2aff1be76f5974fa291 /src/libstd
parentb3d10f43833f065ec0e635ce6cdb2332f4ee5049 (diff)
parente901c4caf30353f6adf12e6b10a46a4de517ec9d (diff)
downloadrust-c6bd05303c37d354e08278fcdebd95ca7fec9fd9.tar.gz
rust-c6bd05303c37d354e08278fcdebd95ca7fec9fd9.zip
auto merge of #11845 : xales/rust/libnative, r=alexcrichton
Fixes std::net test error when re-running too quickly.

Suggested by @cmr
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/io/net/tcp.rs40
-rw-r--r--src/libstd/libc.rs4
2 files changed, 44 insertions, 0 deletions
diff --git a/src/libstd/io/net/tcp.rs b/src/libstd/io/net/tcp.rs
index 9f0bf84c8d8..92efc4e9306 100644
--- a/src/libstd/io/net/tcp.rs
+++ b/src/libstd/io/net/tcp.rs
@@ -609,4 +609,44 @@ mod test {
         c.write([1]);
         p.recv();
     })
+
+    iotest!(fn double_bind() {
+        let mut called = false;
+        io_error::cond.trap(|e| {
+            assert!(e.kind == ConnectionRefused || e.kind == OtherIoError);
+            called = true;
+        }).inside(|| {
+            let addr = next_test_ip4();
+            let listener = TcpListener::bind(addr).unwrap().listen();
+            assert!(listener.is_some());
+            let listener2 = TcpListener::bind(addr).and_then(|l|
+                                                    l.listen());
+            assert!(listener2.is_none());
+        });
+        assert!(called);
+    })
+
+    iotest!(fn fast_rebind() {
+        let addr = next_test_ip4();
+        let (port, chan) = Chan::new();
+
+        do spawn {
+            port.recv();
+            let stream = TcpStream::connect(addr);
+            // Close
+            port.recv();
+        }
+
+        {
+            let mut acceptor = TcpListener::bind(addr).listen();
+            chan.send(());
+            {
+                let stream = acceptor.accept();
+                // Close client
+                chan.send(());
+            }
+            // Close listener
+        }
+        let listener = TcpListener::bind(addr);
+    })
 }
diff --git a/src/libstd/libc.rs b/src/libstd/libc.rs
index d5f185880fa..dccadf2e00b 100644
--- a/src/libstd/libc.rs
+++ b/src/libstd/libc.rs
@@ -1547,6 +1547,7 @@ pub mod consts {
             pub static SOL_SOCKET: c_int = 0xffff;
             pub static SO_KEEPALIVE: c_int = 8;
             pub static SO_BROADCAST: c_int = 32;
+            pub static SO_REUSEADDR: c_int = 4;
         }
         pub mod extra {
             use libc::types::os::arch::c95::c_int;
@@ -2266,6 +2267,7 @@ pub mod consts {
             pub static SOL_SOCKET: c_int = 1;
             pub static SO_KEEPALIVE: c_int = 9;
             pub static SO_BROADCAST: c_int = 6;
+            pub static SO_REUSEADDR: c_int = 2;
         }
         #[cfg(target_arch = "x86")]
         #[cfg(target_arch = "x86_64")]
@@ -2707,6 +2709,7 @@ pub mod consts {
             pub static SOL_SOCKET: c_int = 0xffff;
             pub static SO_KEEPALIVE: c_int = 0x0008;
             pub static SO_BROADCAST: c_int = 0x0020;
+            pub static SO_REUSEADDR: c_int = 0x0004;
         }
         pub mod extra {
             use libc::types::os::arch::c95::c_int;
@@ -3083,6 +3086,7 @@ pub mod consts {
             pub static SOL_SOCKET: c_int = 0xffff;
             pub static SO_KEEPALIVE: c_int = 0x0008;
             pub static SO_BROADCAST: c_int = 0x0020;
+            pub static SO_REUSEADDR: c_int = 0x0004;
         }
         pub mod extra {
             use libc::types::os::arch::c95::c_int;