diff --git a/src/header/unistd/pathconf.rs b/src/header/unistd/pathconf.rs
index 1f58fe55045fe562701909cb3582639d95bd71dc..a0c308255f5176fdcb827e5f8a486e12eafd4328 100644
--- a/src/header/unistd/pathconf.rs
+++ b/src/header/unistd/pathconf.rs
@@ -1,3 +1,5 @@
+use header::errno;
+use platform;
 use platform::types::*;
 
 pub const _PC_LINK_MAX: c_int = 0;
@@ -22,12 +24,43 @@ pub const _PC_ALLOC_SIZE_MIN: c_int = 18;
 pub const _PC_SYMLINK_MAX: c_int = 19;
 pub const _PC_2_SYMLINKS: c_int = 20;
 
-// #[no_mangle]
-pub extern "C" fn fpathconf(fildes: c_int, name: c_int) -> c_long {
-    unimplemented!();
+fn pc(name: c_int) -> c_long {
+    // Settings from musl, some adjusted
+    match name {
+        _PC_LINK_MAX => 127,
+        _PC_MAX_CANON => 255,
+        _PC_MAX_INPUT => 255,
+        _PC_NAME_MAX => 255,
+        _PC_PATH_MAX => 4096,
+        _PC_PIPE_BUF => 4096,
+        _PC_CHOWN_RESTRICTED => 1,
+        _PC_NO_TRUNC => 1,
+        _PC_VDISABLE => 0,
+        _PC_SYNC_IO => 1,
+        _PC_ASYNC_IO => -1,
+        _PC_PRIO_IO => -1,
+        _PC_SOCK_MAXBUF => -1,
+        _PC_FILESIZEBITS => 64,
+        _PC_REC_INCR_XFER_SIZE => -1,
+        _PC_REC_MAX_XFER_SIZE => -1,
+        _PC_REC_MIN_XFER_SIZE => 4096,
+        _PC_REC_XFER_ALIGN => 4096,
+        _PC_ALLOC_SIZE_MIN => 4096,
+        _PC_SYMLINK_MAX => -1,
+        _PC_2_SYMLINKS => 1,
+        _ => {
+            unsafe { platform::errno = errno::EINVAL; }
+            -1
+        }
+    }
 }
 
-// #[no_mangle]
-pub extern "C" fn pathconf(path: *const c_char, name: c_int) -> c_long {
-    unimplemented!();
+#[no_mangle]
+pub extern "C" fn fpathconf(_fildes: c_int, name: c_int) -> c_long {
+    pc(name)
+}
+
+#[no_mangle]
+pub extern "C" fn pathconf(_path: *const c_char, name: c_int) -> c_long {
+    pc(name)
 }
diff --git a/tests/Makefile b/tests/Makefile
index 669b8001288ebe2c02c5ff26668469a0180928b9..d90078cfd11f083c49e6850580192035157a4265 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -104,6 +104,7 @@ BINS=\
 	unistd/gethostname \
 	unistd/getid \
 	unistd/link \
+	unistd/pathconf \
 	unistd/setid \
 	unistd/stat \
 	unistd/sysconf
diff --git a/tests/unistd/pathconf.c b/tests/unistd/pathconf.c
new file mode 100644
index 0000000000000000000000000000000000000000..f943ec56ef90524f593a74d16c9efac9c05bd992
--- /dev/null
+++ b/tests/unistd/pathconf.c
@@ -0,0 +1,33 @@
+#include <errno.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#define PC(N) { \
+	errno = 0; \
+	printf("%s (%d): %ld (%d)\n", #N, _PC_ ## N, fpathconf(0, _PC_ ## N), errno); \
+}
+
+int main(){
+	PC(LINK_MAX);
+	PC(MAX_CANON);
+	PC(MAX_INPUT);
+	PC(NAME_MAX);
+	PC(PATH_MAX);
+	PC(PIPE_BUF);
+	PC(CHOWN_RESTRICTED);
+	PC(NO_TRUNC);
+	PC(VDISABLE);
+	PC(SYNC_IO);
+	PC(ASYNC_IO);
+	PC(PRIO_IO);
+	PC(SOCK_MAXBUF);
+	PC(FILESIZEBITS);
+	PC(REC_INCR_XFER_SIZE);
+	PC(REC_MAX_XFER_SIZE);
+	PC(REC_MIN_XFER_SIZE);
+	PC(REC_XFER_ALIGN);
+	PC(ALLOC_SIZE_MIN);
+	PC(SYMLINK_MAX);
+	PC(2_SYMLINKS);
+	return 0;
+}