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#[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#[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
37pub 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
64pub 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 {}