diff --git a/src/platform/redox/socket.rs b/src/platform/redox/socket.rs
index bf9785455e2671f67a8b8c3172a245ac6d2babd6..ba641709780bf0b2103bdb5fe1af68f9194230dd 100644
--- a/src/platform/redox/socket.rs
+++ b/src/platform/redox/socket.rs
@@ -1,4 +1,4 @@
-use core::{mem, ptr, slice};
+use core::{mem, ptr, slice, str};
 use syscall::{self, flag::*, Result};
 
 use super::{
@@ -9,6 +9,7 @@ use crate::header::{
     netinet_in::{in_port_t, sockaddr_in},
     sys_socket::{constants::*, sockaddr, socklen_t},
     sys_time::timeval,
+    sys_un::sockaddr_un,
 };
 
 macro_rules! bind_or_connect {
@@ -29,28 +30,48 @@ macro_rules! bind_or_connect {
         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;
-        }
         if ($address_len as usize) < mem::size_of::<sockaddr>() {
             errno = syscall::EINVAL;
             return -1;
         }
-        let data = &*($address as *const sockaddr_in);
-        let addr = slice::from_raw_parts(
-            &data.sin_addr.s_addr as *const _ as *const u8,
-            mem::size_of_val(&data.sin_addr.s_addr),
-        );
-        let port = in_port_t::from_be(data.sin_port);
-        let path = format!(
-            bind_or_connect!($mode "{}.{}.{}.{}:{}"),
-            addr[0],
-            addr[1],
-            addr[2],
-            addr[3],
-            port
-        );
+
+        let path = match (*$address).sa_family as c_int {
+            AF_INET => {
+                let data = &*($address as *const sockaddr_in);
+                let addr = slice::from_raw_parts(
+                    &data.sin_addr.s_addr as *const _ as *const u8,
+                    mem::size_of_val(&data.sin_addr.s_addr),
+                );
+                let port = in_port_t::from_be(data.sin_port);
+                let path = format!(
+                    bind_or_connect!($mode "{}.{}.{}.{}:{}"),
+                    addr[0],
+                    addr[1],
+                    addr[2],
+                    addr[3],
+                    port
+                );
+
+                path
+            },
+            AF_UNIX => {
+                let data = &*($address as *const sockaddr_un);
+                let addr = slice::from_raw_parts(
+                    &data.sun_path as *const _ as *const u8,
+                    mem::size_of_val(&data.sun_path),
+                );
+                let path = format!(
+                    "{}",
+                    str::from_utf8(addr).unwrap()
+                );
+
+                path
+            },
+            _ => {
+                errno = syscall::EAFNOSUPPORT;
+                return -1;
+            },
+        };
 
         // Duplicate the socket, and then duplicate the copy back to the original fd
         let fd = e(syscall::dup($socket as usize, path.as_bytes()));