8000 posix.sysconf · RustPython/RustPython@fe06583 · GitHub
[go: up one dir, main page]

Skip to content

Commit fe06583

Browse files
committed
posix.sysconf
1 parent 3e3c69b commit fe06583

File tree

1 file changed

+200
-4
lines changed

1 file changed

+200
-4
lines changed

vm/src/stdlib/posix.rs

Lines changed: 200 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1816,9 +1816,9 @@ pub mod module {
18161816
}
18171817
}
18181818

1819-
struct PathConfName(i32);
1819+
struct PathconfName(i32);
18201820

1821-
impl TryFromObject for PathConfName {
1821+
impl TryFromObject for PathconfName {
18221822
fn try_from_object(vm: &VirtualMachine, obj: PyObjectRef) -> PyResult<Self> {
18231823
let i = match obj.downcast::<PyInt>() {
18241824
Ok(int) => int.try_to_primitive(vm)?,
@@ -2004,7 +2004,7 @@ pub mod module {
20042004
#[pyfunction]
20052005
fn pathconf(
20062006
path: OsPathOrFd,
2007-
PathConfName(name): PathConfName,
2007+
PathconfName(name): PathconfName,
20082008
vm: &VirtualMachine,
20092009
) -> PyResult<Option<libc::c_long>> {
20102010
use nix::errno::{self, Errno};
@@ -2037,7 +2037,7 @@ pub mod module {
20372037
#[pyfunction]
20382038
fn fpathconf(
20392039
fd: i32,
2040-
name: PathConfName,
2040+
name: PathconfName,
20412041
vm: &VirtualMachine,
20422042
) -> PyResult<Option<libc::c_long>> {
20432043
pathconf(OsPathOrFd::Fd(fd), name, vm)
@@ -2059,6 +2059,202 @@ pub mod module {
20592059
pathname
20602060
}
20612061

2062+
#[cfg(not(target_os = "redox"))]
2063+
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, EnumIter, EnumString)]
2064+
#[repr(i32)]
2065+
#[allow(non_camel_case_types)]
2066+
pub enum SysconfVar {
2067+
SC_2_CHAR_TERM = libc::_SC_2_CHAR_TERM,
2068+
SC_2_C_BIND = libc::_SC_2_C_BIND,
2069+
SC_2_C_DEV = libc::_SC_2_C_DEV,
2070+
SC_2_FORT_DEV = libc::_SC_2_FORT_DEV,
2071+
SC_2_FORT_RUN = libc::_SC_2_FORT_RUN,
2072+
SC_2_LOCALEDEF = libc::_SC_2_LOCALEDEF,
2073+
SC_2_SW_DEV = libc::_SC_2_SW_DEV,
2074+
SC_2_UPE = libc::_SC_2_UPE,
2075+
SC_2_VERSION = libc::_SC_2_VERSION,
2076+
SC_AIO_LISTIO_MAX = libc::_SC_AIO_LISTIO_MAX,
2077+
SC_AIO_MAX = libc::_SC_AIO_MAX,
2078+
SC_AIO_PRIO_DELTA_MAX = libc::_SC_AIO_PRIO_DELTA_MAX,
2079+
SC_ARG_MAX = libc::_SC_ARG_MAX,
2080+
SC_ASYNCHRONOUS_IO = libc::_SC_ASYNCHRONOUS_IO,
2081+
SC_ATEXIT_MAX = libc::_SC_ATEXIT_MAX,
2082+
SC_BC_BASE_MAX = libc::_SC_BC_BASE_MAX,
2083+
SC_BC_DIM_MAX = libc::_SC_BC_DIM_MAX,
2084+
SC_BC_SCALE_MAX = libc::_SC_BC_SCALE_MAX,
2085+
SC_BC_STRING_MAX = libc::_SC_BC_STRING_MAX,
2086+
SC_CHILD_MAX = libc::_SC_CHILD_MAX,
2087+
SC_CLK_TCK = libc::_SC_CLK_TCK,
2088+
SC_COLL_WEIGHTS_MAX = libc::_SC_COLL_WEIGHTS_MAX,
2089+
SC_DELAYTIMER_MAX = libc::_SC_DELAYTIMER_MAX,
2090+
SC_EXPR_NEST_MAX = libc::_SC_EXPR_NEST_MAX,
2091+
SC_FSYNC = libc::_SC_FSYNC,
2092+
SC_GETGR_R_SIZE_MAX = libc::_SC_GETGR_R_SIZE_MAX,
2093+
SC_GETPW_R_SIZE_MAX = libc::_SC_GETPW_R_SIZE_MAX,
2094+
SC_IOV_MAX = libc::_SC_IOV_MAX,
2095+
SC_JOB_CONTROL = libc::_SC_JOB_CONTROL,
2096+
SC_LINE_MAX = libc::_SC_LINE_MAX,
2097+
SC_LOGIN_NAME_MAX = libc::_SC_LOGIN_NAME_MAX,
2098+
SC_MAPPED_FILES = libc::_SC_MAPPED_FILES,
2099+
SC_MEMLOCK = libc::_SC_MEMLOCK,
2100+
SC_MEMLOCK_RANGE = libc::_SC_MEMLOCK_RANGE,
2101+
SC_MEMORY_PROTECTION = libc::_SC_MEMORY_PROTECTION,
2102+
SC_MESSAGE_PASSING = libc::_SC_MESSAGE_PASSING,
2103+
SC_MQ_OPEN_MAX = libc::_SC_MQ_OPEN_MAX,
2104+
SC_MQ_PRIO_MAX = libc::_SC_MQ_PRIO_MAX,
2105+
SC_NGROUPS_MAX = libc::_SC_NGROUPS_MAX,
2106+
SC_NPROCESSORS_CONF = libc::_SC_NPROCESSORS_CONF,
2107+
SC_NPROCESSORS_ONLN = libc::_SC_NPROCESSORS_ONLN,
2108+
SC_OPEN_MAX = libc::_SC_OPEN_MAX,
2109+
SC_PAGE_SIZE = libc::_SC_PAGE_SIZE,
2110+
#[cfg(any(
2111+
target_os = "linux",
2112+
target_vendor = "apple",
2113+
target_os = "netbsd",
2114+
target_os = "fuchsia"
2115+
))]
2116+
SC_PASS_MAX = libc::_SC_PASS_MAX,
2117+
SC_PHYS_PAGES = libc::_SC_PHYS_PAGES,
2118+
SC_PRIORITIZED_IO = libc::_SC_PRIORITIZED_IO,
2119+
SC_PRIORITY_SCHEDULING = libc::_SC_PRIORITY_SCHEDULING,
2120+
SC_REALTIME_SIGNALS = libc::_SC_REALTIME_SIGNALS,
2121+
SC_RE_DUP_MAX = libc::_SC_RE_DUP_MAX,
2122+
SC_RTSIG_MAX = libc::_SC_RTSIG_MAX,
2123+
SC_SAVED_IDS = libc::_SC_SAVED_IDS,
2124+
SC_SEMAPHORES = libc::_SC_SEMAPHORES,
2125+
SC_SEM_NSEMS_MAX = libc::_SC_SEM_NSEMS_MAX,
2126+
SC_SEM_VALUE_MAX = libc::_SC_SEM_VALUE_MAX,
2127+
SC_SHARED_MEMORY_OBJECTS = libc::_SC_SHARED_MEMORY_OBJECTS,
2128+
SC_SIGQUEUE_MAX = libc::_SC_SIGQUEUE_MAX,
2129+
SC_STREAM_MAX = libc::_SC_STREAM_MAX,
2130+
SC_SYNCHRONIZED_IO = libc::_SC_SYNCHRONIZED_IO,
2131+
SC_THREADS = libc::_SC_THREADS,
2132+
SC_THREAD_ATTR_STACKADDR = libc::_SC_THREAD_ATTR_STACKADDR,
2133+
SC_THREAD_ATTR_STACKSIZE = libc::_SC_THREAD_ATTR_STACKSIZE,
2134+
SC_THREAD_DESTRUCTOR_ITERATIONS = libc::_SC_THREAD_DESTRUCTOR_ITERATIONS,
2135+
SC_THREAD_KEYS_MAX = libc::_SC_THREAD_KEYS_MAX,
2136+
SC_THREAD_PRIORITY_SCHEDULING = libc::_SC_THREAD_PRIORITY_SCHEDULING,
2137+
SC_THREAD_PRIO_INHERIT = libc::_SC_THREAD_PRIO_INHERIT,
2138+
SC_THREAD_PRIO_PROTECT = libc::_SC_THREAD_PRIO_PROTECT,
2139+
SC_THREAD_PROCESS_SHARED = libc::_SC_THREAD_PROCESS_SHARED,
2140+
SC_THREAD_SAFE_FUNCTIONS = libc::_SC_THREAD_SAFE_FUNCTIONS,
2141+
SC_THREAD_STACK_MIN = libc::_SC_THREAD_STACK_MIN,
2142+
SC_THREAD_THREADS_MAX = libc::_SC_THREAD_THREADS_MAX,
2143+
SC_TIMERS = libc::_SC_TIMERS,
2144+
SC_TIMER_MAX = libc::_SC_TIMER_MAX,
2145+
SC_TTY_NAME_MAX = libc::_SC_TTY_NAME_MAX,
2146+
SC_TZNAME_MAX = libc::_SC_TZNAME_MAX,
2147+
SC_VERSION = libc::_SC_VERSION,
2148+
SC_XOPEN_CRYPT = libc::_SC_XOPEN_CRYPT,
2149+
SC_XOPEN_ENH_I18N = libc::_SC_XOPEN_ENH_I18N,
2150+
SC_XOPEN_LEGACY = libc::_SC_XOPEN_LEGACY,
2151+
SC_XOPEN_REALTIME = libc::_SC_XOPEN_REALTIME,
2152+
SC_XOPEN_REALTIME_THREADS = libc::_SC_XOPEN_REALTIME_THREADS,
2153+
SC_XOPEN_SHM = libc::_SC_XOPEN_SHM,
2154+
SC_XOPEN_UNIX = libc::_SC_XOPEN_UNIX,
2155+
SC_XOPEN_VERSION = libc::_SC_XOPEN_VERSION,
2156+
SC_XOPEN_XCU_VERSION = libc::_SC_XOPEN_XCU_VERSION,
2157+
#[cfg(any(
2158+
target_os = "linux",
2159+
target_vendor = "apple",
2160+
target_os = "netbsd",
2161+
target_os = "fuchsia"
2162+
))]
2163+
SC_XBS5_ILP32_OFF32 = libc::_SC_XBS5_ILP32_OFF32,
2164+
#[cfg(any(
2165+
target_os = "linux",
2166+
target_vendor = "apple",
2167+
target_os = "netbsd",
2168+
target_os = "fuchsia"
2169+
))]
2170+
SC_XBS5_ILP32_OFFBIG = libc::_SC_XBS5_ILP32_OFFBIG,
2171+
#[cfg(any(
2172+
target_os = "linux",
2173+
target_vendor = "apple",
2174+
target_os = "netbsd",
2175+
target_os = "fuchsia"
2176+
))]
2177+
SC_XBS5_LP64_OFF64 = libc::_SC_XBS5_LP64_OFF64,
2178+
#[cfg(any(
2179+
target_os = "linux",
2180+
target_vendor = "apple",
2181+
target_os = "netbsd",
2182+
target_os = "fuchsia"
2183+
))]
2184+
SC_XBS5_LPBIG_OFFBIG = libc::_SC_XBS5_LPBIG_OFFBIG,
2185+
}
2186+
2187+
#[cfg(target_os = "redox")]
2188+
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, EnumIter, EnumString)]
2189+
#[repr(i32)]
2190+
#[allow(non_camel_case_types)]
2191+
pub enum SysconfVar {
2192+
SC_ARG_MAX = libc::_SC_ARG_MAX,
2193+
SC_CHILD_MAX = libc::_SC_CHILD_MAX,
2194+
SC_CLK_TCK = libc::_SC_CLK_TCK,
2195+
SC_NGROUPS_MAX = libc::_SC_NGROUPS_MAX,
2196+
SC_OPEN_MAX = libc::_SC_OPEN_MAX,
2197+
SC_STREAM_MAX = libc::_SC_STREAM_MAX,
2198+
SC_TZNAME_MAX = libc::_SC_TZNAME_MAX,
2199+
SC_VERSION = libc::_SC_VERSION,
2200+
SC_PAGE_SIZE = libc::_SC_PAGE_SIZE,
2201+
SC_RE_DUP_MAX = libc::_SC_RE_DUP_MAX,
2202+
SC_LOGIN_NAME_MAX = libc::_SC_LOGIN_NAME_MAX,
2203+
SC_TTY_NAME_MAX = libc::_SC_TTY_NAME_MAX,
2204+
SC_SYMLOOP_MAX = libc::_SC_SYMLOOP_MAX,
2205+
SC_HOST_NAME_MAX = libc::_SC_HOST_NAME_MAX,
2206+
}
2207+
2208+
impl SysconfVar {
2209+
pub const SC_PAGESIZE: SysconfVar = Self::SC_PAGE_SIZE;
2210+
}
2211+
2212+
struct SysconfName(i32);
2213+
2214+
impl TryFromObject for SysconfName {
2215+
fn try_from_object(vm: &VirtualMachine, obj: PyObjectRef) -> PyResult<Self> {
2216+
let i = match obj.downcast::<PyInt>() {
2217+
Ok(int) => int.try_to_primitive(vm)?,
2218+
Err(obj) => {
2219+
let s = PyStrRef::try_from_object(vm, obj)?;
2220+
s.as_str().parse::<SysconfVar>().or_else(|_| {
2221+
if s.as_str() == "SC_PAGESIZE" {
2222+
Ok(SysconfVar::SC_PAGESIZE)
2223+
} else {
2224+
Err(vm.new_value_error("unrecognized configuration name".to_string()))
2225+
}
2226+
})? as i32
2227+
}
2228+
};
2229+
Ok(Self(i))
2230+
}
2231+
}
2232+
2233+
#[pyfunction]
2234+
fn sysconf(name: SysconfName, vm: &VirtualMachine) -> PyResult<libc::c_long> {
2235+
let r = unsafe { libc::sysconf(name.0) };
2236+
if r == -1 {
2237+
return Err(errno_err(vm));
2238+
}
2239+
Ok(r)
2240+
}
2241+
2242+
#[pyattr]
2243+
fn sysconf_names(vm: &VirtualMachine) -> PyDictRef {
2244+
use strum::IntoEnumIterator;
2245+
let names = vm.ctx.new_dict();
2246+
for variant in SysconfVar::iter() {
2247+
// get the name of variant as a string to use as the dictionary key
2248+
let key = vm.ctx.new_str(format!("{:?}", variant));
2249+
// get the enum from the string and convert it to an integer for the dictionary value
2250+
let value = vm.ctx.new_int(variant as u8);
2251+
names
2252+
.set_item(&*key, value.into(), vm)
2253+
.expect("dict set_item unexpectedly failed");
2254+
}
2255+
names
2256+
}
2257+
20622258
#[cfg(any(target_os = "linux", target_os = "macos"))]
20632259
#[derive(FromArgs)]
20642260
struct SendFileArgs<'fd> {

0 commit comments

Comments
 (0)
0