microfetch-lib: use home-made syscall wrappers over libc::uname

Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: I162c771dce2714fa73db3e2e5dc8dcb36a6a6964
This commit is contained in:
raf 2026-03-25 17:02:26 +03:00
commit 99f7be5aac
Signed by: NotAShelf
GPG key ID: 29D95B64378DB4BF

View file

@ -5,42 +5,44 @@ pub mod syscall;
pub mod system; pub mod system;
pub mod uptime; pub mod uptime;
use std::mem::MaybeUninit; use std::{ffi::CStr, mem::MaybeUninit};
/// Wrapper for `libc::utsname` with safe accessor methods use crate::syscall::{UtsNameBuf, sys_uname};
pub struct UtsName(libc::utsname);
/// Wrapper for `utsname` with safe accessor methods
pub struct UtsName(UtsNameBuf);
impl UtsName { impl UtsName {
/// Calls `uname` syscall and returns a `UtsName` wrapper /// Calls `uname(2)` syscall and returns a `UtsName` wrapper
/// ///
/// # Errors /// # Errors
/// ///
/// Returns an error if the `uname` syscall fails /// Returns an error if the `uname` syscall fails
pub fn uname() -> Result<Self, std::io::Error> { pub fn uname() -> Result<Self, std::io::Error> {
let mut uts = MaybeUninit::uninit(); let mut uts = MaybeUninit::uninit();
if unsafe { libc::uname(uts.as_mut_ptr()) } != 0 { if unsafe { sys_uname(uts.as_mut_ptr()) } != 0 {
return Err(std::io::Error::last_os_error()); return Err(std::io::Error::last_os_error());
} }
Ok(Self(unsafe { uts.assume_init() })) Ok(Self(unsafe { uts.assume_init() }))
} }
#[must_use] #[must_use]
pub const fn nodename(&self) -> &std::ffi::CStr { pub const fn nodename(&self) -> &CStr {
unsafe { std::ffi::CStr::from_ptr(self.0.nodename.as_ptr()) } unsafe { CStr::from_ptr(self.0.nodename.as_ptr()) }
} }
#[must_use] #[must_use]
pub const fn sysname(&self) -> &std::ffi::CStr { pub const fn sysname(&self) -> &CStr {
unsafe { std::ffi::CStr::from_ptr(self.0.sysname.as_ptr()) } unsafe { CStr::from_ptr(self.0.sysname.as_ptr()) }
} }
#[must_use] #[must_use]
pub const fn release(&self) -> &std::ffi::CStr { pub const fn release(&self) -> &CStr {
unsafe { std::ffi::CStr::from_ptr(self.0.release.as_ptr()) } unsafe { CStr::from_ptr(self.0.release.as_ptr()) }
} }
#[must_use] #[must_use]
pub const fn machine(&self) -> &std::ffi::CStr { pub const fn machine(&self) -> &CStr {
unsafe { std::ffi::CStr::from_ptr(self.0.machine.as_ptr()) } unsafe { CStr::from_ptr(self.0.machine.as_ptr()) }
} }
} }