summary refs log tree commit diff
path: root/src/libnative
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/libnative
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/libnative')
-rw-r--r--src/libnative/io/net.rs11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/libnative/io/net.rs b/src/libnative/io/net.rs
index 9be4247b056..2f4bec22755 100644
--- a/src/libnative/io/net.rs
+++ b/src/libnative/io/net.rs
@@ -348,6 +348,17 @@ impl TcpListener {
                 let (addr, len) = addr_to_sockaddr(addr);
                 let addrp = &addr as *libc::sockaddr_storage;
                 let ret = TcpListener { fd: fd };
+                // On platforms with Berkeley-derived sockets, this allows
+                // to quickly rebind a socket, without needing to wait for
+                // the OS to clean up the previous one.
+                if cfg!(unix) {
+                    match setsockopt(fd, libc::SOL_SOCKET,
+                                     libc::SO_REUSEADDR,
+                                     1 as libc::c_int) {
+                        Err(n) => { return Err(n); },
+                        Ok(..) => { }
+                    }
+                }
                 match libc::bind(fd, addrp as *libc::sockaddr,
                                  len as libc::socklen_t) {
                     -1 => Err(super::last_error()),