Skip to main content

relibc/header/unistd/
pathconf.rs

1use crate::{
2    header::{
3        errno,
4        limits::{
5            FILESIZEBITS, LINK_MAX, MAX_CANON, MAX_INPUT, NAME_MAX, PATH_MAX, PIPE_BUF,
6            POSIX_ALLOC_SIZE_MIN, SYMLINK_MAX,
7        },
8        termios::_POSIX_VDISABLE,
9    },
10    platform::{
11        self,
12        types::{c_char, c_int, c_long},
13    },
14};
15
16pub const _PC_LINK_MAX: c_int = 0;
17pub const _PC_MAX_CANON: c_int = 1;
18pub const _PC_MAX_INPUT: c_int = 2;
19pub const _PC_NAME_MAX: c_int = 3;
20pub const _PC_PATH_MAX: c_int = 4;
21pub const _PC_PIPE_BUF: c_int = 5;
22pub const _PC_CHOWN_RESTRICTED: c_int = 6;
23pub const _PC_NO_TRUNC: c_int = 7;
24/// Check if file (terminal) supports disabling control chars (CC)
25pub const _PC_VDISABLE: c_int = 8;
26pub const _PC_SYNC_IO: c_int = 9;
27pub const _PC_ASYNC_IO: c_int = 10;
28pub const _PC_PRIO_IO: c_int = 11;
29pub const _PC_SOCK_MAXBUF: c_int = 12;
30pub const _PC_FILESIZEBITS: c_int = 13;
31pub const _PC_REC_INCR_XFER_SIZE: c_int = 14;
32pub const _PC_REC_MAX_XFER_SIZE: c_int = 15;
33pub const _PC_REC_MIN_XFER_SIZE: c_int = 16;
34pub const _PC_REC_XFER_ALIGN: c_int = 17;
35pub const _PC_ALLOC_SIZE_MIN: c_int = 18;
36pub const _PC_SYMLINK_MAX: c_int = 19;
37pub const _PC_2_SYMLINKS: c_int = 20;
38
39fn pc(name: c_int) -> c_long {
40    // Settings from musl, some adjusted
41    match name {
42        _PC_LINK_MAX => LINK_MAX,
43        _PC_MAX_CANON => MAX_CANON,
44        _PC_MAX_INPUT => MAX_INPUT,
45        _PC_NAME_MAX => NAME_MAX.try_into().unwrap_or(-1),
46        _PC_PATH_MAX => PATH_MAX.try_into().unwrap_or(-1),
47        _PC_PIPE_BUF => PIPE_BUF,
48        _PC_CHOWN_RESTRICTED => 1,
49        _PC_NO_TRUNC => 1,
50        _PC_VDISABLE => _POSIX_VDISABLE.into(),
51        _PC_SYNC_IO => 1,
52        _PC_ASYNC_IO => -1,
53        _PC_PRIO_IO => -1,
54        _PC_SOCK_MAXBUF => -1,
55        _PC_FILESIZEBITS => FILESIZEBITS,
56        _PC_REC_INCR_XFER_SIZE => -1,
57        _PC_REC_MAX_XFER_SIZE => -1,
58        _PC_REC_MIN_XFER_SIZE => 4096,
59        _PC_REC_XFER_ALIGN => 4096,
60        _PC_ALLOC_SIZE_MIN => POSIX_ALLOC_SIZE_MIN,
61        _PC_SYMLINK_MAX => SYMLINK_MAX,
62        _PC_2_SYMLINKS => 1,
63        _ => {
64            platform::ERRNO.set(errno::EINVAL);
65            -1
66        }
67    }
68}
69
70/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fpathconf.html>.
71#[unsafe(no_mangle)]
72pub extern "C" fn fpathconf(_fildes: c_int, name: c_int) -> c_long {
73    pc(name)
74}
75
76/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fpathconf.html>.
77#[unsafe(no_mangle)]
78pub extern "C" fn pathconf(_path: *const c_char, name: c_int) -> c_long {
79    pc(name)
80}