rustix/thread/
libcap.rs
1use bitflags::bitflags;
2use core::mem::MaybeUninit;
3
4use crate::pid::Pid;
5use crate::{backend, io};
6
7#[derive(Clone, Copy, Debug, PartialEq, Eq)]
9pub struct CapabilitySets {
10 pub effective: CapabilityFlags,
12 pub permitted: CapabilityFlags,
14 pub inheritable: CapabilityFlags,
16}
17
18bitflags! {
19 #[repr(transparent)]
21 #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
22 pub struct CapabilityFlags: u64 {
23 const CHOWN = 1 << linux_raw_sys::general::CAP_CHOWN;
25 const DAC_OVERRIDE = 1 << linux_raw_sys::general::CAP_DAC_OVERRIDE;
27 const DAC_READ_SEARCH = 1 << linux_raw_sys::general::CAP_DAC_READ_SEARCH;
29 const FOWNER = 1 << linux_raw_sys::general::CAP_FOWNER;
31 const FSETID = 1 << linux_raw_sys::general::CAP_FSETID;
33 const KILL = 1 << linux_raw_sys::general::CAP_KILL;
35 const SETGID = 1 << linux_raw_sys::general::CAP_SETGID;
37 const SETUID = 1 << linux_raw_sys::general::CAP_SETUID;
39 const SETPCAP = 1 << linux_raw_sys::general::CAP_SETPCAP;
41 const LINUX_IMMUTABLE = 1 << linux_raw_sys::general::CAP_LINUX_IMMUTABLE;
43 const NET_BIND_SERVICE = 1 << linux_raw_sys::general::CAP_NET_BIND_SERVICE;
45 const NET_BROADCAST = 1 << linux_raw_sys::general::CAP_NET_BROADCAST;
47 const NET_ADMIN = 1 << linux_raw_sys::general::CAP_NET_ADMIN;
49 const NET_RAW = 1 << linux_raw_sys::general::CAP_NET_RAW;
51 const IPC_LOCK = 1 << linux_raw_sys::general::CAP_IPC_LOCK;
53 const IPC_OWNER = 1 << linux_raw_sys::general::CAP_IPC_OWNER;
55 const SYS_MODULE = 1 << linux_raw_sys::general::CAP_SYS_MODULE;
57 const SYS_RAWIO = 1 << linux_raw_sys::general::CAP_SYS_RAWIO;
59 const SYS_CHROOT = 1 << linux_raw_sys::general::CAP_SYS_CHROOT;
61 const SYS_PTRACE = 1 << linux_raw_sys::general::CAP_SYS_PTRACE;
63 const SYS_PACCT = 1 << linux_raw_sys::general::CAP_SYS_PACCT;
65 const SYS_ADMIN = 1 << linux_raw_sys::general::CAP_SYS_ADMIN;
67 const SYS_BOOT = 1 << linux_raw_sys::general::CAP_SYS_BOOT;
69 const SYS_NICE = 1 << linux_raw_sys::general::CAP_SYS_NICE;
71 const SYS_RESOURCE = 1 << linux_raw_sys::general::CAP_SYS_RESOURCE;
73 const SYS_TIME = 1 << linux_raw_sys::general::CAP_SYS_TIME;
75 const SYS_TTY_CONFIG = 1 << linux_raw_sys::general::CAP_SYS_TTY_CONFIG;
77 const MKNOD = 1 << linux_raw_sys::general::CAP_MKNOD;
79 const LEASE = 1 << linux_raw_sys::general::CAP_LEASE;
81 const AUDIT_WRITE = 1 << linux_raw_sys::general::CAP_AUDIT_WRITE;
83 const AUDIT_CONTROL = 1 << linux_raw_sys::general::CAP_AUDIT_CONTROL;
85 const SETFCAP = 1 << linux_raw_sys::general::CAP_SETFCAP;
87 const MAC_OVERRIDE = 1 << linux_raw_sys::general::CAP_MAC_OVERRIDE;
89 const MAC_ADMIN = 1 << linux_raw_sys::general::CAP_MAC_ADMIN;
91 const SYSLOG = 1 << linux_raw_sys::general::CAP_SYSLOG;
93 const WAKE_ALARM = 1 << linux_raw_sys::general::CAP_WAKE_ALARM;
95 const BLOCK_SUSPEND = 1 << linux_raw_sys::general::CAP_BLOCK_SUSPEND;
97 const AUDIT_READ = 1 << linux_raw_sys::general::CAP_AUDIT_READ;
99 const PERFMON = 1 << linux_raw_sys::general::CAP_PERFMON;
101 const BPF = 1 << linux_raw_sys::general::CAP_BPF;
103 const CHECKPOINT_RESTORE = 1 << linux_raw_sys::general::CAP_CHECKPOINT_RESTORE;
105
106 const _ = !0;
108 }
109}
110
111#[inline]
118#[doc(alias = "capget")]
119pub fn capabilities(pid: Option<Pid>) -> io::Result<CapabilitySets> {
120 capget(pid)
121}
122
123#[inline]
131#[doc(alias = "capset")]
132pub fn set_capabilities(pid: Option<Pid>, sets: CapabilitySets) -> io::Result<()> {
133 capset(pid, sets)
134}
135
136#[inline]
137#[allow(unsafe_code)]
138fn capget(pid: Option<Pid>) -> io::Result<CapabilitySets> {
139 let mut data = [MaybeUninit::<linux_raw_sys::general::__user_cap_data_struct>::uninit(); 2];
140
141 let data = {
142 let mut header = linux_raw_sys::general::__user_cap_header_struct {
143 version: linux_raw_sys::general::_LINUX_CAPABILITY_VERSION_3,
144 pid: Pid::as_raw(pid) as backend::c::c_int,
145 };
146
147 backend::thread::syscalls::capget(&mut header, &mut data)?;
148 unsafe { (data[0].assume_init(), data[1].assume_init()) }
151 };
152
153 let effective = u64::from(data.0.effective) | (u64::from(data.1.effective) << u32::BITS);
154 let permitted = u64::from(data.0.permitted) | (u64::from(data.1.permitted) << u32::BITS);
155 let inheritable = u64::from(data.0.inheritable) | (u64::from(data.1.inheritable) << u32::BITS);
156
157 Ok(CapabilitySets {
159 effective: CapabilityFlags::from_bits_retain(effective),
160 permitted: CapabilityFlags::from_bits_retain(permitted),
161 inheritable: CapabilityFlags::from_bits_retain(inheritable),
162 })
163}
164
165#[inline]
166fn capset(pid: Option<Pid>, sets: CapabilitySets) -> io::Result<()> {
167 let mut header = linux_raw_sys::general::__user_cap_header_struct {
168 version: linux_raw_sys::general::_LINUX_CAPABILITY_VERSION_3,
169 pid: Pid::as_raw(pid) as backend::c::c_int,
170 };
171 let data = [
172 linux_raw_sys::general::__user_cap_data_struct {
173 effective: sets.effective.bits() as u32,
174 permitted: sets.permitted.bits() as u32,
175 inheritable: sets.inheritable.bits() as u32,
176 },
177 linux_raw_sys::general::__user_cap_data_struct {
178 effective: (sets.effective.bits() >> u32::BITS) as u32,
179 permitted: (sets.permitted.bits() >> u32::BITS) as u32,
180 inheritable: (sets.inheritable.bits() >> u32::BITS) as u32,
181 },
182 ];
183
184 backend::thread::syscalls::capset(&mut header, &data)
185}