process-util: port pidref_get_uid() and pidref_is_my_child() to pidfd helpers

This commit is contained in:
Mike Yuan
2025-01-04 17:48:22 +01:00
parent 85e7bbfaa4
commit 47f64104d1
5 changed files with 62 additions and 34 deletions
+1 -1
View File
@@ -349,7 +349,7 @@ int namespace_get_leader(pid_t pid, NamespaceType type, pid_t *ret) {
for (;;) {
pid_t ppid;
r = get_process_ppid(pid, &ppid);
r = pid_get_ppid(pid, &ppid);
if (r < 0)
return r;
+1 -1
View File
@@ -188,7 +188,7 @@ int pidfd_get_ppid(int fd, pid_t *ret) {
assert(FLAGS_SET(info.mask, PIDFD_INFO_PID));
if (info.ppid == 0)
if (info.ppid == 0) /* See comments in pid_get_ppid() */
return -EADDRNOTAVAIL;
if (ret)
+52 -25
View File
@@ -48,6 +48,7 @@
#include "nulstr-util.h"
#include "parse-util.h"
#include "path-util.h"
#include "pidfd-util.h"
#include "process-util.h"
#include "raw-clone.h"
#include "rlimit-util.h"
@@ -557,7 +558,6 @@ int pid_get_uid(pid_t pid, uid_t *ret) {
}
int pidref_get_uid(const PidRef *pid, uid_t *ret) {
uid_t uid;
int r;
if (!pidref_is_set(pid))
@@ -566,6 +566,13 @@ int pidref_get_uid(const PidRef *pid, uid_t *ret) {
if (pidref_is_remote(pid))
return -EREMOTE;
if (pid->fd >= 0) {
r = pidfd_get_uid(pid->fd, ret);
if (!ERRNO_IS_NEG_NOT_SUPPORTED(r))
return r;
}
uid_t uid;
r = pid_get_uid(pid->pid, &uid);
if (r < 0)
return r;
@@ -651,7 +658,7 @@ int get_process_environ(pid_t pid, char **ret) {
return 0;
}
int get_process_ppid(pid_t pid, pid_t *ret) {
int pid_get_ppid(pid_t pid, pid_t *ret) {
_cleanup_free_ char *line = NULL;
unsigned long ppid;
const char *p;
@@ -706,6 +713,35 @@ int get_process_ppid(pid_t pid, pid_t *ret) {
return 0;
}
int pidref_get_ppid(const PidRef *pidref, pid_t *ret) {
int r;
if (!pidref_is_set(pidref))
return -ESRCH;
if (pidref_is_remote(pidref))
return -EREMOTE;
if (pidref->fd >= 0) {
r = pidfd_get_ppid(pidref->fd, ret);
if (!ERRNO_IS_NEG_NOT_SUPPORTED(r))
return r;
}
pid_t ppid;
r = pid_get_ppid(pidref->pid, ret ? &ppid : NULL);
if (r < 0)
return r;
r = pidref_verify(pidref);
if (r < 0)
return r;
if (ret)
*ret = ppid;
return 0;
}
int pid_get_start_time(pid_t pid, usec_t *ret) {
_cleanup_free_ char *line = NULL;
const char *p;
@@ -1046,25 +1082,8 @@ int getenv_for_pid(pid_t pid, const char *field, char **ret) {
return 0;
}
int pid_is_my_child(pid_t pid) {
pid_t ppid;
int r;
if (pid < 0)
return -ESRCH;
if (pid <= 1)
return false;
r = get_process_ppid(pid, &ppid);
if (r < 0)
return r;
return ppid == getpid_cached();
}
int pidref_is_my_child(const PidRef *pid) {
int r, result;
int r;
if (!pidref_is_set(pid))
return -ESRCH;
@@ -1072,15 +1091,23 @@ int pidref_is_my_child(const PidRef *pid) {
if (pidref_is_remote(pid))
return -EREMOTE;
result = pid_is_my_child(pid->pid);
if (result < 0)
return result;
if (pid->pid == 1 || pidref_is_self(pid))
return false;
r = pidref_verify(pid);
pid_t ppid;
r = pidref_get_ppid(pid, &ppid);
if (r < 0)
return r;
return result;
return ppid == getpid_cached();
}
int pid_is_my_child(pid_t pid) {
if (pid == 0)
return false;
return pidref_is_my_child(&PIDREF_MAKE_FROM_PID(pid));
}
int pid_is_unwaited(pid_t pid) {
+3 -2
View File
@@ -52,9 +52,10 @@ int get_process_gid(pid_t pid, gid_t *ret);
int get_process_cwd(pid_t pid, char **ret);
int get_process_root(pid_t pid, char **ret);
int get_process_environ(pid_t pid, char **ret);
int get_process_ppid(pid_t pid, pid_t *ret);
int pid_get_ppid(pid_t pid, pid_t *ret);
int pidref_get_ppid(const PidRef *pidref, pid_t *ret);
int pid_get_start_time(pid_t pid, usec_t *ret);
int pidref_get_start_time(const PidRef* pid, usec_t *ret);
int pidref_get_start_time(const PidRef *pid, usec_t *ret);
int get_process_umask(pid_t pid, mode_t *ret);
int container_get_leader(const char *machine, pid_t *pid);