From: Lennart Poettering Date: Wed, 4 Jun 2025 09:45:20 +0000 (+0200) Subject: sd-login: port sd_peer_get_cgroup() to SO_PEERPIDFD X-Git-Tag: v258-rc1~392^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F37728%2Fhead;p=thirdparty%2Fsystemd.git sd-login: port sd_peer_get_cgroup() to SO_PEERPIDFD --- diff --git a/src/libsystemd/sd-login/sd-login.c b/src/libsystemd/sd-login/sd-login.c index 4d32687ff9e..d730c5673c3 100644 --- a/src/libsystemd/sd-login/sd-login.c +++ b/src/libsystemd/sd-login/sd-login.c @@ -408,16 +408,33 @@ _public_ int sd_peer_get_user_slice(int fd, char **ret_slice) { } _public_ int sd_peer_get_cgroup(int fd, char **ret_cgroup) { - struct ucred ucred; int r; assert_return(fd >= 0, -EBADF); - r = getpeercred(fd, &ucred); + _cleanup_(pidref_done) PidRef pidref = PIDREF_NULL; + r = getpeerpidref(fd, &pidref); if (r < 0) return r; - return sd_pid_get_cgroup(ucred.pid, ret_cgroup); + _cleanup_free_ char *c = NULL; + r = cg_pidref_get_path(SYSTEMD_CGROUP_CONTROLLER, &pidref, &c); + if (r < 0) + return r; + + if (ret_cgroup) { + /* The internal APIs return the empty string for the root cgroup, let's return the "/" in the + * public APIs instead, as that's easier and less ambiguous for people to grok. */ + if (isempty(c)) { + r = free_and_strdup(&c, "/"); + if (r < 0) + return r; + } + + *ret_cgroup = TAKE_PTR(c); + } + + return 0; } static int file_of_uid(uid_t uid, char **ret) {