From 0314d179aa07905cc3bd4ec3206be28ff11696f9 Mon Sep 17 00:00:00 2001 From: Ivan Nejgebauer Date: Thu, 7 Jul 2016 12:03:31 +0200 Subject: [PATCH 1/2] Use hints with getaddrinfo() in std::net::lokup_host() When resolving a hostname, pass a hints struct where ai_socktype is set to SOCK_STREAM in order to eliminate repeated results for each protocol family. --- src/libstd/sys/common/net.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/libstd/sys/common/net.rs b/src/libstd/sys/common/net.rs index 274e495d70eb6..26925b12f93d6 100644 --- a/src/libstd/sys/common/net.rs +++ b/src/libstd/sys/common/net.rs @@ -152,9 +152,19 @@ pub fn lookup_host(host: &str) -> io::Result { init(); let c_host = CString::new(host)?; + let hints = c::addrinfo { + ai_flags: 0, + ai_family: 0, + ai_socktype: c::SOCK_STREAM, + ai_protocol: 0, + ai_addrlen: 0, + ai_addr: ptr::null_mut(), + ai_canonname: ptr::null_mut(), + ai_next: ptr::null_mut() + }; let mut res = ptr::null_mut(); unsafe { - cvt_gai(c::getaddrinfo(c_host.as_ptr(), ptr::null(), ptr::null(), + cvt_gai(c::getaddrinfo(c_host.as_ptr(), ptr::null(), &hints, &mut res))?; Ok(LookupHost { original: res, cur: res }) } From 66bf1092a58fb50279d263ba9e831435ace8e844 Mon Sep 17 00:00:00 2001 From: Ivan Nejgebauer Date: Fri, 8 Jul 2016 13:48:46 +0200 Subject: [PATCH 2/2] Add test for std::net::lookup_host() duplicates --- src/libstd/sys/common/net.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/libstd/sys/common/net.rs b/src/libstd/sys/common/net.rs index 26925b12f93d6..8b7af17f92b85 100644 --- a/src/libstd/sys/common/net.rs +++ b/src/libstd/sys/common/net.rs @@ -601,3 +601,22 @@ impl fmt::Debug for UdpSocket { .finish() } } + +#[cfg(test)] +mod tests { + use prelude::v1::*; + + use super::*; + use collections::HashMap; + + #[test] + fn no_lookup_host_duplicates() { + let mut addrs = HashMap::new(); + let lh = match lookup_host("localhost") { + Ok(lh) => lh, + Err(e) => panic!("couldn't resolve `localhost': {}", e) + }; + let _na = lh.map(|sa| *addrs.entry(sa).or_insert(0) += 1).count(); + assert!(addrs.values().filter(|&&v| v > 1).count() == 0); + } +}