]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
pidfd-util: introduce pidfd_get_{ppid,uid,cgroupid} which goes via PIDFD_GET_INFO too
authorMike Yuan <me@yhndnzj.com>
Tue, 19 Nov 2024 19:57:41 +0000 (20:57 +0100)
committerMike Yuan <me@yhndnzj.com>
Sat, 4 Jan 2025 16:08:01 +0000 (17:08 +0100)
src/basic/pidfd-util.c
src/basic/pidfd-util.h

index b4e6eb8dce34f3d9470f553cef0e269a1aef3ec1..b2a2188e4bab0b7001e4aa7ca81df2b70cb9cd37 100644 (file)
@@ -176,6 +176,60 @@ int pidfd_verify_pid(int pidfd, pid_t pid) {
         return current_pid != pid ? -ESRCH : 0;
 }
 
+int pidfd_get_ppid(int fd, pid_t *ret) {
+        struct pidfd_info info = { .mask = PIDFD_INFO_PID };
+        int r;
+
+        assert(fd >= 0);
+
+        r = pidfd_get_info(fd, &info);
+        if (r < 0)
+                return r;
+
+        assert(FLAGS_SET(info.mask, PIDFD_INFO_PID));
+
+        if (info.ppid == 0)
+                return -EADDRNOTAVAIL;
+
+        if (ret)
+                *ret = info.ppid;
+        return 0;
+}
+
+int pidfd_get_uid(int fd, uid_t *ret) {
+        struct pidfd_info info = { .mask = PIDFD_INFO_CREDS };
+        int r;
+
+        assert(fd >= 0);
+
+        r = pidfd_get_info(fd, &info);
+        if (r < 0)
+                return r;
+
+        assert(FLAGS_SET(info.mask, PIDFD_INFO_CREDS));
+
+        if (ret)
+                *ret = info.ruid;
+        return 0;
+}
+
+int pidfd_get_cgroupid(int fd, uint64_t *ret) {
+        struct pidfd_info info = { .mask = PIDFD_INFO_CGROUPID };
+        int r;
+
+        assert(fd >= 0);
+
+        r = pidfd_get_info(fd, &info);
+        if (r < 0)
+                return r;
+
+        assert(FLAGS_SET(info.mask, PIDFD_INFO_CGROUPID));
+
+        if (ret)
+                *ret = info.cgroupid;
+        return 0;
+}
+
 int pidfd_get_inode_id(int fd, uint64_t *ret) {
         int r;
 
index 2ffece0c4fe6d1682abae7a107c5ab134cb1d889..374e96261b02d18e40e412bf867d77eb78a6150f 100644 (file)
@@ -12,4 +12,8 @@ int pidfd_get_namespace(int fd, unsigned long ns_type_cmd);
 int pidfd_get_pid(int fd, pid_t *ret);
 int pidfd_verify_pid(int pidfd, pid_t pid);
 
+int pidfd_get_ppid(int fd, pid_t *ret);
+int pidfd_get_uid(int fd, uid_t *ret);
+int pidfd_get_cgroupid(int fd, uint64_t *ret);
+
 int pidfd_get_inode_id(int fd, uint64_t *ret);