From: Lennart Poettering Date: Tue, 19 Nov 2024 15:35:26 +0000 (+0100) Subject: cgroup-util: add pidref counterparts for cg_pid_get_session() + cg_pid_get_owner_uid() X-Git-Tag: v258-rc1~1705^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=92d78966fd604d818fba86e65ef6693983178acd;p=thirdparty%2Fsystemd.git cgroup-util: add pidref counterparts for cg_pid_get_session() + cg_pid_get_owner_uid() --- diff --git a/src/basic/cgroup-util.c b/src/basic/cgroup-util.c index 8247b0c25fc..9d41db28834 100644 --- a/src/basic/cgroup-util.c +++ b/src/basic/cgroup-util.c @@ -1402,6 +1402,28 @@ int cg_pid_get_session(pid_t pid, char **ret_session) { return cg_path_get_session(cgroup, ret_session); } +int cg_pidref_get_session(const PidRef *pidref, char **ret) { + int r; + + if (!pidref_is_set(pidref)) + return -ESRCH; + if (pidref_is_remote(pidref)) + return -EREMOTE; + + _cleanup_free_ char *session = NULL; + r = cg_pid_get_session(pidref->pid, &session); + if (r < 0) + return r; + + r = pidref_verify(pidref); + if (r < 0) + return r; + + if (ret) + *ret = TAKE_PTR(session); + return 0; +} + int cg_path_get_owner_uid(const char *path, uid_t *ret_uid) { _cleanup_free_ char *slice = NULL; char *start, *end; @@ -1439,6 +1461,29 @@ int cg_pid_get_owner_uid(pid_t pid, uid_t *ret_uid) { return cg_path_get_owner_uid(cgroup, ret_uid); } +int cg_pidref_get_owner_uid(const PidRef *pidref, uid_t *ret) { + int r; + + if (!pidref_is_set(pidref)) + return -ESRCH; + if (pidref_is_remote(pidref)) + return -EREMOTE; + + uid_t uid; + r = cg_pid_get_owner_uid(pidref->pid, &uid); + if (r < 0) + return r; + + r = pidref_verify(pidref); + if (r < 0) + return r; + + if (ret) + *ret = uid; + + return 0; +} + int cg_path_get_slice(const char *p, char **ret_slice) { const char *e = NULL; diff --git a/src/basic/cgroup-util.h b/src/basic/cgroup-util.h index d471aee0c3a..23aa84f100e 100644 --- a/src/basic/cgroup-util.h +++ b/src/basic/cgroup-util.h @@ -286,7 +286,9 @@ int cg_shift_path(const char *cgroup, const char *cached_root, const char **ret_ int cg_pid_get_path_shifted(pid_t pid, const char *cached_root, char **ret_cgroup); int cg_pid_get_session(pid_t pid, char **ret_session); +int cg_pidref_get_session(const PidRef *pidref, char **ret); int cg_pid_get_owner_uid(pid_t pid, uid_t *ret_uid); +int cg_pidref_get_owner_uid(const PidRef *pidref, uid_t *ret); int cg_pid_get_unit(pid_t pid, char **ret_unit); int cg_pidref_get_unit(const PidRef *pidref, char **ret); int cg_pid_get_user_unit(pid_t pid, char **ret_unit); diff --git a/src/test/test-cgroup-util.c b/src/test/test-cgroup-util.c index 1d8f99cc6e5..9fa3ddf9d13 100644 --- a/src/test/test-cgroup-util.c +++ b/src/test/test-cgroup-util.c @@ -212,8 +212,8 @@ TEST(proc) { cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, pid.pid, &path); cg_pid_get_path_shifted(pid.pid, NULL, &path_shifted); - cg_pid_get_owner_uid(pid.pid, &uid); - cg_pid_get_session(pid.pid, &session); + cg_pidref_get_owner_uid(&pid, &uid); + cg_pidref_get_session(&pid, &session); cg_pid_get_unit(pid.pid, &unit); cg_pid_get_user_unit(pid.pid, &user_unit); cg_pid_get_machine_name(pid.pid, &machine);