|
10 | 10 |
|
11 | 11 | use prelude::v1::*;
|
12 | 12 |
|
13 |
| -use ffi::CString; |
| 13 | +use ffi::{CStr, CString}; |
14 | 14 | use io::{self, Error, ErrorKind};
|
15 | 15 | use libc::{self, c_int, c_char, c_void, socklen_t};
|
16 | 16 | use mem;
|
17 | 17 | use net::{SocketAddr, Shutdown, IpAddr};
|
| 18 | +use str::from_utf8; |
18 | 19 | use sys::c;
|
19 | 20 | use sys::net::{cvt, cvt_r, cvt_gai, Socket, init, wrlen_t};
|
20 | 21 | use sys_common::{AsInner, FromInner, IntoInner};
|
@@ -126,6 +127,42 @@ pub fn lookup_host(host: &str) -> io::Result<LookupHost> {
|
126 | 127 | }
|
127 | 128 | }
|
128 | 129 |
|
| 130 | +//////////////////////////////////////////////////////////////////////////////// |
| 131 | +// lookup_addr |
| 132 | +//////////////////////////////////////////////////////////////////////////////// |
| 133 | + |
| 134 | +extern "system" { |
| 135 | + fn getnameinfo(sa: *const libc::sockaddr, salen: socklen_t, |
| 136 | + host: *mut c_char, hostlen: libc::size_t, |
| 137 | + serv: *mut c_char, servlen: libc::size_t, |
| 138 | + flags: c_int) -> c_int; |
| 139 | +} |
| 140 | + |
| 141 | +const NI_MAXHOST: usize = 1025; |
| 142 | + |
| 143 | +pub fn lookup_addr(addr: &IpAddr) -> io::Result<String> { |
| 144 | + init(); |
| 145 | + |
| 146 | + let saddr = SocketAddr::new(*addr, 0); |
| 147 | + let (inner, len) = saddr.into_inner(); |
| 148 | + let mut hostbuf = [0 as c_char; NI_MAXHOST]; |
| 149 | + |
| 150 | + let data = unsafe { |
| 151 | + try!(cvt_gai(getnameinfo(inner, len, |
| 152 | + hostbuf.as_mut_ptr(), NI_MAXHOST as libc::size_t, |
| 153 | + 0 as *mut _, 0, 0))); |
| 154 | + |
| 155 | + CStr::from_ptr(hostbuf.as_ptr()) |
| 156 | + }; |
| 157 | + |
| 158 | + match from_utf8(data.to_bytes()) { |
| 159 | + Ok(name) => Ok(name.to_string()), |
| 160 | + Err(_) => Err(io::Error::new(io::ErrorKind::Other, |
| 161 | + "failed to lookup address information", |
| 162 | + Some("invalid host name".to_string()))) |
| 163 | + } |
| 164 | +} |
| 165 | + |
129 | 166 | ////////////////////////////////////////////////////////////////////////////////
|
130 | 167 | // TCP streams
|
131 | 168 | ////////////////////////////////////////////////////////////////////////////////
|
|
0 commit comments