libstd: Get rid of duplication in {peer, socket}_name and remove extra *.

This commit is contained in:
Luqman Aden 2013-07-25 15:43:45 -04:00
parent e2bb32bea1
commit d6e1a6b237
2 changed files with 49 additions and 103 deletions

View file

@ -45,7 +45,7 @@ impl TcpStream {
}
pub fn peer_name(&mut self) -> Option<IpAddr> {
match (***self).peer_name() {
match (**self).peer_name() {
Ok(pn) => Some(pn),
Err(ioerr) => {
rtdebug!("failed to get peer name: %?", ioerr);
@ -56,7 +56,7 @@ impl TcpStream {
}
pub fn socket_name(&mut self) -> Option<IpAddr> {
match (***self).socket_name() {
match (**self).socket_name() {
Ok(sn) => Some(sn),
Err(ioerr) => {
rtdebug!("failed to get socket name: %?", ioerr);
@ -115,7 +115,7 @@ impl TcpListener {
}
pub fn socket_name(&mut self) -> Option<IpAddr> {
match (***self).socket_name() {
match (**self).socket_name() {
Ok(sn) => Some(sn),
Err(ioerr) => {
rtdebug!("failed to get socket name: %?", ioerr);

View file

@ -15,6 +15,7 @@ use cell::Cell;
use cast;
use cast::transmute;
use clone::Clone;
use libc::c_void;
use rt::io::IoError;
use rt::io::net::ip::IpAddr;
use rt::uv::*;
@ -34,6 +35,47 @@ use unstable::sync::{Exclusive, exclusive};
next_test_ip4,
run_in_newsched_task};
enum SocketNameKind {
TcpPeer,
Tcp,
Udp
}
fn socket_name<T, U: Watcher + NativeHandle<*T>>(sk: SocketNameKind,
handle: U) -> Result<IpAddr, IoError> {
let getsockname = match sk {
TcpPeer => uvll::rust_uv_tcp_getpeername,
Tcp => uvll::rust_uv_tcp_getsockname,
Udp => uvll::rust_uv_udp_getsockname
};
// Allocate a sockaddr_storage
// since we don't know if it's ipv4 or ipv6
let r_addr = unsafe { uvll::malloc_sockaddr_storage() };
let r = unsafe {
getsockname(handle.native_handle() as *c_void, r_addr as *uvll::sockaddr_storage)
};
if r != 0 {
let status = status_to_maybe_uv_error(handle, r);
return Err(uv_error_to_io_error(status.unwrap()));
}
let addr = unsafe {
if uvll::is_ip6_addr(r_addr as *uvll::sockaddr) {
net::uv_ip_to_ip(UvIpv6(r_addr as *uvll::sockaddr_in6))
} else {
net::uv_ip_to_ip(UvIpv4(r_addr as *uvll::sockaddr_in))
}
};
unsafe { uvll::free_sockaddr_storage(r_addr); }
Ok(addr)
}
pub struct UvEventLoop {
uvio: UvIoFactory
@ -323,31 +365,7 @@ impl Drop for UvTcpListener {
impl RtioSocket for UvTcpListener {
fn socket_name(&mut self) -> Result<IpAddr, IoError> {
// Allocate a sockaddr_storage
// since we don't know if it's ipv4 or ipv6
let r_addr = unsafe { uvll::malloc_sockaddr_storage() };
let r = unsafe {
uvll::rust_uv_tcp_getsockname(self.watcher.native_handle(),
r_addr as *uvll::sockaddr_storage)
};
if r != 0 {
let status = status_to_maybe_uv_error(self.watcher, r);
return Err(uv_error_to_io_error(status.unwrap()));
}
let addr = unsafe {
if uvll::is_ip6_addr(r_addr as *uvll::sockaddr) {
net::uv_ip_to_ip(UvIpv6(r_addr as *uvll::sockaddr_in6))
} else {
net::uv_ip_to_ip(UvIpv4(r_addr as *uvll::sockaddr_in))
}
};
unsafe { uvll::free_sockaddr_storage(r_addr); }
Ok(addr)
socket_name(Tcp, self.watcher)
}
}
@ -409,31 +427,7 @@ impl Drop for UvTcpStream {
impl RtioSocket for UvTcpStream {
fn socket_name(&mut self) -> Result<IpAddr, IoError> {
// Allocate a sockaddr_storage
// since we don't know if it's ipv4 or ipv6
let r_addr = unsafe { uvll::malloc_sockaddr_storage() };
let r = unsafe {
uvll::rust_uv_tcp_getsockname(self.native_handle(),
r_addr as *uvll::sockaddr_storage)
};
if r != 0 {
let status = status_to_maybe_uv_error(**self, r);
return Err(uv_error_to_io_error(status.unwrap()));
}
let addr = unsafe {
if uvll::is_ip6_addr(r_addr as *uvll::sockaddr) {
net::uv_ip_to_ip(UvIpv6(r_addr as *uvll::sockaddr_in6))
} else {
net::uv_ip_to_ip(UvIpv4(r_addr as *uvll::sockaddr_in))
}
};
unsafe { uvll::free_sockaddr_storage(r_addr); }
Ok(addr)
socket_name(Tcp, **self)
}
}
@ -510,31 +504,7 @@ impl RtioTcpStream for UvTcpStream {
}
fn peer_name(&mut self) -> Result<IpAddr, IoError> {
// Allocate a sockaddr_storage
// since we don't know if it's ipv4 or ipv6
let r_addr = unsafe { uvll::malloc_sockaddr_storage() };
let r = unsafe {
uvll::rust_uv_tcp_getpeername(self.native_handle(),
r_addr as *uvll::sockaddr_storage)
};
if r != 0 {
let status = status_to_maybe_uv_error(**self, r);
return Err(uv_error_to_io_error(status.unwrap()));
}
let addr = unsafe {
if uvll::is_ip6_addr(r_addr as *uvll::sockaddr) {
net::uv_ip_to_ip(UvIpv6(r_addr as *uvll::sockaddr_in6))
} else {
net::uv_ip_to_ip(UvIpv4(r_addr as *uvll::sockaddr_in))
}
};
unsafe { uvll::free_sockaddr_storage(r_addr); }
Ok(addr)
socket_name(TcpPeer, **self)
}
// XXX implement
@ -562,31 +532,7 @@ impl Drop for UvUdpSocket {
impl RtioSocket for UvUdpSocket {
fn socket_name(&mut self) -> Result<IpAddr, IoError> {
// Allocate a sockaddr_storage
// since we don't know if it's ipv4 or ipv6
let r_addr = unsafe { uvll::malloc_sockaddr_storage() };
let r = unsafe {
uvll::rust_uv_udp_getsockname(self.native_handle(),
r_addr as *uvll::sockaddr_storage)
};
if r != 0 {
let status = status_to_maybe_uv_error(**self, r);
return Err(uv_error_to_io_error(status.unwrap()));
}
let addr = unsafe {
if uvll::is_ip6_addr(r_addr as *uvll::sockaddr) {
net::uv_ip_to_ip(UvIpv6(r_addr as *uvll::sockaddr_in6))
} else {
net::uv_ip_to_ip(UvIpv4(r_addr as *uvll::sockaddr_in))
}
};
unsafe { uvll::free_sockaddr_storage(r_addr); }
Ok(addr)
socket_name(Udp, **self)
}
}