about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorxales <xales@naveria.com>2014-01-27 09:24:01 -0500
committerxales <xales@naveria.com>2014-01-27 20:59:15 -0500
commite901c4caf30353f6adf12e6b10a46a4de517ec9d (patch)
tree789f775806fcb9699a819e701b065290256693aa /src/libstd
parentb0280ac5385433bd663e825e24f6990a816a5f40 (diff)
downloadrust-e901c4caf30353f6adf12e6b10a46a4de517ec9d.tar.gz
rust-e901c4caf30353f6adf12e6b10a46a4de517ec9d.zip
Set SO_REUSEADDR by default in libnative.
Fixes std::net test error when re-running too quickly.
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;