#[derive(Default)]
pub struct CGroups {
- pub v1: HashMap<String, OsString>,
+ pub v1: Option<HashMap<String, OsString>>,
pub v2: Option<OsString>,
}
}
pub fn get(&self, name: &str) -> Option<&OsStr> {
- self.v1.get(name).map(|s| s.as_os_str())
+ self.v1
+ .as_ref()
+ .and_then(|v1| v1.get(name).map(|s| s.as_os_str()))
}
pub fn v2(&self) -> Option<&OsStr> {
self.v2.as_ref().map(|s| s.as_os_str())
}
+
+ pub fn has_v1(&self) -> bool {
+ self.v1.is_some()
+ }
}
cgroups.v2 = Some(path);
} else {
for entry in name.split(',') {
- cgroups.v1.insert(entry.to_string(), path.clone());
+ cgroups
+ .v1
+ .get_or_insert_with(Default::default)
+ .insert(entry.to_string(), path.clone());
}
}
}
capabilities: Capabilities,
umask: libc::mode_t,
cgroup_v1_devices: Option<OsString>,
+ cgroup_v2_base: &'static str,
cgroup_v2: Option<OsString>,
apparmor_profile: Option<OsString>,
}
capabilities: status.capabilities,
umask: status.umask,
cgroup_v1_devices: cgroups.get("devices").map(|s| s.to_owned()),
+ cgroup_v2_base: if cgroups.has_v1() { "unified/" } else { "" },
cgroup_v2: cgroups.v2().map(|s| s.to_owned()),
apparmor_profile,
})
}
fn apply_cgroups(&self) -> io::Result<()> {
+ // FIXME: Handle `kind` taking /proc/self/mountinfo into account instead of assuming
+ // "unified/"
fn enter_cgroup(kind: &str, name: &OsStr) -> io::Result<()> {
let mut path = OsString::with_capacity(15 + kind.len() + name.len() + 13 + 1);
path.push(OsStr::from_bytes(b"/sys/fs/cgroup/"));
}
if let Some(ref cg) = self.cgroup_v2 {
- enter_cgroup("unified/", cg)?;
+ enter_cgroup(self.cgroup_v2_base, cg)?;
}
Ok(())