about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorLuqman Aden <me@luqman.ca>2013-07-25 15:43:45 -0400
committerLuqman Aden <me@luqman.ca>2013-07-25 15:50:19 -0400
commitd6e1a6b237d4c3b04a7dff6609c3427eb99bbc60 (patch)
tree780065153ab3571fa3c55212be5594ce25c307a5 /src/libstd
parente2bb32bea19f8bfd2165361b5ad2d025c2ffeba0 (diff)
downloadrust-d6e1a6b237d4c3b04a7dff6609c3427eb99bbc60.tar.gz
rust-d6e1a6b237d4c3b04a7dff6609c3427eb99bbc60.zip
libstd: Get rid of duplication in {peer, socket}_name and remove extra *.
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/rt/io/net/tcp.rs6
-rw-r--r--src/libstd/rt/uv/uvio.rs146
2 files changed, 49 insertions, 103 deletions
diff --git a/src/libstd/rt/io/net/tcp.rs b/src/libstd/rt/io/net/tcp.rs
index 5251b6d9ded..0107d30519e 100644
--- a/src/libstd/rt/io/net/tcp.rs
+++ b/src/libstd/rt/io/net/tcp.rs
@@ -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);
diff --git a/src/libstd/rt/uv/uvio.rs b/src/libstd/rt/uv/uvio.rs
index 9f2316d6227..42408507f5d 100644
--- a/src/libstd/rt/uv/uvio.rs
+++ b/src/libstd/rt/uv/uvio.rs
@@ -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)
     }
 }