#![allow(unsafe_code)]
use crate::ffi::ZStr;
use crate::path::Arg;
use crate::process::Pid;
use crate::{imp, io};
use alloc::borrow::Cow;
use alloc::vec::Vec;
use core::ffi::c_void;
#[cfg(target_arch = "x86")]
#[inline]
pub unsafe fn set_thread_area(u_info: &mut UserDesc) -> io::Result<()> {
imp::syscalls::tls::set_thread_area(u_info)
}
#[cfg(target_arch = "arm")]
#[inline]
pub unsafe fn arm_set_tls(data: *mut c_void) -> io::Result<()> {
imp::syscalls::tls::arm_set_tls(data)
}
#[cfg(target_arch = "x86_64")]
#[inline]
pub unsafe fn set_fs(data: *mut c_void) {
imp::syscalls::tls::set_fs(data)
}
#[inline]
pub unsafe fn set_tid_address(data: *mut c_void) -> Pid {
imp::syscalls::tls::set_tid_address(data)
}
#[inline]
pub unsafe fn set_thread_name(name: &ZStr) -> io::Result<()> {
imp::syscalls::tls::set_thread_name(name)
}
#[cfg(target_arch = "x86")]
pub use imp::thread::tls::UserDesc;
#[inline]
pub unsafe fn exit_thread(status: i32) -> ! {
imp::syscalls::tls::exit_thread(status)
}
#[inline]
pub fn startup_tls_info() -> StartupTlsInfo {
imp::thread::tls::startup_tls_info()
}
#[cfg(any(linux_raw, all(libc, any(target_os = "android", target_os = "linux"))))]
#[inline]
pub fn exe_phdrs() -> (*const c_void, usize) {
imp::process::exe_phdrs()
}
pub use imp::thread::tls::StartupTlsInfo;
pub unsafe fn fork() -> io::Result<Pid> {
imp::syscalls::fork()
}
pub fn execve<P: Arg, A: Arg, E: Arg>(path: P, args: &[A], env_vars: &[E]) -> io::Result<()> {
let arg_vec: Vec<Cow<'_, ZStr>> = args
.iter()
.map(Arg::as_cow_z_str)
.collect::<io::Result<_>>()?;
let env_vec: Vec<Cow<'_, ZStr>> = env_vars
.iter()
.map(Arg::as_cow_z_str)
.collect::<io::Result<_>>()?;
path.into_with_z_str(|path_cstr| imp::syscalls::execve(path_cstr, &arg_vec, &env_vec))
}