about summary refs log tree commit diff
path: root/src/libnative
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/libnative
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/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()),