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 {}