1 //! linux_raw syscalls supporting `rustix::system`.
2 //!
3 //! # Safety
4 //!
5 //! See the `rustix::backend` module documentation for details.
6 #![allow(unsafe_code, clippy::undocumented_unsafe_blocks)]
7 
8 use super::types::RawUname;
9 use crate::backend::c;
10 use crate::backend::conv::{c_int, ret, ret_infallible, slice};
11 use crate::io;
12 use crate::system::{RebootCommand, Sysinfo};
13 use core::mem::MaybeUninit;
14 
15 #[inline]
uname() -> RawUname16 pub(crate) fn uname() -> RawUname {
17     let mut uname = MaybeUninit::<RawUname>::uninit();
18     unsafe {
19         ret_infallible(syscall!(__NR_uname, &mut uname));
20         uname.assume_init()
21     }
22 }
23 
24 #[inline]
sysinfo() -> Sysinfo25 pub(crate) fn sysinfo() -> Sysinfo {
26     let mut info = MaybeUninit::<Sysinfo>::uninit();
27     unsafe {
28         ret_infallible(syscall!(__NR_sysinfo, &mut info));
29         info.assume_init()
30     }
31 }
32 
33 #[inline]
sethostname(name: &[u8]) -> io::Result<()>34 pub(crate) fn sethostname(name: &[u8]) -> io::Result<()> {
35     let (ptr, len) = slice(name);
36     unsafe { ret(syscall_readonly!(__NR_sethostname, ptr, len)) }
37 }
38 
39 #[inline]
reboot(cmd: RebootCommand) -> io::Result<()>40 pub(crate) fn reboot(cmd: RebootCommand) -> io::Result<()> {
41     unsafe {
42         ret(syscall_readonly!(
43             __NR_reboot,
44             c_int(c::LINUX_REBOOT_MAGIC1),
45             c_int(c::LINUX_REBOOT_MAGIC2),
46             c_int(cmd as i32)
47         ))
48     }
49 }
50