diff --git a/src/header/pwd/mod.rs b/src/header/pwd/mod.rs
index d983e473545a639806631a2dadbeba3ffb3119b6..1d1df9212bcc27824383ca1249343a03b5b6eecc 100644
--- a/src/header/pwd/mod.rs
+++ b/src/header/pwd/mod.rs
@@ -27,13 +27,13 @@ use self::redox as sys;
 #[repr(C)]
 #[derive(Debug)]
 pub struct passwd {
-    pw_name: *mut c_char,
-    pw_passwd: *mut c_char,
-    pw_uid: uid_t,
-    pw_gid: gid_t,
-    pw_gecos: *mut c_char,
-    pw_dir: *mut c_char,
-    pw_shell: *mut c_char,
+    pub pw_name: *mut c_char,
+    pub pw_passwd: *mut c_char,
+    pub pw_uid: uid_t,
+    pub pw_gid: gid_t,
+    pub pw_gecos: *mut c_char,
+    pub pw_dir: *mut c_char,
+    pub pw_shell: *mut c_char,
 }
 
 static mut PASSWD_BUF: Option<MaybeAllocated> = None;
diff --git a/src/header/stdio/mod.rs b/src/header/stdio/mod.rs
index cd9887dd8a9adf364fdc5adf312a41d77e36d7ab..05b3af13eef369aee80679d6ea0e1eda22a0cec7 100644
--- a/src/header/stdio/mod.rs
+++ b/src/header/stdio/mod.rs
@@ -20,8 +20,8 @@ use crate::{
     fs::File,
     header::{
         errno::{self, STR_ERROR},
-        fcntl, stdlib,
-        string::{self, strlen},
+        fcntl, stdlib, pwd,
+        string::{self, strlen, strncpy},
         unistd,
     },
     io::{self, BufRead, BufWriter, LineWriter, Read, Write},
@@ -272,8 +272,24 @@ pub extern "C" fn ctermid(_s: *mut c_char) -> *mut c_char {
 }
 
 // #[no_mangle]
-pub extern "C" fn cuserid(_s: *mut c_char) -> *mut c_char {
-    unimplemented!();
+pub unsafe extern "C" fn cuserid(s: *mut c_char) -> *mut c_char {
+    let mut buf: Vec<i8> = vec![0; 256];
+    let mut pwd: pwd::passwd = unsafe { mem::zeroed() };
+    let mut pwdbuf: *mut pwd::passwd = unsafe { mem::zeroed() };
+    if s != ptr::null_mut() {
+        *s.add(0) = 0;
+    }
+    pwd::getpwuid_r(unistd::geteuid(), &mut pwd, buf.as_mut_ptr(), buf.len(), &mut pwdbuf);
+    if pwdbuf == ptr::null_mut() {
+        return s;
+    }
+
+    if s != ptr::null_mut() {
+        strncpy(s, (*pwdbuf).pw_name, unistd::L_cuserid);
+        return s;
+    }
+
+    (*pwdbuf).pw_name
 }
 
 /// Close a file
diff --git a/src/header/string/mod.rs b/src/header/string/mod.rs
index ffedf79d67aa485a5dc6958e6aa002c2f01b1a4a..8316c0aba0b4343ddf3edc7d7913d413e7042f04 100644
--- a/src/header/string/mod.rs
+++ b/src/header/string/mod.rs
@@ -479,7 +479,7 @@ pub unsafe extern "C" fn strlcpy(dst: *mut c_char, src: *const c_char, n: size_t
 #[no_mangle]
 pub unsafe extern "C" fn strlcat(dst: *mut c_char, src: *const c_char, n: size_t) -> size_t {
     let len = strlen(dst) as isize;
-    let mut d = dst.offset(len);
+    let d = dst.offset(len);
 
     strlcpy(d, src, n)
 }
diff --git a/src/header/unistd/mod.rs b/src/header/unistd/mod.rs
index ede590227d034a62b1f09c80f90bafb3531eea4a..f68e6175bde3d166d09b813f7335d270bebaf0a9 100644
--- a/src/header/unistd/mod.rs
+++ b/src/header/unistd/mod.rs
@@ -37,6 +37,8 @@ pub const STDIN_FILENO: c_int = 0;
 pub const STDOUT_FILENO: c_int = 1;
 pub const STDERR_FILENO: c_int = 2;
 
+pub const L_cuserid: usize = 9;
+
 #[thread_local]
 pub static mut fork_hooks_static: Option<[LinkedList<extern "C" fn()>; 3]> = None;