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
8use super::types::RawUname;
9use crate::backend::c;
10use crate::backend::conv::{c_int, ret, ret_infallible, slice};
11#[cfg(any(target_os = "linux", target_os = "android"))]
12use crate::fd::BorrowedFd;
13use crate::ffi::CStr;
14use crate::io;
15use crate::system::{RebootCommand, Sysinfo};
16use core::mem::MaybeUninit;
17
18#[inline]
19pub(crate) fn uname() -> RawUname {
20 let mut uname: MaybeUninit = MaybeUninit::<RawUname>::uninit();
21 unsafe {
22 ret_infallible(raw:syscall!(__NR_uname, &mut uname));
23 uname.assume_init()
24 }
25}
26
27#[inline]
28pub(crate) fn sysinfo() -> Sysinfo {
29 let mut info: MaybeUninit = MaybeUninit::<Sysinfo>::uninit();
30 unsafe {
31 ret_infallible(raw:syscall!(__NR_sysinfo, &mut info));
32 info.assume_init()
33 }
34}
35
36#[inline]
37pub(crate) fn sethostname(name: &[u8]) -> io::Result<()> {
38 let (ptr: ArgReg<'_, A0>, len: ArgReg<'_, A1>) = slice(name);
39 unsafe { ret(raw:syscall_readonly!(__NR_sethostname, ptr, len)) }
40}
41
42#[inline]
43pub(crate) fn setdomainname(name: &[u8]) -> io::Result<()> {
44 let (ptr: ArgReg<'_, A0>, len: ArgReg<'_, A1>) = slice(name);
45 unsafe { ret(raw:syscall_readonly!(__NR_setdomainname, ptr, len)) }
46}
47
48#[inline]
49pub(crate) fn reboot(cmd: RebootCommand) -> io::Result<()> {
50 unsafe {
51 ret(raw:syscall_readonly!(
52 __NR_reboot,
53 c_int(c::LINUX_REBOOT_MAGIC1),
54 c_int(c::LINUX_REBOOT_MAGIC2),
55 c_int(cmd as i32)
56 ))
57 }
58}
59
60#[inline]
61pub(crate) fn init_module(image: &[u8], param_values: &CStr) -> io::Result<()> {
62 let (image: ArgReg<'_, A0>, len: ArgReg<'_, A1>) = slice(image);
63 unsafe {
64 ret(raw:syscall_readonly!(
65 __NR_init_module,
66 image,
67 len,
68 param_values
69 ))
70 }
71}
72
73#[inline]
74pub(crate) fn finit_module(
75 fd: BorrowedFd<'_>,
76 param_values: &CStr,
77 flags: c::c_int,
78) -> io::Result<()> {
79 unsafe {
80 ret(raw:syscall_readonly!(
81 __NR_finit_module,
82 fd,
83 param_values,
84 c_int(flags)
85 ))
86 }
87}
88
89#[inline]
90pub(crate) fn delete_module(name: &CStr, flags: c::c_int) -> io::Result<()> {
91 unsafe { ret(raw:syscall_readonly!(__NR_delete_module, name, c_int(flags))) }
92}
93