std: adding some basic docs for net::ip::get_addr

This commit is contained in:
Jeff Olson 2012-06-27 15:59:04 -07:00 committed by Brian Anderson
parent a696193bab
commit 087c4244b1

View File

@ -72,76 +72,26 @@ fn format_addr(ip: ip_addr) -> str {
} }
} }
type get_addr_data = {
output_ch: comm::chan<result::result<[ip_addr]/~,ip_get_addr_err>>
};
crust fn get_addr_cb(handle: *uv_getaddrinfo_t, status: libc::c_int,
res: *addrinfo) unsafe {
log(debug, "in get_addr_cb");
let handle_data = get_data_for_req(handle) as
*get_addr_data;
if status == 0i32 {
if res != (ptr::null::<addrinfo>()) {
let mut out_vec = []/~;
log(debug, #fmt("initial addrinfo: %?", res));
let mut curr_addr = res;
loop {
let new_ip_addr = if ll::is_ipv4_addrinfo(curr_addr) {
ipv4(copy((
*ll::addrinfo_as_sockaddr_in(curr_addr))))
}
else if ll::is_ipv6_addrinfo(curr_addr) {
ipv6(copy((
*ll::addrinfo_as_sockaddr_in6(curr_addr))))
}
else {
log(debug, "curr_addr is not of family AF_INET or "+
"AF_INET6. Error.");
(*handle_data).output_ch.send(
result::err(get_addr_unknown_error));
break;
};
out_vec += [new_ip_addr]/~;
let next_addr = ll::get_next_addrinfo(curr_addr);
if next_addr == ptr::null::<addrinfo>() as *addrinfo {
log(debug, "null next_addr encountered. no mas");
break;
}
else {
curr_addr = next_addr;
log(debug, #fmt("next_addr addrinfo: %?", curr_addr));
}
}
log(debug, #fmt("successful process addrinfo result, len: %?",
vec::len(out_vec)));
(*handle_data).output_ch.send(result::ok(out_vec));
}
else {
log(debug, "addrinfo pointer is NULL");
(*handle_data).output_ch.send(
result::err(get_addr_unknown_error));
}
}
else {
log(debug, "status != 0 error in get_addr_cb");
(*handle_data).output_ch.send(
result::err(get_addr_unknown_error));
}
if res != (ptr::null::<addrinfo>()) {
uv_freeaddrinfo(res);
}
log(debug, "leaving get_addr_cb");
}
#[doc=" #[doc="
Represents errors returned from `net::ip::get_addr()`
"] "]
enum ip_get_addr_err { enum ip_get_addr_err {
get_addr_unknown_error get_addr_unknown_error
} }
#[doc=" #[doc="
Attempts name resolution on the provided `node` string
# Arguments
* `node` - a string representing some host address
* `iotask` - a `uv::iotask` used to interact with the underlying event loop
# Returns
A `result<[ip_addr]/~, ip_get_addr_err>` instance that will contain
a vector of `ip_addr` results, in the case of success, or an error
object in the case of failure
"] "]
fn get_addr(++node: str, iotask: iotask) fn get_addr(++node: str, iotask: iotask)
-> result::result<[ip_addr]/~, ip_get_addr_err> unsafe { -> result::result<[ip_addr]/~, ip_get_addr_err> unsafe {
@ -303,6 +253,69 @@ mod v6 {
} }
} }
type get_addr_data = {
output_ch: comm::chan<result::result<[ip_addr]/~,ip_get_addr_err>>
};
crust fn get_addr_cb(handle: *uv_getaddrinfo_t, status: libc::c_int,
res: *addrinfo) unsafe {
log(debug, "in get_addr_cb");
let handle_data = get_data_for_req(handle) as
*get_addr_data;
if status == 0i32 {
if res != (ptr::null::<addrinfo>()) {
let mut out_vec = []/~;
log(debug, #fmt("initial addrinfo: %?", res));
let mut curr_addr = res;
loop {
let new_ip_addr = if ll::is_ipv4_addrinfo(curr_addr) {
ipv4(copy((
*ll::addrinfo_as_sockaddr_in(curr_addr))))
}
else if ll::is_ipv6_addrinfo(curr_addr) {
ipv6(copy((
*ll::addrinfo_as_sockaddr_in6(curr_addr))))
}
else {
log(debug, "curr_addr is not of family AF_INET or "+
"AF_INET6. Error.");
(*handle_data).output_ch.send(
result::err(get_addr_unknown_error));
break;
};
out_vec += [new_ip_addr]/~;
let next_addr = ll::get_next_addrinfo(curr_addr);
if next_addr == ptr::null::<addrinfo>() as *addrinfo {
log(debug, "null next_addr encountered. no mas");
break;
}
else {
curr_addr = next_addr;
log(debug, #fmt("next_addr addrinfo: %?", curr_addr));
}
}
log(debug, #fmt("successful process addrinfo result, len: %?",
vec::len(out_vec)));
(*handle_data).output_ch.send(result::ok(out_vec));
}
else {
log(debug, "addrinfo pointer is NULL");
(*handle_data).output_ch.send(
result::err(get_addr_unknown_error));
}
}
else {
log(debug, "status != 0 error in get_addr_cb");
(*handle_data).output_ch.send(
result::err(get_addr_unknown_error));
}
if res != (ptr::null::<addrinfo>()) {
uv_freeaddrinfo(res);
}
log(debug, "leaving get_addr_cb");
}
#[cfg(test)] #[cfg(test)]
mod test { mod test {
#[test] #[test]