diff options
| author | Brian Anderson <banderson@mozilla.com> | 2013-09-05 14:16:17 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2013-09-05 14:22:16 -0700 |
| commit | 0948f54e65227a95d386e429f4e1356d7dd3fba7 (patch) | |
| tree | fca9d4628b36c014022f0a27df489850d1cf2723 /src/libstd/rt/uv | |
| parent | c218694cece7c3018b4a809a52a35fcf3716d92e (diff) | |
std::rt: Add get_host_addresses function
This is a very simplistic method for host name resolution. It converts a host name to a vector of IP addresses. Should be enough to get started.
Diffstat (limited to 'src/libstd/rt/uv')
| -rw-r--r-- | src/libstd/rt/uv/uvio.rs | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/src/libstd/rt/uv/uvio.rs b/src/libstd/rt/uv/uvio.rs index e37dfba0cc1..b225513e94f 100644 --- a/src/libstd/rt/uv/uvio.rs +++ b/src/libstd/rt/uv/uvio.rs @@ -29,7 +29,8 @@ use rt::tube::Tube; use rt::task::SchedHome; use rt::uv::*; use rt::uv::idle::IdleWatcher; -use rt::uv::net::{UvIpv4SocketAddr, UvIpv6SocketAddr}; +use rt::uv::net::{UvIpv4SocketAddr, UvIpv6SocketAddr, accum_sockaddrs}; +use rt::uv::addrinfo::GetAddrInfoRequest; use unstable::sync::Exclusive; use super::super::io::support::PathLike; use libc::{lseek, off_t, O_CREAT, O_APPEND, O_TRUNC, O_RDWR, O_RDONLY, O_WRONLY, @@ -596,6 +597,37 @@ impl IoFactory for UvIoFactory { assert!(!result_cell.is_empty()); return result_cell.take(); } + + fn get_host_addresses(&mut self, host: &str) -> Result<~[IpAddr], IoError> { + let result_cell = Cell::new_empty(); + let result_cell_ptr: *Cell<Result<~[IpAddr], IoError>> = &result_cell; + let host_ptr: *&str = &host; + let addrinfo_req = GetAddrInfoRequest::new(); + let addrinfo_req_cell = Cell::new(addrinfo_req); + do task::unkillable { // FIXME(#8674) + let scheduler: ~Scheduler = Local::take(); + do scheduler.deschedule_running_task_and_then |_, task| { + let task_cell = Cell::new(task); + let mut addrinfo_req = addrinfo_req_cell.take(); + unsafe { + do addrinfo_req.getaddrinfo(self.uv_loop(), + Some(*host_ptr), + None, None) |_, addrinfo, err| { + let res = match err { + None => Ok(accum_sockaddrs(addrinfo).map(|addr| addr.ip.clone())), + Some(err) => Err(uv_error_to_io_error(err)) + }; + (*result_cell_ptr).put_back(res); + let scheduler: ~Scheduler = Local::take(); + scheduler.resume_blocked_task_immediately(task_cell.take()); + } + } + } + } + addrinfo_req.delete(); + assert!(!result_cell.is_empty()); + return result_cell.take(); + } } pub struct UvTcpListener { |
