diff --git a/platform/src/linux/mod.rs b/platform/src/linux/mod.rs
index adc1994cfe510ada42101aa4aa510ca3dced1f68..d8608f9e93f4d36c814cf7bbc6f4f89f3d3b8ed0 100644
--- a/platform/src/linux/mod.rs
+++ b/platform/src/linux/mod.rs
@@ -2,12 +2,30 @@ use types::*;
 
 const AT_FDCWD: c_int = -100;
 
+pub fn chdir(path: *const c_char) -> c_int {
+    unsafe {
+        syscall!(CHDIR, path) as c_int
+    }
+}
+
 pub fn close(fildes: c_int) -> c_int {
     unsafe {
         syscall!(CLOSE, fildes) as c_int
     }
 }
 
+pub fn dup(fildes: c_int) -> c_int {
+    unsafe {
+        syscall!(DUP, fildes) as c_int
+    }
+}
+
+pub fn dup2(fildes: c_int, fildes2:c_int) -> c_int {
+    unsafe {
+        syscall!(DUP2, fildes, fildes2) as c_int
+    }
+}
+
 pub fn exit(status: c_int) -> ! {
     unsafe {
         syscall!(EXIT, status);
diff --git a/platform/src/redox/mod.rs b/platform/src/redox/mod.rs
index 239d06a6be9fbdf1774b1cb46037edbbf87ef760..7964839ec2035f9ccda42d8caf07fc4248e3d9e2 100644
--- a/platform/src/redox/mod.rs
+++ b/platform/src/redox/mod.rs
@@ -1,3 +1,24 @@
+use core::slice;
+
+pub unsafe fn cstr_to_slice<'a>(buf: *const c_char) -> &'a [u8] {
+    slice::from_raw_parts(buf as *const u8, ::strlen(buf) as usize)
+}
+
+pub fn chdir(path: *const c_char) -> c_int {
+    syscall::chdir(cstr_to_slice(path))? as c_int
+}
+
+pub fn close(fildes: c_int) -> c_int {
+    syscall::close(fildes as usize)? as c_int
+}
+
+pub fn dup(fildes: c_int) -> c_int {
+    syscall::dup(file as usize, &[])? as c_int
+}
+
+pub fn dup2(fildes: c_int, fildes2) -> c_int {
+    syscall::dup2(fildes as usize, fildes2 as usize, &[])? as c_int
+
 pub fn exit(status: c_int) -> ! {
     syscall::exit(status);
 }
diff --git a/src/unistd/src/lib.rs b/src/unistd/src/lib.rs
index cf911b4f6cd020306c7a225fa28fa17a08c0e18c..3db682fefa16d0214406f15b4d3f74aa1e1f67b8 100644
--- a/src/unistd/src/lib.rs
+++ b/src/unistd/src/lib.rs
@@ -46,7 +46,7 @@ pub extern "C" fn brk(addr: *mut c_void) -> c_int {
 
 #[no_mangle]
 pub extern "C" fn chdir(path: *const c_char) -> c_int {
-    unimplemented!();
+    platform::chdir(path)
 }
 
 #[no_mangle]
@@ -86,12 +86,12 @@ pub extern "C" fn cuserid(s: *mut c_char) -> *mut c_char {
 
 #[no_mangle]
 pub extern "C" fn dup(fildes: c_int) -> c_int {
-    unimplemented!();
+    platform::dup(fildes)
 }
 
 #[no_mangle]
 pub extern "C" fn dup2(fildes: c_int, fildes2: c_int) -> c_int {
-    unimplemented!();
+    platform::dup2(fildes, fildes2)
 }
 
 #[no_mangle]