linux_api/
capability.rs

1use linux_syscall::Result as LinuxSyscallResult;
2use linux_syscall::syscall;
3
4use crate::bindings;
5use crate::errno::Errno;
6
7pub const LINUX_CAPABILITY_VERSION_3: u32 = bindings::LINUX__LINUX_CAPABILITY_VERSION_3;
8
9#[allow(non_camel_case_types)]
10pub type user_cap_header = __user_cap_header_struct;
11#[allow(non_camel_case_types)]
12pub type user_cap_data = __user_cap_data_struct;
13
14// Somehow this is not automatically generated in bindings.rs
15#[repr(C)]
16#[derive(Debug, Copy, Clone, PartialEq, Eq)]
17pub struct __user_cap_header_struct {
18    pub version: bindings::linux___u32,
19    pub pid: ::core::ffi::c_int,
20}
21
22// Somehow this is not automatically generated in bindings.rs
23#[repr(C)]
24#[derive(Debug, Copy, Clone, PartialEq, Eq)]
25pub struct __user_cap_data_struct {
26    pub effective: bindings::linux___u32,
27    pub permitted: bindings::linux___u32,
28    pub inheritable: bindings::linux___u32,
29}
30
31unsafe fn capget_raw(hdrp: *const user_cap_header, datap: *mut user_cap_data) -> Result<(), Errno> {
32    unsafe { syscall!(linux_syscall::SYS_capget, hdrp, datap) }
33        .check()
34        .map_err(Errno::from)
35}
36
37// `linux/capability.h` typedefs `__user_cap_header_struct*` to `cap_user_header_t` and
38// `__user_cap_data_struct*` to `cap_user_data_t`. The syscall definition uses `cap_user_header_t`
39// and `cap_user_data_t`.
40//
41// ```
42// SYSCALL_DEFINE2(capget, cap_user_header_t, header, cap_user_data_t, dataptr)
43// ```
44pub fn capget(hdrp: &user_cap_header, datap: Option<&mut [user_cap_data; 2]>) -> Result<(), Errno> {
45    unsafe {
46        capget_raw(
47            hdrp,
48            datap
49                .map(|x| x.as_mut_ptr())
50                .unwrap_or(core::ptr::null_mut()),
51        )
52    }
53}
54
55unsafe fn capset_raw(
56    hdrp: *const user_cap_header,
57    datap: *const user_cap_data,
58) -> Result<(), Errno> {
59    unsafe { syscall!(linux_syscall::SYS_capset, hdrp, datap) }
60        .check()
61        .map_err(Errno::from)
62}
63
64// `linux/capability.h` typedefs `__user_cap_header_struct*` to `cap_user_header_t` and
65// `__user_cap_data_struct*` to `cap_user_data_t`. The syscall definition uses `cap_user_header_t`
66// and `cap_user_data_t`.
67//
68// ```
69// SYSCALL_DEFINE2(capset, cap_user_header_t, header, const cap_user_data_t, data)
70// ```
71pub fn capset(hdrp: &user_cap_header, datap: &[user_cap_data; 2]) -> Result<(), Errno> {
72    unsafe { capset_raw(hdrp, datap.as_ptr()) }
73}
74
75unsafe impl shadow_pod::Pod for __user_cap_header_struct {}
76unsafe impl shadow_pod::Pod for __user_cap_data_struct {}