]> git.lizzy.rs Git - rust.git/commitdiff
libstd: Get rid of duplication in {peer, socket}_name and remove extra *.
authorLuqman Aden <me@luqman.ca>
Thu, 25 Jul 2013 19:43:45 +0000 (15:43 -0400)
committerLuqman Aden <me@luqman.ca>
Thu, 25 Jul 2013 19:50:19 +0000 (15:50 -0400)
src/libstd/rt/io/net/tcp.rs
src/libstd/rt/uv/uvio.rs

index 5251b6d9ded9e157a6768391cf1fe46b3c46d237..0107d30519e5ece08d307ad88d0a7ec87503b86d 100644 (file)
@@ -45,7 +45,7 @@ pub fn connect(addr: IpAddr) -> Option<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 @@ pub fn peer_name(&mut self) -> Option<IpAddr> {
     }
 
     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 @@ pub fn bind(addr: IpAddr) -> Option<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);
index 9f2316d62271e80a13ed19ab124eae92a42d239d..42408507f5de340366c1732d7942bc60739075a6 100644 (file)
@@ -15,6 +15,7 @@
 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::*;
                             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 @@ fn drop(&self) {
 
 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 @@ fn drop(&self) {
 
 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 @@ fn write(&mut self, buf: &[u8]) -> Result<(), IoError> {
     }
 
     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 @@ fn drop(&self) {
 
 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)
     }
 }