libstd: Get rid of duplication in {peer, socket}_name and remove extra *.
This commit is contained in:
parent
e2bb32bea1
commit
d6e1a6b237
2 changed files with 49 additions and 103 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue