diff --git a/include/bits/sys/stat.h b/include/bits/sys/stat.h
index 0078da854bc1c69dd78da7fe5a177f6d574fd4ff..199097aa7c3b2c144611c62f3cdb29d090dd4cba 100644
--- a/include/bits/sys/stat.h
+++ b/include/bits/sys/stat.h
@@ -5,8 +5,9 @@
 #define S_ISCHR(mode) mode & S_IFMT == S_IFCHR
 #define S_ISBLK(mode) mode & S_IFMT == S_IFBLK
 #define S_ISREG(mode) mode & S_IFMT == S_IFREG
-#define S_ISIFO(mode) mode & S_IFMT == S_IFIFO
+#define S_ISFIFO(mode) mode & S_IFMT == S_IFIFO
 #define S_ISLNK(mode) mode & S_IFMT == S_IFLNK
+#define S_ISSOCK(mode) mode & S_IFMT == S_IFSOCK
 
 #define st_atime st_atim.tv_sec
 #define st_mtime st_mtim.tv_sec
diff --git a/src/stdlib/src/lib.rs b/src/stdlib/src/lib.rs
index 1c096323f1a5eb9192adfcbe11e6df5a4912a095..b2438194d7568a03ee14edb588440870b0e0b565 100644
--- a/src/stdlib/src/lib.rs
+++ b/src/stdlib/src/lib.rs
@@ -893,6 +893,20 @@ pub unsafe extern "C" fn strtol(s: *const c_char, endptr: *mut *mut c_char, base
     )
 }
 
+#[no_mangle]
+pub unsafe extern "C" fn strtoull(
+    s: *const c_char,
+    endptr: *mut *mut c_char,
+    base: c_int,
+) -> c_ulong {
+    strtoul(s, endptr, base)
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn strtoll(s: *const c_char, endptr: *mut *mut c_char, base: c_int) -> c_long {
+    strtol(s, endptr, base)
+}
+
 #[no_mangle]
 pub unsafe extern "C" fn system(command: *const c_char) -> c_int {
     let child_pid = unistd::fork();
diff --git a/src/string/src/lib.rs b/src/string/src/lib.rs
index ec074f3ed8c974248f84433da3db916c57976eeb..ea9606dca60851d1e8229895ce9aaf426caf38e0 100644
--- a/src/string/src/lib.rs
+++ b/src/string/src/lib.rs
@@ -154,34 +154,39 @@ pub unsafe extern "C" fn strcpy(s1: *mut c_char, s2: *const c_char) -> *mut c_ch
     strncpy(s1, s2, usize::MAX)
 }
 
-#[no_mangle]
-pub unsafe extern "C" fn strcspn(s1: *const c_char, s2: *const c_char) -> size_t {
+pub unsafe fn inner_strspn(s1: *const c_char, s2: *const c_char, cmp: bool) -> size_t {
     let s1 = s1 as *const u8;
     let s2 = s2 as *const u8;
 
-    // The below logic is effectively ripped from the musl implementation
+    // The below logic is effectively ripped from the musl implementation. It
+    // works by placing each byte as it's own bit in an array of numbers. Each
+    // number can hold up to 8 * mem::size_of::<usize>() bits. We need 256 bits
+    // in total, to fit one byte.
 
-    let mut byteset = [0usize; 32 / mem::size_of::<usize>()];
+    const BITSIZE: usize = 8 * mem::size_of::<usize>();
+    let mut byteset = [0usize; 256 / BITSIZE];
 
     let mut i = 0;
     while *s2.offset(i) != 0 {
-        byteset[(*s2.offset(i) as usize) / (8 * byteset.len())] |=
-            1 << (*s2.offset(i) as usize % (8 * byteset.len()));
+        byteset[(*s2.offset(i) as usize) / BITSIZE] |=
+            1 << (*s2.offset(i) as usize & (BITSIZE-1));
         i += 1;
     }
 
     i = 0; // reset
-    while *s1.offset(i) != 0 {
-        if byteset[(*s1.offset(i) as usize) / (8 * byteset.len())]
-            & 1 << (*s1.offset(i) as usize % (8 * byteset.len())) > 0
-        {
-            break;
-        }
+    while *s1.offset(i) != 0 &&
+            (byteset[(*s1.offset(i) as usize) / BITSIZE] &
+            1 << (*s1.offset(i) as usize & (BITSIZE-1)) != 0) == cmp {
         i += 1;
     }
     i as size_t
 }
 
+#[no_mangle]
+pub unsafe extern "C" fn strcspn(s1: *const c_char, s2: *const c_char) -> size_t {
+    inner_strspn(s1, s2, false)
+}
+
 #[no_mangle]
 pub unsafe extern "C" fn strdup(s1: *const c_char) -> *mut c_char {
     strndup(s1, usize::MAX)
@@ -318,30 +323,7 @@ pub unsafe extern "C" fn strsignal(sig: c_int) -> *mut c_char {
 
 #[no_mangle]
 pub unsafe extern "C" fn strspn(s1: *const c_char, s2: *const c_char) -> size_t {
-    let s1 = s1 as *const u8;
-    let s2 = s2 as *const u8;
-
-    // The below logic is effectively ripped from the musl implementation
-
-    let mut byteset = [0usize; 32 / mem::size_of::<usize>()];
-
-    let mut i = 0;
-    while *s2.offset(i) != 0 {
-        byteset[(*s2.offset(i) as usize) / (8 * byteset.len())] |=
-            1 << (*s2.offset(i) as usize % (8 * byteset.len()));
-        i += 1;
-    }
-
-    i = 0; // reset
-    while *s1.offset(i) != 0 {
-        if byteset[(*s1.offset(i) as usize) / (8 * byteset.len())]
-            & 1 << (*s1.offset(i) as usize % (8 * byteset.len())) < 1
-        {
-            break;
-        }
-        i += 1;
-    }
-    i as size_t
+    inner_strspn(s1, s2, true)
 }
 
 #[no_mangle]
diff --git a/src/sys_stat/src/lib.rs b/src/sys_stat/src/lib.rs
index a5b63af151d59fb337f43ca9345cd4376bcfe010..17c793e5e6292aadd9a0ea4b1d94b9d928ae0dc7 100644
--- a/src/sys_stat/src/lib.rs
+++ b/src/sys_stat/src/lib.rs
@@ -7,12 +7,14 @@ extern crate platform;
 use platform::types::*;
 
 pub const S_IFMT: c_int = 0o0170000;
-pub const S_IFBLK: c_int = 0o060000;
+
+pub const S_IFDIR: c_int = 0o040000;
 pub const S_IFCHR: c_int = 0o020000;
-pub const S_IFIFO: c_int = 0o010000;
+pub const S_IFBLK: c_int = 0o060000;
 pub const S_IFREG: c_int = 0o100000;
-pub const S_IFDIR: c_int = 0o040000;
+pub const S_IFIFO: c_int = 0o010000;
 pub const S_IFLNK: c_int = 0o120000;
+pub const S_IFSOCK: c_int = 0o140000;
 
 pub const S_IRWXU: c_int = 0o0700;
 pub const S_IRUSR: c_int = 0o0400;