Files
RedBear-OS/src/header/unistd/sysconf/linux.rs
T
2026-06-10 12:03:15 +01:00

336 lines
11 KiB
Rust

/// Linux sysconf implementation.
/// Constants borrowed from musl.
use core::{
ffi::{c_int, c_long},
mem::size_of,
};
use crate::{
header::{errno, limits::*, signal, unistd::sysconf::constants::*},
platform,
};
pub const _XOPEN_IOV_MAX: c_long = 16;
pub const _XOPEN_NAME_MAX: c_long = 255;
pub const _XOPEN_PATH_MAX: c_long = 1024;
pub const _SC_JOB_CONTROL: c_int = 7;
pub const _SC_SAVED_IDS: c_int = 8;
pub const _SC_PRIORITY_SCHEDULING: c_int = 10;
pub const _SC_ASYNCHRONOUS_IO: c_int = 12;
pub const _SC_PRIORITIZED_IO: c_int = 13;
pub const _SC_SYNCHRONIZED_IO: c_int = 14;
pub const _SC_FSYNC: c_int = 15;
pub const _SC_MAPPED_FILES: c_int = 16;
pub const _SC_MEMLOCK: c_int = 17;
pub const _SC_MEMLOCK_RANGE: c_int = 18;
pub const _SC_MEMORY_PROTECTION: c_int = 19;
pub const _SC_MESSAGE_PASSING: c_int = 20;
pub const _SC_AIO_LISTIO_MAX: c_int = 23;
pub const _SC_AIO_MAX: c_int = 24;
pub const _SC_AIO_PRIO_DELTA_MAX: c_int = 25;
pub const _SC_DELAYTIMER_MAX: c_int = 26;
pub const _SC_MQ_OPEN_MAX: c_int = 27;
pub const _SC_MQ_PRIO_MAX: c_int = 28;
pub const _SC_RTSIG_MAX: c_int = 31;
pub const _SC_SEM_NSEMS_MAX: c_int = 32;
pub const _SC_SEM_VALUE_MAX: c_int = 33;
pub const _SC_TIMER_MAX: c_int = 35;
pub const _SC_BC_BASE_MAX: c_int = 36;
pub const _SC_BC_DIM_MAX: c_int = 37;
pub const _SC_BC_SCALE_MAX: c_int = 38;
pub const _SC_BC_STRING_MAX: c_int = 39;
pub const _SC_COLL_WEIGHTS_MAX: c_int = 40;
pub const _SC_EXPR_NEST_MAX: c_int = 42;
pub const _SC_LINE_MAX: c_int = 43;
pub const _SC_2_VERSION: c_int = 46;
pub const _SC_2_C_BIND: c_int = 47;
pub const _SC_2_C_DEV: c_int = 48;
pub const _SC_2_FORT_DEV: c_int = 49;
pub const _SC_2_FORT_RUN: c_int = 50;
pub const _SC_2_SW_DEV: c_int = 51;
pub const _SC_2_LOCALEDEF: c_int = 52;
pub const _SC_UIO_MAXIOV: c_int = 60;
pub const _SC_IOV_MAX: c_int = 60;
pub const _SC_THREAD_SAFE_FUNCTIONS: c_int = 68;
pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: c_int = 73;
pub const _SC_THREAD_KEYS_MAX: c_int = 74;
pub const _SC_THREAD_STACK_MIN: c_int = 75;
pub const _SC_THREAD_THREADS_MAX: c_int = 76;
pub const _SC_THREAD_PRIORITY_SCHEDULING: c_int = 79;
pub const _SC_THREAD_PRIO_INHERIT: c_int = 80;
pub const _SC_THREAD_PRIO_PROTECT: c_int = 81;
pub const _SC_THREAD_PROCESS_SHARED: c_int = 82;
pub const _SC_ATEXIT_MAX: c_int = 87;
pub const _SC_PASS_MAX: c_int = 88;
pub const _SC_XOPEN_VERSION: c_int = 89;
pub const _SC_XOPEN_XCU_VERSION: c_int = 90;
pub const _SC_XOPEN_UNIX: c_int = 91;
pub const _SC_XOPEN_CRYPT: c_int = 92;
pub const _SC_XOPEN_ENH_I18N: c_int = 93;
pub const _SC_XOPEN_SHM: c_int = 94;
pub const _SC_2_CHAR_TERM: c_int = 95;
pub const _SC_2_UPE: c_int = 97;
pub const _SC_XOPEN_XPG2: c_int = 98;
pub const _SC_XOPEN_XPG3: c_int = 99;
pub const _SC_XOPEN_XPG4: c_int = 100;
pub const _SC_NZERO: c_int = 109;
pub const _SC_XBS5_ILP32_OFF32: c_int = 125;
pub const _SC_XBS5_ILP32_OFFBIG: c_int = 126;
pub const _SC_XBS5_LP64_OFF64: c_int = 127;
pub const _SC_XBS5_LPBIG_OFFBIG: c_int = 128;
pub const _SC_XOPEN_LEGACY: c_int = 129;
pub const _SC_XOPEN_REALTIME: c_int = 130;
pub const _SC_XOPEN_REALTIME_THREADS: c_int = 131;
pub const _SC_ADVISORY_INFO: c_int = 132;
pub const _SC_CLOCK_SELECTION: c_int = 137;
pub const _SC_CPUTIME: c_int = 138;
pub const _SC_THREAD_CPUTIME: c_int = 139;
pub const _SC_READER_WRITER_LOCKS: c_int = 153;
pub const _SC_SPIN_LOCKS: c_int = 154;
pub const _SC_REGEXP: c_int = 155;
pub const _SC_SPAWN: c_int = 159;
pub const _SC_SPORADIC_SERVER: c_int = 160;
pub const _SC_THREAD_SPORADIC_SERVER: c_int = 161;
pub const _SC_TYPED_MEMORY_OBJECTS: c_int = 165;
pub const _SC_2_PBS: c_int = 168;
pub const _SC_2_PBS_ACCOUNTING: c_int = 169;
pub const _SC_2_PBS_LOCATE: c_int = 170;
pub const _SC_2_PBS_MESSAGE: c_int = 171;
pub const _SC_2_PBS_TRACK: c_int = 172;
pub const _SC_STREAMS: c_int = 174;
pub const _SC_2_PBS_CHECKPOINT: c_int = 175;
pub const _SC_V6_ILP32_OFF32: c_int = 176;
pub const _SC_V6_ILP32_OFFBIG: c_int = 177;
pub const _SC_V6_LP64_OFF64: c_int = 178;
pub const _SC_V6_LPBIG_OFFBIG: c_int = 179;
pub const _SC_TRACE: c_int = 181;
pub const _SC_TRACE_EVENT_FILTER: c_int = 182;
pub const _SC_TRACE_INHERIT: c_int = 183;
pub const _SC_TRACE_LOG: c_int = 184;
pub const _SC_IPV6: c_int = 235;
pub const _SC_RAW_SOCKETS: c_int = 236;
pub const _SC_V7_ILP32_OFF32: c_int = 237;
pub const _SC_V7_ILP32_OFFBIG: c_int = 238;
pub const _SC_V7_LP64_OFF64: c_int = 239;
pub const _SC_V7_LPBIG_OFFBIG: c_int = 240;
pub const _SC_SS_REPL_MAX: c_int = 241;
pub const _SC_TRACE_EVENT_NAME_MAX: c_int = 242;
pub const _SC_TRACE_NAME_MAX: c_int = 243;
pub const _SC_TRACE_SYS_MAX: c_int = 244;
pub const _SC_TRACE_USER_EVENT_MAX: c_int = 245;
pub const _SC_XOPEN_STREAMS: c_int = 246;
pub const _SC_THREAD_ROBUST_PRIO_INHERIT: c_int = 247;
pub const _SC_THREAD_ROBUST_PRIO_PROTECT: c_int = 248;
pub const _SC_MINSIGSTKSZ: c_int = 249;
pub const _SC_SIGSTKSZ: c_int = 250;
// Defined in unistd.h but we defined it in C
const _POSIX_VERSION: c_long = 200809;
const _XOPEN_VERSION: c_long = 700;
pub(super) fn sysconf_impl(name: c_int) -> c_long {
// Values from musl which we can assume is correct.
match name {
_SC_CLK_TCK => 100,
// TODO: getrlimit
_SC_CHILD_MAX => -1,
_SC_NGROUPS_MAX => NGROUPS_MAX as c_long,
// TODO: getrlimit
_SC_OPEN_MAX => -1,
_SC_STREAM_MAX => -1,
// TODO: limits.h
_SC_TZNAME_MAX => -1,
_SC_JOB_CONTROL => 1,
_SC_SAVED_IDS => 1,
_SC_REALTIME_SIGNALS => _POSIX_VERSION,
_SC_PRIORITY_SCHEDULING => -1,
_SC_TIMERS => _POSIX_VERSION,
_SC_ASYNCHRONOUS_IO => _POSIX_VERSION,
_SC_PRIORITIZED_IO => -1,
_SC_SYNCHRONIZED_IO => -1,
_SC_FSYNC => _POSIX_VERSION,
_SC_MAPPED_FILES => _POSIX_VERSION,
_SC_MEMLOCK => _POSIX_VERSION,
_SC_MEMLOCK_RANGE => _POSIX_VERSION,
_SC_MEMORY_PROTECTION => _POSIX_VERSION,
_SC_MESSAGE_PASSING => _POSIX_VERSION,
_SC_SEMAPHORES => _POSIX_VERSION,
_SC_SHARED_MEMORY_OBJECTS => _POSIX_VERSION,
_SC_AIO_LISTIO_MAX => -1,
_SC_AIO_MAX => -1,
_SC_AIO_PRIO_DELTA_MAX => 0,
// TODO: limits.h?
_SC_DELAYTIMER_MAX => -1,
_SC_MQ_OPEN_MAX => -1,
// TODO: limits.h?
_SC_MQ_PRIO_MAX => -1,
_SC_VERSION => _POSIX_VERSION,
_SC_PAGE_SIZE => PAGE_SIZE.try_into().unwrap_or(-1),
_SC_RTSIG_MAX => (signal::SIGRTMAX - signal::SIGRTMIN)
.try_into()
.unwrap_or(-1),
// TODO: limits.h
_SC_SEM_NSEMS_MAX => -1,
// TODO: limits.h
_SC_SEM_VALUE_MAX => -1,
_SC_SIGQUEUE_MAX => -1,
_SC_TIMER_MAX => -1,
_SC_BC_BASE_MAX => BC_BASE_MAX,
_SC_BC_DIM_MAX => BC_DIM_MAX,
_SC_BC_SCALE_MAX => BC_SCALE_MAX,
_SC_BC_STRING_MAX => BC_STRING_MAX,
_SC_COLL_WEIGHTS_MAX => COLL_WEIGHTS_MAX,
_SC_EXPR_NEST_MAX => EXPR_NEST_MAX,
_SC_LINE_MAX => LINE_MAX,
_SC_RE_DUP_MAX => RE_DUP_MAX,
_SC_2_VERSION => _POSIX_VERSION,
_SC_2_C_BIND => _POSIX_VERSION,
_SC_2_C_DEV => -1,
_SC_2_FORT_DEV => -1,
_SC_2_FORT_RUN => -1,
_SC_2_SW_DEV => -1,
_SC_2_LOCALEDEF => -1,
_SC_IOV_MAX => _XOPEN_IOV_MAX,
_SC_THREADS => _POSIX_VERSION,
_SC_THREAD_SAFE_FUNCTIONS => _POSIX_VERSION,
_SC_GETGR_R_SIZE_MAX => -1,
_SC_GETPW_R_SIZE_MAX => -1,
_SC_LOGIN_NAME_MAX => 256,
// TODO: limits.h
_SC_TTY_NAME_MAX => -1,
// TODO: limits.h
_SC_THREAD_DESTRUCTOR_ITERATIONS => -1,
// TODO: limits.h
_SC_THREAD_KEYS_MAX => -1,
// TODO: limits.h
_SC_THREAD_STACK_MIN => -1,
_SC_THREAD_THREADS_MAX => -1,
_SC_THREAD_ATTR_STACKADDR => _POSIX_VERSION,
_SC_THREAD_ATTR_STACKSIZE => _POSIX_VERSION,
_SC_THREAD_PRIORITY_SCHEDULING => _POSIX_VERSION,
_SC_THREAD_PRIO_INHERIT => -1,
_SC_THREAD_PRIO_PROTECT => -1,
_SC_THREAD_PROCESS_SHARED => _POSIX_VERSION,
// TODO: Use getaffinity syscall on Linux
_SC_NPROCESSORS_CONF => -1,
_SC_NPROCESSORS_ONLN => -1,
// TODO: sysinfo
_SC_PHYS_PAGES => -1,
_SC_AVPHYS_PAGES => -1,
_SC_ATEXIT_MAX => -1,
_SC_PASS_MAX => -1,
_SC_XOPEN_VERSION => _XOPEN_VERSION,
_SC_XOPEN_XCU_VERSION => _XOPEN_VERSION,
_SC_XOPEN_UNIX => 1,
_SC_XOPEN_CRYPT => -1,
_SC_XOPEN_ENH_I18N => 1,
_SC_XOPEN_SHM => 1,
_SC_2_CHAR_TERM => -1,
_SC_2_UPE => -1,
_SC_XOPEN_XPG2 => -1,
_SC_XOPEN_XPG3 => -1,
_SC_XOPEN_XPG4 => -1,
// TODO: ?
_SC_NZERO => -1,
_SC_XBS5_ILP32_OFF32 => -1,
_SC_XBS5_ILP32_OFFBIG => {
if size_of::<c_long>() == 4 {
1
} else {
-1
}
}
_SC_XBS5_LP64_OFF64 => {
if size_of::<c_long>() == 8 {
1
} else {
-1
}
}
_SC_XBS5_LPBIG_OFFBIG => -1,
_SC_XOPEN_LEGACY => -1,
_SC_XOPEN_REALTIME => -1,
_SC_XOPEN_REALTIME_THREADS => -1,
_SC_ADVISORY_INFO => _POSIX_VERSION,
_SC_BARRIERS => _POSIX_VERSION,
_SC_CLOCK_SELECTION => _POSIX_VERSION,
_SC_CPUTIME => _POSIX_VERSION,
_SC_THREAD_CPUTIME => _POSIX_VERSION,
_SC_MONOTONIC_CLOCK => _POSIX_VERSION,
_SC_READER_WRITER_LOCKS => _POSIX_VERSION,
_SC_SPIN_LOCKS => _POSIX_VERSION,
_SC_REGEXP => 1,
_SC_SHELL => 1,
_SC_SPAWN => _POSIX_VERSION,
_SC_SPORADIC_SERVER => -1,
_SC_THREAD_SPORADIC_SERVER => -1,
_SC_TIMEOUTS => _POSIX_VERSION,
_SC_TYPED_MEMORY_OBJECTS => -1,
_SC_2_PBS => -1,
_SC_2_PBS_ACCOUNTING => -1,
_SC_2_PBS_LOCATE => -1,
_SC_2_PBS_MESSAGE => -1,
_SC_2_PBS_TRACK => -1,
// TODO: SYMLOOP_MAX in paths.h
_SC_SYMLOOP_MAX => -1,
_SC_STREAMS => 0,
_SC_2_PBS_CHECKPOINT => -1,
_SC_V6_ILP32_OFF32 => -1,
_SC_V6_ILP32_OFFBIG => {
if size_of::<c_long>() == 4 {
1
} else {
-1
}
}
_SC_V6_LP64_OFF64 => {
if size_of::<c_long>() == 8 {
1
} else {
-1
}
}
_SC_V6_LPBIG_OFFBIG => -1,
_SC_HOST_NAME_MAX => HOST_NAME_MAX,
_SC_TRACE => -1,
_SC_TRACE_EVENT_FILTER => -1,
_SC_TRACE_INHERIT => -1,
_SC_TRACE_LOG => -1,
_SC_IPV6 => _POSIX_VERSION,
_SC_RAW_SOCKETS => _POSIX_VERSION,
_SC_V7_ILP32_OFF32 => -1,
_SC_V7_ILP32_OFFBIG => {
if size_of::<c_long>() == 4 {
1
} else {
-1
}
}
_SC_V7_LP64_OFF64 => {
if size_of::<c_long>() == 8 {
1
} else {
-1
}
}
_SC_V7_LPBIG_OFFBIG => -1,
_SC_SS_REPL_MAX => -1,
_SC_TRACE_EVENT_NAME_MAX => -1,
_SC_TRACE_NAME_MAX => -1,
_SC_TRACE_SYS_MAX => -1,
_SC_TRACE_USER_EVENT_MAX => -1,
_SC_XOPEN_STREAMS => 0,
_SC_THREAD_ROBUST_PRIO_INHERIT => -1,
_SC_THREAD_ROBUST_PRIO_PROTECT => -1,
// TODO: Working getauxval
_SC_MINSIGSTKSZ => -1,
_SC_SIGSTKSZ => -1,
_ => {
platform::ERRNO.set(errno::EINVAL);
-1
}
}
}