diff options
| author | bors <bors@rust-lang.org> | 2014-12-31 21:01:42 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-12-31 21:01:42 +0000 |
| commit | 10d99a973498c5a1be6ba318210751efc1c2cf61 (patch) | |
| tree | 7f6c86aebf4ac2cf41fadaeef8d1548147ab70d9 /src/libstd/sys/common | |
| parent | 84f5ad8679c7fc454473ffbf389030f3e5fee379 (diff) | |
| parent | 139f44bae82a7c74bcda9cb2b16dd2ab93f18b17 (diff) | |
| download | rust-10d99a973498c5a1be6ba318210751efc1c2cf61.tar.gz rust-10d99a973498c5a1be6ba318210751efc1c2cf61.zip | |
auto merge of #20360 : alexcrichton/rust/rollup, r=alexcrichton
Diffstat (limited to 'src/libstd/sys/common')
| -rw-r--r-- | src/libstd/sys/common/net.rs | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/libstd/sys/common/net.rs b/src/libstd/sys/common/net.rs index 7a09137a225..87ec20fbef8 100644 --- a/src/libstd/sys/common/net.rs +++ b/src/libstd/sys/common/net.rs @@ -13,6 +13,7 @@ use self::InAddr::*; use alloc::arc::Arc; use libc::{mod, c_char, c_int}; +use c_str::CString; use mem; use num::Int; use ptr::{mod, null, null_mut}; @@ -291,6 +292,43 @@ pub fn get_host_addresses(host: Option<&str>, servname: Option<&str>, } //////////////////////////////////////////////////////////////////////////////// +// get_address_name +//////////////////////////////////////////////////////////////////////////////// + +extern "system" { + fn getnameinfo(sa: *const libc::sockaddr, salen: libc::socklen_t, + host: *mut c_char, hostlen: libc::size_t, + serv: *mut c_char, servlen: libc::size_t, + flags: c_int) -> c_int; +} + +const NI_MAXHOST: uint = 1025; + +pub fn get_address_name(addr: IpAddr) -> Result<String, IoError> { + let addr = SocketAddr{ip: addr, port: 0}; + + let mut storage: libc::sockaddr_storage = unsafe { mem::zeroed() }; + let len = addr_to_sockaddr(addr, &mut storage); + + let mut hostbuf = [0 as c_char, ..NI_MAXHOST]; + + let res = unsafe { + getnameinfo(&storage as *const _ as *const libc::sockaddr, len, + hostbuf.as_mut_ptr(), NI_MAXHOST as libc::size_t, + ptr::null_mut(), 0, + 0) + }; + + if res != 0 { + return Err(last_gai_error(res)); + } + + unsafe { + Ok(CString::new(hostbuf.as_ptr(), false).as_str().unwrap().to_string()) + } +} + +//////////////////////////////////////////////////////////////////////////////// // Timeout helpers // // The read/write functions below are the helpers for reading/writing a socket |
