81 lines
1.9 KiB
Rust
81 lines
1.9 KiB
Rust
use core::{
|
|
ffi::{c_char, c_int},
|
|
ptr::NonNull,
|
|
};
|
|
|
|
use crate::{
|
|
env, error::{CIntZeroResult, CPtrResult, CResult, OptionExt}, headers::errno::Errno, process, util::PointerStrExt
|
|
};
|
|
|
|
#[no_mangle]
|
|
unsafe extern "C" fn _Exit(status: c_int) -> ! {
|
|
process::c_exit_immediately(status)
|
|
}
|
|
|
|
#[no_mangle]
|
|
unsafe extern "C" fn abort() -> ! {
|
|
process::abort()
|
|
}
|
|
|
|
#[no_mangle]
|
|
unsafe extern "C" fn atexit(f: extern "C" fn()) -> CIntZeroResult {
|
|
process::at_exit(f);
|
|
CIntZeroResult::SUCCESS
|
|
}
|
|
|
|
#[no_mangle]
|
|
unsafe extern "C" fn exit(status: c_int) -> ! {
|
|
process::c_exit(status)
|
|
}
|
|
|
|
#[no_mangle]
|
|
unsafe extern "C" fn getenv(name: *const c_char) -> CPtrResult<c_char> {
|
|
let name = name.ensure_cstr().to_bytes();
|
|
|
|
if let Some(value) = env::get_env(name)? {
|
|
CPtrResult::success(value)
|
|
} else {
|
|
CPtrResult::ERROR
|
|
}
|
|
}
|
|
|
|
#[no_mangle]
|
|
unsafe extern "C" fn putenv(value: *mut c_char) -> CIntZeroResult {
|
|
let value = NonNull::new(value).e_ok_or(Errno::EINVAL)?;
|
|
env::put_env(value)?;
|
|
CIntZeroResult::SUCCESS
|
|
}
|
|
|
|
#[no_mangle]
|
|
unsafe extern "C" fn setenv(
|
|
name: *const c_char,
|
|
value: *const c_char,
|
|
overwrite: c_int,
|
|
) -> CIntZeroResult {
|
|
let name = name.ensure_cstr().to_bytes();
|
|
let value = NonNull::new(value.cast_mut()).e_ok_or(Errno::EINVAL)?;
|
|
let overwrite = overwrite != 0;
|
|
env::set_env(name, value, overwrite)?;
|
|
CIntZeroResult::SUCCESS
|
|
}
|
|
|
|
// Deprecated
|
|
#[no_mangle]
|
|
unsafe extern "C" fn setkey(_key: *const c_char) {
|
|
unimplemented!()
|
|
}
|
|
|
|
#[no_mangle]
|
|
unsafe extern "C" fn system(command: *const c_char) -> CIntZeroResult {
|
|
let command = command.ensure_str();
|
|
log::warn!("system({command:?})");
|
|
CIntZeroResult::ERROR
|
|
}
|
|
|
|
#[no_mangle]
|
|
unsafe extern "C" fn unsetenv(name: *const c_char) -> CIntZeroResult {
|
|
let name = name.ensure_cstr().to_bytes();
|
|
env::remove_env(name)?;
|
|
CIntZeroResult::SUCCESS
|
|
}
|