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