]> git.proxmox.com Git - pve-lxc-syscalld.git/blobdiff - src/process/pid_fd.rs
support pure cgroupv2 environments
[pve-lxc-syscalld.git] / src / process / pid_fd.rs
index 41aa3ee84d728f093bf1ceaf1c3493e7506516a9..1caf8f262bd8c381c274db90771a7ba0b98e8734 100644 (file)
@@ -1,12 +1,12 @@
 //! 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;
@@ -18,16 +18,17 @@ use super::{CGroups, IdMap, IdMapEntry, ProcStatus, Uids, UserCaps};
 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.
@@ -221,7 +222,10 @@ impl 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());
                 }
             }
         }