Implement fpathconf and pathconf

This commit is contained in:
Jeremy Soller
2019-01-27 18:53:57 -07:00
parent 0dd801da03
commit 602f015e93
3 changed files with 73 additions and 6 deletions
+39 -6
View File
@@ -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
View File
@@ -104,6 +104,7 @@ BINS=\
unistd/gethostname \
unistd/getid \
unistd/link \
unistd/pathconf \
unistd/setid \
unistd/stat \
unistd/sysconf
+33
View File
@@ -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;
}