Skip to content

Commit

Permalink
Set SO_REUSEADDR by default in libnative.
Browse files Browse the repository at this point in the history
Fixes std::net test error when re-running too quickly.
  • Loading branch information
xales committed Jan 28, 2014
1 parent b0280ac commit e901c4c
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 0 deletions.
11 changes: 11 additions & 0 deletions src/libnative/io/net.rs
Expand Up @@ -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()),
Expand Down
40 changes: 40 additions & 0 deletions src/libstd/io/net/tcp.rs
Expand Up @@ -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);
})
}
4 changes: 4 additions & 0 deletions src/libstd/libc.rs
Expand Up @@ -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;
Expand Down Expand Up @@ -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")]
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down

5 comments on commit e901c4c

@bors
Copy link
Contributor

@bors bors commented on e901c4c Jan 28, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

saw approval from alexcrichton
at xales@e901c4c

@bors
Copy link
Contributor

@bors bors commented on e901c4c Jan 28, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

merging xales/rust/libnative = e901c4c into auto

@bors
Copy link
Contributor

@bors bors commented on e901c4c Jan 28, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

xales/rust/libnative = e901c4c merged ok, testing candidate = c6bd053

@bors
Copy link
Contributor

@bors bors commented on e901c4c Jan 28, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bors
Copy link
Contributor

@bors bors commented on e901c4c Jan 28, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fast-forwarding master to auto = c6bd053

Please sign in to comment.