Skip to main content

relibc/header/limits/
mod.rs

1//! `limits.h` implementation.
2//!
3//! See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/limits.h.html>.
4
5use crate::platform::types::{
6    c_char, c_int, c_long, c_longlong, c_schar, c_short, c_uchar, c_uint, c_ulong, c_ulonglong,
7    c_ushort, ssize_t,
8};
9
10pub use crate::header::bits_limits_ptdi::{
11    _POSIX_THREAD_DESTRUCTOR_ITERATIONS, PTHREAD_DESTRUCTOR_ITERATIONS,
12};
13
14/// Maximum number of bytes in a filename (not including the terminating null
15/// of a filename string).
16pub const NAME_MAX: usize = 255;
17pub const PASS_MAX: usize = 128;
18/// Maximum number of bytes the implementation stores as a pathname in a
19/// user-supplied buffer of unspecified size, including the terminating null
20/// character.
21pub const PATH_MAX: usize = 4096;
22/// Maximum number of simultaneous supplementary group IDs per process.
23pub const NGROUPS_MAX: usize = 65536;
24/// Maximum number of `iovec` structures that one process has available for
25/// use with `readv()` or `writev()`.
26pub const IOV_MAX: c_int = 1024;
27
28/// Minimum required value for `IOV_MAX`.
29pub const _XOPEN_IOV_MAX: c_int = 16;
30/// Minimum required value for `NAME_MAX`.
31pub const _XOPEN_NAME_MAX: c_long = 255;
32/// Minimum required value for `PATH_MAX`.
33pub const _XOPEN_PATH_MAX: c_long = 1024;
34
35pub const CHAR_BIT: u32 = 8;
36pub const WORD_BIT: u32 = 32;
37#[cfg(target_pointer_width = "32")]
38pub const LONG_BIT: u32 = 32;
39#[cfg(target_pointer_width = "64")]
40pub const LONG_BIT: u32 = 64;
41
42#[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))]
43pub const CHAR_MAX: c_char = 0xFF;
44#[cfg(not(any(target_arch = "aarch64", target_arch = "riscv64")))]
45pub const CHAR_MAX: c_char = 0x7F;
46pub const SCHAR_MAX: c_schar = 0x7F;
47pub const SHRT_MAX: c_short = 0x7FFF;
48pub const INT_MAX: c_int = 0x7FFF_FFFF;
49#[cfg(target_pointer_width = "32")]
50pub const LONG_MAX: c_long = 0x7FFF_FFFF;
51#[cfg(target_pointer_width = "64")]
52pub const LONG_MAX: c_long = 0x7FFF_FFFF_FFFF_FFFF;
53pub const LLONG_MAX: c_longlong = 0x7FFF_FFFF_FFFF_FFFF;
54#[cfg(target_pointer_width = "32")]
55pub const SSIZE_MAX: ssize_t = 0x7FFF_FFFF;
56#[cfg(target_pointer_width = "64")]
57pub const SSIZE_MAX: ssize_t = 0x7FFF_FFFF_FFFF_FFFF;
58pub const UCHAR_MAX: c_uchar = 0xFF;
59pub const USHRT_MAX: c_ushort = 0xFFFF;
60pub const UINT_MAX: c_uint = 0xFFFFFFFF;
61
62#[cfg(target_pointer_width = "32")]
63pub const ULONG_MAX: c_ulong = 0xFFFF_FFFF;
64#[cfg(target_pointer_width = "64")]
65pub const ULONG_MAX: c_ulong = 0xFFFF_FFFF_FFFF_FFFF;
66pub const ULLONG_MAX: c_ulonglong = 0xFFFF_FFFF_FFFF_FFFF;
67
68#[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))]
69pub const CHAR_MIN: c_char = 0;
70#[cfg(not(any(target_arch = "aarch64", target_arch = "riscv64")))]
71pub const CHAR_MIN: c_char = -0x80;
72pub const SCHAR_MIN: c_schar = -SCHAR_MAX - 1;
73pub const SHRT_MIN: c_short = -SHRT_MAX - 1;
74pub const INT_MIN: c_int = -INT_MAX - 1;
75pub const LONG_MIN: c_long = -LONG_MAX - 1;
76pub const LLONG_MIN: c_longlong = -LLONG_MAX - 1;
77
78// TODO: 4096 for most architectures as determined by a quick grep of musl's source; need a better
79// way to determine it for other archs or to hard code a value.
80#[cfg(target_os = "linux")]
81pub const PAGE_SIZE: usize = 4096;
82
83// These POSIX symbols must have these values regardless of OS
84pub const _POSIX_AIO_LISTIO_MAX: c_long = 2;
85pub const _POSIX_AIO_MAX: c_long = 1;
86pub const _POSIX_ARG_MAX: c_long = 4096;
87pub const _POSIX_CHILD_MAX: c_long = 25;
88pub const _POSIX_CLOCKRES_MIN: c_long = 20000000;
89pub const _POSIX_DELAYTIMER_MAX: c_long = 32;
90pub const _POSIX_HOST_NAME_MAX: c_long = 255;
91pub const _POSIX_LINK_MAX: c_long = 8;
92pub const _POSIX_LOGIN_NAME_MAX: c_long = 9;
93pub const _POSIX_MAX_CANON: c_long = 255;
94pub const _POSIX_MAX_INPUT: c_long = 255;
95pub const _POSIX_NAME_MAX: c_long = 14;
96pub const _POSIX_NGROUPS_MAX: c_long = 8;
97pub const _POSIX_OPEN_MAX: c_long = 20;
98pub const _POSIX_PATH_MAX: c_long = 256;
99pub const _POSIX_PIPE_BUF: c_long = 512;
100pub const _POSIX_RE_DUP_MAX: c_long = 255;
101pub const _POSIX_RTSIG_MAX: c_long = 8;
102pub const _POSIX_SEM_NSEMS_MAX: c_long = 256;
103pub const _POSIX_SEM_VALUE_MAX: c_long = 32767;
104pub const _POSIX_SIGQUEUE_MAX: c_long = 32;
105pub const _POSIX_SSIZE_MAX: c_long = 32767;
106pub const _POSIX_STREAM_MAX: c_long = 8;
107pub const _POSIX_SYMLINK_MAX: c_long = 255;
108/// Minimum required value for `SYMLOOP_MAX`.
109pub const _POSIX_SYMLOOP_MAX: c_long = 8;
110// _POSIX_THREAD_DESTRUCTOR_ITERATIONS defined in bits file
111pub const _POSIX_THREAD_KEYS_MAX: c_long = 128;
112pub const _POSIX_THREAD_THREADS_MAX: c_long = 64;
113pub const _POSIX_TIMER_MAX: c_long = 32;
114pub const _POSIX_TTY_NAME_MAX: c_long = 9;
115pub const _POSIX_TZNAME_MAX: c_long = 6;
116
117pub const _POSIX2_BC_BASE_MAX: c_long = 99;
118pub const _POSIX2_BC_DIM_MAX: c_long = 2048;
119pub const _POSIX2_BC_SCALE_MAX: c_long = 99;
120pub const _POSIX2_BC_STRING_MAX: c_long = 1000;
121pub const _POSIX2_CHARCLASS_NAME_MAX: c_long = 14;
122pub const _POSIX2_COLL_WEIGHTS_MAX: c_long = 2;
123pub const _POSIX2_EXPR_NEST_MAX: c_long = 32;
124pub const _POSIX2_LINE_MAX: c_long = 2048;
125pub const _POSIX2_RE_DUP_MAX: c_long = 255;
126
127// These symbols must be at least the POSIX values, and sysconf will return the actual value between
128// the posix minimum and this maximum.
129pub const BC_BASE_MAX: c_long = _POSIX2_BC_BASE_MAX;
130pub const BC_DIM_MAX: c_long = _POSIX2_BC_DIM_MAX;
131pub const BC_SCALE_MAX: c_long = _POSIX2_BC_SCALE_MAX;
132pub const BC_STRING_MAX: c_long = _POSIX2_BC_STRING_MAX;
133pub const CHARCLASS_NAME_MAX: c_long = _POSIX2_CHARCLASS_NAME_MAX;
134pub const COLL_WEIGHTS_MAX: c_long = _POSIX2_COLL_WEIGHTS_MAX;
135pub const EXPR_NEST_MAX: c_long = _POSIX2_EXPR_NEST_MAX;
136pub const LINE_MAX: c_long = _POSIX2_LINE_MAX;
137pub const RE_DUP_MAX: c_long = _POSIX2_RE_DUP_MAX;
138pub const HOST_NAME_MAX: c_long = _POSIX_HOST_NAME_MAX;
139pub const LOGIN_NAME_MAX: c_long = 255;
140pub const GETENTROPY_MAX: c_long = 256;
141pub const LINK_MAX: c_long = 127;
142pub const PIPE_BUF: c_long = 4096;
143pub const FILESIZEBITS: c_long = 64;
144pub const MAX_CANON: c_long = _POSIX_MAX_CANON;
145pub const MAX_INPUT: c_long = _POSIX_MAX_INPUT;
146pub const SYMLINK_MAX: c_long = _POSIX_SYMLINK_MAX;
147pub const POSIX_ALLOC_SIZE_MIN: c_long = 4096;
148
149// PTHREAD_DESTRUCTOR_ITERATIONS defined in bits file
150// TODO: What should this limit be? Both glibc and musl have it as 1024
151pub const PTHREAD_KEYS_MAX: c_long = 4096 * 32;
152pub const PTHREAD_STACK_MIN: c_long = 65536;
153/// Maximum number of symbolic links that can be reliably traversed in the
154/// resolution of a pathname in the absence of a loop.
155pub const SYMLOOP_MAX: c_long = 64;
156pub const TTY_NAME_MAX: c_long = 32; // "/scheme/pty/".len() + size of usize::MAX as string + 1