//! pidfd helper functionality
-use std::ffi::{CStr, OsString};
+use std::ffi::{CStr, CString, OsString};
use std::io::{self, BufRead, BufReader};
use std::os::raw::c_int;
use std::os::unix::ffi::OsStringExt;
use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd};
-use failure::{bail, Error};
+use anyhow::{bail, Error};
use libc::pid_t;
use crate::capability::Capabilities;
pub struct PidFd(RawFd, pid_t);
file_descriptor_impl!(PidFd);
-pub const SYS_PIDFD_OPEN: libc::c_long = 434; // asm-generic
-
impl PidFd {
pub fn current() -> io::Result<Self> {
Self::open(unsafe { libc::getpid() })
}
pub fn open(pid: pid_t) -> io::Result<Self> {
- let fd = c_try!(unsafe {
- libc::syscall(SYS_PIDFD_OPEN, pid, 0)
- });
- Ok(Self(fd as RawFd, pid))
+ let path = CString::new(format!("/proc/{}", pid)).unwrap();
+
+ let fd = c_try!(unsafe { libc::open(path.as_ptr(), libc::O_DIRECTORY | libc::O_CLOEXEC) });
+
+ Ok(Self(fd, pid))
}
/// Turn a valid pid file descriptor into a PidFd.
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());
}
}
}