use std::{mem::MaybeUninit, process::ExitCode};
use nix::errno::Errno;
use serde_json::json;
use syd::printfln;
#[cfg(all(
not(target_os = "android"),
not(target_arch = "loongarch64"),
not(target_arch = "riscv64"),
target_page_size_4k,
target_pointer_width = "64"
))]
#[global_allocator]
static GLOBAL: hardened_malloc::HardenedMalloc = hardened_malloc::HardenedMalloc;
syd::main! {
use lexopt::prelude::*;
syd::set_sigpipe_dfl()?;
let mut parser = lexopt::Parser::from_env();
#[expect(clippy::never_loop)]
while let Some(arg) = parser.next()? {
match arg {
Short('h') => {
help()?;
return Ok(ExitCode::SUCCESS);
}
_ => return Err(arg.unexpected().into()),
}
}
let mut info = MaybeUninit::<libc::sysinfo>::uninit();
Errno::result(unsafe { libc::sysinfo(info.as_mut_ptr()) })?;
let info = unsafe { info.assume_init() };
#[expect(clippy::disallowed_methods, clippy::disallowed_types)]
let info = json!({
"uptime": info.uptime,
"loads": info.loads,
"totalram": info.totalram,
"freeram": info.freeram,
"sharedram": info.sharedram,
"bufferram": info.bufferram,
"totalswap": info.totalswap,
"freeswap": info.freeswap,
"procs": info.procs,
"totalhigh": info.totalhigh,
"freehigh": info.freehigh,
"mem_unit": info.mem_unit,
});
let info = serde_json::to_string_pretty(&info).or(Err(Errno::EINVAL))?;
printfln!("{info}")?;
Ok(ExitCode::SUCCESS)
}
fn help() -> Result<(), Errno> {
printfln!("Usage: syd-info [-h]")?;
printfln!("Print system information.")?;
Ok(())
}