Added get_address_name
, an interface to getnameinfo
This commit is contained in:
parent
3e6b29f8ad
commit
e6c8b8f480
4 changed files with 49 additions and 2 deletions
|
@ -10,8 +10,8 @@
|
||||||
|
|
||||||
//! Synchronous DNS Resolution
|
//! Synchronous DNS Resolution
|
||||||
//!
|
//!
|
||||||
//! Contains the functionality to perform DNS resolution in a style related to
|
//! Contains the functionality to perform DNS resolution or reverse lookup,
|
||||||
//! `getaddrinfo()`
|
//! in a style related to `getaddrinfo()` and `getnameinfo()`, respectively.
|
||||||
|
|
||||||
#![allow(missing_docs)]
|
#![allow(missing_docs)]
|
||||||
|
|
||||||
|
@ -24,6 +24,7 @@ use io::{IoResult};
|
||||||
use io::net::ip::{SocketAddr, IpAddr};
|
use io::net::ip::{SocketAddr, IpAddr};
|
||||||
use option::Option;
|
use option::Option;
|
||||||
use option::Option::{Some, None};
|
use option::Option::{Some, None};
|
||||||
|
use string::String;
|
||||||
use sys;
|
use sys;
|
||||||
use vec::Vec;
|
use vec::Vec;
|
||||||
|
|
||||||
|
@ -83,6 +84,12 @@ pub fn get_host_addresses(host: &str) -> IoResult<Vec<IpAddr>> {
|
||||||
lookup(Some(host), None, None).map(|a| a.into_iter().map(|i| i.address.ip).collect())
|
lookup(Some(host), None, None).map(|a| a.into_iter().map(|i| i.address.ip).collect())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Reverse name resolution. Given an address, returns the corresponding
|
||||||
|
/// hostname.
|
||||||
|
pub fn get_address_name(addr: IpAddr) -> IoResult<String> {
|
||||||
|
sys::addrinfo::get_address_name(addr)
|
||||||
|
}
|
||||||
|
|
||||||
/// Full-fledged resolution. This function will perform a synchronous call to
|
/// Full-fledged resolution. This function will perform a synchronous call to
|
||||||
/// getaddrinfo, controlled by the parameters
|
/// getaddrinfo, controlled by the parameters
|
||||||
///
|
///
|
||||||
|
|
|
@ -13,6 +13,7 @@ use self::InAddr::*;
|
||||||
|
|
||||||
use alloc::arc::Arc;
|
use alloc::arc::Arc;
|
||||||
use libc::{mod, c_char, c_int};
|
use libc::{mod, c_char, c_int};
|
||||||
|
use c_str::CString;
|
||||||
use mem;
|
use mem;
|
||||||
use num::Int;
|
use num::Int;
|
||||||
use ptr::{mod, null, null_mut};
|
use ptr::{mod, null, null_mut};
|
||||||
|
@ -290,6 +291,43 @@ pub fn get_host_addresses(host: Option<&str>, servname: Option<&str>,
|
||||||
Ok(addrs)
|
Ok(addrs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// 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
|
// Timeout helpers
|
||||||
//
|
//
|
||||||
|
|
|
@ -56,6 +56,7 @@ pub mod udp;
|
||||||
|
|
||||||
pub mod addrinfo {
|
pub mod addrinfo {
|
||||||
pub use sys_common::net::get_host_addresses;
|
pub use sys_common::net::get_host_addresses;
|
||||||
|
pub use sys_common::net::get_address_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: move these to c module
|
// FIXME: move these to c module
|
||||||
|
|
|
@ -57,6 +57,7 @@ pub mod udp;
|
||||||
|
|
||||||
pub mod addrinfo {
|
pub mod addrinfo {
|
||||||
pub use sys_common::net::get_host_addresses;
|
pub use sys_common::net::get_host_addresses;
|
||||||
|
pub use sys_common::net::get_address_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: move these to c module
|
// FIXME: move these to c module
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue