From 85e7bbfaa416fb3beeda56146f372c6ad828e044 Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Tue, 19 Nov 2024 20:57:41 +0100 Subject: [PATCH] pidfd-util: introduce pidfd_get_{ppid,uid,cgroupid} which goes via PIDFD_GET_INFO too --- src/basic/pidfd-util.c | 54 ++++++++++++++++++++++++++++++++++++++++++ src/basic/pidfd-util.h | 4 ++++ 2 files changed, 58 insertions(+) diff --git a/src/basic/pidfd-util.c b/src/basic/pidfd-util.c index b4e6eb8dce3..b2a2188e4ba 100644 --- a/src/basic/pidfd-util.c +++ b/src/basic/pidfd-util.c @@ -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; diff --git a/src/basic/pidfd-util.h b/src/basic/pidfd-util.h index 2ffece0c4fe..374e96261b0 100644 --- a/src/basic/pidfd-util.h +++ b/src/basic/pidfd-util.h @@ -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); -- 2.47.3