diff --git a/src/header/sys_socket/constants.rs b/src/header/sys_socket/constants.rs
index 38a791c156c6ffc0de120def4832ac0cd28636db..cbec0095f916705aaa7397e9606156bcce46a771 100644
--- a/src/header/sys_socket/constants.rs
+++ b/src/header/sys_socket/constants.rs
@@ -1,7 +1,5 @@
 use platform::types::*;
 
-// These constants also exist in platform. They need to match.
-// Reason they are not just re-exported is cbindgen.
 pub const SOCK_STREAM: c_int = 1;
 pub const SOCK_DGRAM: c_int = 2;
 pub const SOCK_NONBLOCK: c_int = 0o4000;
diff --git a/src/macros.rs b/src/macros.rs
index 3cc80d44923303fff3c1490f1367b150ea8dab02..af896e769eb83af166a5cecacc4d3af2506f0152 100644
--- a/src/macros.rs
+++ b/src/macros.rs
@@ -53,10 +53,8 @@ macro_rules! trace_expr {
 #[cfg(feature = "trace")]
 pub fn trace_error() -> (isize, &'static str) {
     use header::errno::STR_ERROR;
-    use platform;
-    use platform::types::c_int;
 
-    let errno = unsafe { platform::errno } as isize;
+    let errno = unsafe { ::platform::errno } as isize;
     if errno >= 0 && errno < STR_ERROR.len() as isize {
         (errno, STR_ERROR[errno as usize])
     } else {
@@ -68,7 +66,10 @@ pub fn trace_error() -> (isize, &'static str) {
 #[cfg(feature = "trace")]
 macro_rules! trace_expr {
     ($expr:expr, $($arg:tt)*) => ({
-        trace!("{} {:?}", format_args!($($arg)*), $crate::macros::trace_error());
+        trace!("{}", format_args!($($arg)*));
+        unsafe {
+            ::platform::errno = 0;
+        }
         let ret = $expr;
         trace!("{} = {} {:?}", format_args!($($arg)*), ret, $crate::macros::trace_error());
         ret
diff --git a/src/platform/redox/socket.rs b/src/platform/redox/socket.rs
index b70ccf746b624c0e944e60be36fff28c1cf937e2..47be2e7df3beb2ff261b6a4ff9959ee7d05ddbed 100644
--- a/src/platform/redox/socket.rs
+++ b/src/platform/redox/socket.rs
@@ -16,7 +16,17 @@ macro_rules! bind_or_connect {
     (connect $path:expr) => {
         $path
     };
-    ($mode:ident $socket:expr, $address:expr, $address_len:expr) => {{
+    ($mode:ident into, $socket:expr, $address:expr, $address_len:expr) => {{
+        let fd = bind_or_connect!($mode copy, $socket, $address, $address_len);
+
+        let result = syscall::dup2(fd, $socket as usize, &[]);
+        let _ = syscall::close(fd);
+        if (e(result) as c_int) < 0 {
+            return -1;
+        }
+        0
+    }};
+    ($mode:ident copy, $socket:expr, $address:expr, $address_len:expr) => {{
         if (*$address).sa_family as c_int != AF_INET {
             errno = syscall::EAFNOSUPPORT;
             return -1;
@@ -42,12 +52,7 @@ macro_rules! bind_or_connect {
         if (fd as c_int) < 0 {
             return -1;
         }
-        let result = syscall::dup2(fd, $socket as usize, &[]);
-        let _ = syscall::close(fd);
-        if (e(result) as c_int) < 0 {
-            return -1;
-        }
-        0
+        fd
     }};
 }
 
@@ -73,6 +78,8 @@ unsafe fn inner_get_name(
     }
     let part = parts.next().expect("Invalid reply from netstack");
 
+    println!("path: {}", ::core::str::from_utf8_unchecked(&part));
+
     let data = slice::from_raw_parts_mut(
         &mut (*address).data as *mut _ as *mut u8,
         (*address).data.len(),
@@ -101,11 +108,11 @@ impl PalSocket for Sys {
     }
 
     unsafe fn bind(socket: c_int, address: *const sockaddr, address_len: socklen_t) -> c_int {
-        bind_or_connect!(bind socket, address, address_len)
+        bind_or_connect!(bind into, socket, address, address_len)
     }
 
     unsafe fn connect(socket: c_int, address: *const sockaddr, address_len: socklen_t) -> c_int {
-        bind_or_connect!(connect socket, address, address_len)
+        bind_or_connect!(connect into, socket, address, address_len)
     }
 
     unsafe fn getpeername(
@@ -140,24 +147,16 @@ impl PalSocket for Sys {
             Self::read(socket, slice::from_raw_parts_mut(buf as *mut u8, len))
         } else {
             let fd = e(syscall::dup(socket as usize, b"listen"));
-            if fd < 0 {
+            if fd == !0 {
                 return -1;
             }
-
-            let mut path = [0; 4096];
-            let path_len = e(syscall::fpath(fd, &mut path));
-            if path_len < 0 {
+            if Self::getpeername(fd as c_int, address, address_len) < 0 {
                 let _ = syscall::close(fd);
                 return -1;
             }
 
-            // XXX process path and write to address
-            println!("listen path: {}", ::core::str::from_utf8_unchecked(&path[..path_len]));
-
-            let ret = Self::read(fd as i32, slice::from_raw_parts_mut(buf as *mut u8, len));
-
+            let ret = Self::read(fd as c_int, slice::from_raw_parts_mut(buf as *mut u8, len));
             let _ = syscall::close(fd);
-
             ret
         }
     }
@@ -176,32 +175,11 @@ impl PalSocket for Sys {
         }
         if dest_addr == ptr::null() || dest_len == 0 {
             Self::write(socket, slice::from_raw_parts(buf as *const u8, len))
-        } else if (*dest_addr).sa_family as i32 == AF_INET && dest_len >= mem::size_of::<sockaddr_in>() as u32 {
-            let data = &*(dest_addr as *const sockaddr_in);
-            let addr = data.sin_addr.s_addr;
-            let port = in_port_t::from_be(data.sin_port);
-            let path = format!(
-                "{}.{}.{}.{}:{}",
-                addr >> 8 * 3,
-                addr >> 8 * 2 & 0xFF,
-                addr >> 8 & 0xFF,
-                addr & 0xFF,
-                port
-            );
-
-            let fd = e(syscall::dup(socket as usize, path.as_bytes()));
-            if fd < 0 {
-                return -1;
-            }
-
-            let ret = Self::write(fd as i32, slice::from_raw_parts(buf as *const u8, len));
-
+        } else {
+            let fd = bind_or_connect!(connect copy, socket, dest_addr, dest_len);
+            let ret = Self::write(fd as c_int, slice::from_raw_parts(buf as *const u8, len));
             let _ = syscall::close(fd);
-
             ret
-        } else {
-            errno = syscall::EINVAL;
-            -1
         }
     }