From: Mike Yuan Date: Tue, 19 Nov 2024 19:57:41 +0000 (+0100) Subject: pidfd-util: introduce pidfd_get_{ppid,uid,cgroupid} which goes via PIDFD_GET_INFO too X-Git-Tag: v258-rc1~1704^2~4 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=85e7bbfaa416fb3beeda56146f372c6ad828e044;p=thirdparty%2Fsystemd.git pidfd-util: introduce pidfd_get_{ppid,uid,cgroupid} which goes via PIDFD_GET_INFO too --- 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);