#![allow(unsafe_code)]
use crate::backend;
#[cfg(target_os = "linux")]
use crate::backend::c;
use crate::ffi::CStr;
#[cfg(not(any(target_os = "espidf", target_os = "emscripten", target_os = "vita")))]
use crate::io;
use core::fmt;
#[cfg(linux_kernel)]
pub use backend::system::types::Sysinfo;
#[cfg(linux_kernel)]
use crate::fd::AsFd;
#[cfg(linux_kernel)]
use crate::ffi::c_int;
#[doc(alias = "gethostname")]
#[inline]
pub fn uname() -> Uname {
Uname(backend::system::syscalls::uname())
}
#[doc(alias = "utsname")]
pub struct Uname(backend::system::types::RawUname);
impl Uname {
#[inline]
pub fn sysname(&self) -> &CStr {
Self::to_cstr(self.0.sysname.as_ptr().cast())
}
#[inline]
pub fn nodename(&self) -> &CStr {
Self::to_cstr(self.0.nodename.as_ptr().cast())
}
#[inline]
pub fn release(&self) -> &CStr {
Self::to_cstr(self.0.release.as_ptr().cast())
}
#[inline]
pub fn version(&self) -> &CStr {
Self::to_cstr(self.0.version.as_ptr().cast())
}
#[inline]
pub fn machine(&self) -> &CStr {
Self::to_cstr(self.0.machine.as_ptr().cast())
}
#[cfg(linux_kernel)]
#[inline]
pub fn domainname(&self) -> &CStr {
Self::to_cstr(self.0.domainname.as_ptr().cast())
}
#[inline]
fn to_cstr<'a>(ptr: *const u8) -> &'a CStr {
unsafe { CStr::from_ptr(ptr.cast()) }
}
}
impl fmt::Debug for Uname {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
#[cfg(not(linux_kernel))]
{
write!(
f,
"{:?} {:?} {:?} {:?} {:?}",
self.sysname(),
self.nodename(),
self.release(),
self.version(),
self.machine(),
)
}
#[cfg(linux_kernel)]
{
write!(
f,
"{:?} {:?} {:?} {:?} {:?} {:?}",
self.sysname(),
self.nodename(),
self.release(),
self.version(),
self.machine(),
self.domainname(),
)
}
}
}
#[cfg(linux_kernel)]
#[inline]
pub fn sysinfo() -> Sysinfo {
backend::system::syscalls::sysinfo()
}
#[cfg(not(any(
target_os = "emscripten",
target_os = "espidf",
target_os = "horizon",
target_os = "redox",
target_os = "vita",
target_os = "wasi"
)))]
#[inline]
pub fn sethostname(name: &[u8]) -> io::Result<()> {
backend::system::syscalls::sethostname(name)
}
#[cfg(not(any(
target_os = "cygwin",
target_os = "emscripten",
target_os = "espidf",
target_os = "haiku",
target_os = "horizon",
target_os = "illumos",
target_os = "redox",
target_os = "solaris",
target_os = "vita",
target_os = "wasi",
)))]
#[inline]
pub fn setdomainname(name: &[u8]) -> io::Result<()> {
backend::system::syscalls::setdomainname(name)
}
#[cfg(target_os = "linux")]
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
#[repr(i32)]
#[non_exhaustive]
pub enum RebootCommand {
CadOff = c::LINUX_REBOOT_CMD_CAD_OFF,
CadOn = c::LINUX_REBOOT_CMD_CAD_ON,
Halt = c::LINUX_REBOOT_CMD_HALT,
Kexec = c::LINUX_REBOOT_CMD_KEXEC,
PowerOff = c::LINUX_REBOOT_CMD_POWER_OFF,
Restart = c::LINUX_REBOOT_CMD_RESTART,
SwSuspend = c::LINUX_REBOOT_CMD_SW_SUSPEND,
}
#[cfg(target_os = "linux")]
pub fn reboot(cmd: RebootCommand) -> io::Result<()> {
backend::system::syscalls::reboot(cmd)
}
#[inline]
#[cfg(linux_kernel)]
pub fn init_module(image: &[u8], param_values: &CStr) -> io::Result<()> {
backend::system::syscalls::init_module(image, param_values)
}
#[inline]
#[cfg(linux_kernel)]
pub fn finit_module<Fd: AsFd>(fd: Fd, param_values: &CStr, flags: c_int) -> io::Result<()> {
backend::system::syscalls::finit_module(fd.as_fd(), param_values, flags)
}
#[inline]
#[cfg(linux_kernel)]
pub fn delete_module(name: &CStr, flags: c_int) -> io::Result<()> {
backend::system::syscalls::delete_module(name, flags)
}
#[cfg(test)]
mod tests {
#[allow(unused_imports)]
use super::*;
#[allow(unused_imports)]
use crate::backend::c;
#[cfg(linux_kernel)]
#[test]
fn test_sysinfo_layouts() {
assert_eq!(
core::mem::align_of::<Sysinfo>(),
core::mem::align_of::<c::sysinfo>()
);
check_renamed_struct_field!(Sysinfo, sysinfo, uptime);
check_renamed_struct_field!(Sysinfo, sysinfo, loads);
check_renamed_struct_field!(Sysinfo, sysinfo, totalram);
check_renamed_struct_field!(Sysinfo, sysinfo, freeram);
check_renamed_struct_field!(Sysinfo, sysinfo, sharedram);
check_renamed_struct_field!(Sysinfo, sysinfo, bufferram);
check_renamed_struct_field!(Sysinfo, sysinfo, totalswap);
check_renamed_struct_field!(Sysinfo, sysinfo, freeswap);
check_renamed_struct_field!(Sysinfo, sysinfo, procs);
check_renamed_struct_field!(Sysinfo, sysinfo, totalhigh);
check_renamed_struct_field!(Sysinfo, sysinfo, freehigh);
check_renamed_struct_field!(Sysinfo, sysinfo, mem_unit);
}
}