diff --git a/src/platform/redox/socket.rs b/src/platform/redox/socket.rs
index ba641709780bf0b2103bdb5fe1af68f9194230dd..80eb515e8ba837b8404747d7d424c22220afac24 100644
--- a/src/platform/redox/socket.rs
+++ b/src/platform/redox/socket.rs
@@ -82,21 +82,28 @@ macro_rules! bind_or_connect {
     }};
 }
 
-unsafe fn inner_get_name(
+unsafe fn inner_af_unix(buf: &[u8], address: *mut sockaddr, address_len: *mut socklen_t) {
+    let data = &mut *(address as *mut sockaddr_un);
+
+    data.sun_family = AF_UNIX as c_ushort;
+
+    let path = slice::from_raw_parts_mut(
+        &mut data.sun_path as *mut _ as *mut u8,
+        mem::size_of_val(&data.sun_path),
+    );
+
+    let len = path.len().min(buf.len());
+    path[..len].copy_from_slice(&buf[..len]);
+
+    *address_len = len as socklen_t;
+}
+
+unsafe fn inner_af_inet(
     local: bool,
-    socket: c_int,
+    buf: &[u8],
     address: *mut sockaddr,
     address_len: *mut socklen_t,
-) -> Result<usize> {
-    // 32 should probably be large enough.
-    // Format: tcp:remote/local
-    // and since we only yet support IPv4 (I think)...
-    let mut buf = [0; 32];
-    let len = syscall::fpath(socket as usize, &mut buf)?;
-    let buf = &buf[..len];
-    assert!(&buf[..4] == b"tcp:" || &buf[..4] == b"udp:");
-    let buf = &buf[4..];
-
+) {
     let mut parts = buf.split(|c| *c == b'/');
     if local {
         // Skip the remote part
@@ -117,6 +124,32 @@ unsafe fn inner_get_name(
     data[..len].copy_from_slice(&part[..len]);
 
     *address_len = len as socklen_t;
+}
+
+unsafe fn inner_get_name(
+    local: bool,
+    socket: c_int,
+    address: *mut sockaddr,
+    address_len: *mut socklen_t,
+) -> Result<usize> {
+    // 32 should probably be large enough.
+    // Format: [udp|tcp:]remote/local, chan:path
+    let mut buf = [0; 32];
+    let len = syscall::fpath(socket as usize, &mut buf)?;
+    let buf = &buf[..len];
+    assert!(&buf[..4] == b"tcp:" || &buf[..4] == b"udp:" || &buf[..5] == b"chan:");
+
+    match &buf[..5] {
+        b"tcp:" | b"udp:" => {
+            inner_af_inet(local, &buf[4..], address, address_len);
+        }
+        b"chan:" => {
+            inner_af_unix(&buf[5..], address, address_len);
+        }
+        // Socket doesn't belong to any scheme
+        _ => panic!("socket doesn't match either tcp, udp or chan schemes"),
+    };
+
     Ok(0)
 }