ソースを参照

Implement fpathconf and pathconf

Jeremy Soller 6 年 前
コミット
602f015e93
3 ファイル変更73 行追加6 行削除
  1. 39 6
      src/header/unistd/pathconf.rs
  2. 1 0
      tests/Makefile
  3. 33 0
      tests/unistd/pathconf.c

+ 39 - 6
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)
 }

+ 1 - 0
tests/Makefile

@@ -104,6 +104,7 @@ BINS=\
 	unistd/gethostname \
 	unistd/getid \
 	unistd/link \
+	unistd/pathconf \
 	unistd/setid \
 	unistd/stat \
 	unistd/sysconf

+ 33 - 0
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;
+}