]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
cgroup-util: add pidref+full counter parts for cg_pid_get_user_unit()
authorLennart Poettering <lennart@poettering.net>
Wed, 27 Aug 2025 12:01:44 +0000 (14:01 +0200)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Thu, 25 Sep 2025 12:09:55 +0000 (14:09 +0200)
This completes the set of functions for getting the user unit of a
process, mirroring the four functions we already have for the system
unit.

src/basic/cgroup-util.c
src/basic/cgroup-util.h
src/coredump/coredump.c

index 5de64d990ecb7a75de0dd5f87e15744094c085be..97f0bc741fd95d95936eff07b34ab72f44404b7b 100644 (file)
@@ -1157,7 +1157,7 @@ static const char* skip_user_prefix(const char *path) {
         return skip_session(e);
 }
 
-int cg_path_get_user_unit(const char *path, char **ret) {
+int cg_path_get_user_unit_full(const char *path, char **ret_unit, char **ret_subgroup) {
         const char *t;
 
         assert(path);
@@ -1168,18 +1168,42 @@ int cg_path_get_user_unit(const char *path, char **ret) {
 
         /* And from here on it looks pretty much the same as for a system unit, hence let's use the same
          * parser. */
-        return cg_path_get_unit(t, ret);
+        return cg_path_get_unit_full(t, ret_unit, ret_subgroup);
 }
 
-int cg_pid_get_user_unit(pid_t pid, char **ret_unit) {
-        _cleanup_free_ char *cgroup = NULL;
+int cg_pid_get_user_unit_full(pid_t pid, char **ret_unit, char **ret_subgroup) {
         int r;
 
+        _cleanup_free_ char *cgroup = NULL;
         r = cg_pid_get_path_shifted(pid, NULL, &cgroup);
         if (r < 0)
                 return r;
 
-        return cg_path_get_user_unit(cgroup, ret_unit);
+        return cg_path_get_user_unit_full(cgroup, ret_unit, ret_subgroup);
+}
+
+int cg_pidref_get_user_unit_full(const PidRef *pidref, char **ret_unit, char **ret_subgroup) {
+        int r;
+
+        if (!pidref_is_set(pidref))
+                return -ESRCH;
+        if (pidref_is_remote(pidref))
+                return -EREMOTE;
+
+        _cleanup_free_ char *unit = NULL, *subgroup = NULL;
+        r = cg_pid_get_user_unit_full(pidref->pid, &unit, &subgroup);
+        if (r < 0)
+                return r;
+
+        r = pidref_verify(pidref);
+        if (r < 0)
+                return r;
+
+        if (ret_unit)
+                *ret_unit = TAKE_PTR(unit);
+        if (ret_subgroup)
+                *ret_subgroup = TAKE_PTR(subgroup);
+        return 0;
 }
 
 int cg_path_get_machine_name(const char *path, char **ret_machine) {
index 81424418e08545dcf5bfd9b48c72098d574b6f77..f69ebbf9530ce5ea85fdfb39f89d8cff73b2c70e 100644 (file)
@@ -208,7 +208,10 @@ static inline int cg_path_get_unit(const char *path, char **ret_unit) {
         return cg_path_get_unit_full(path, ret_unit, NULL);
 }
 int cg_path_get_unit_path(const char *path, char **ret_unit);
-int cg_path_get_user_unit(const char *path, char **ret_unit);
+int cg_path_get_user_unit_full(const char *path, char **ret_unit, char **ret_subgroup);
+static inline int cg_path_get_user_unit(const char *path, char **ret_unit) {
+        return cg_path_get_user_unit_full(path, ret_unit, NULL);
+}
 int cg_path_get_machine_name(const char *path, char **ret_machine);
 int cg_path_get_slice(const char *path, char **ret_slice);
 int cg_path_get_user_slice(const char *path, char **ret_slice);
@@ -228,7 +231,14 @@ int cg_pidref_get_unit_full(const PidRef *pidref, char **ret_unit, char **ret_su
 static inline int cg_pidref_get_unit(const PidRef *pidref, char **ret_unit) {
         return cg_pidref_get_unit_full(pidref, ret_unit, NULL);
 }
-int cg_pid_get_user_unit(pid_t pid, char **ret_unit);
+int cg_pid_get_user_unit_full(pid_t pid, char **ret_unit, char **ret_subgroup);
+static inline int cg_pid_get_user_unit(pid_t pid, char **ret_unit) {
+        return cg_pid_get_unit_full(pid, ret_unit, NULL);
+}
+int cg_pidref_get_user_unit_full(const PidRef *pidref, char **ret_unit, char **ret_subgroup);
+static inline int cg_pidref_get_user_unit(const PidRef *pidref, char **ret_unit) {
+        return cg_pidref_get_user_unit_full(pidref, ret_unit, NULL);
+}
 int cg_pid_get_machine_name(pid_t pid, char **ret_machine);
 int cg_pid_get_slice(pid_t pid, char **ret_slice);
 int cg_pid_get_user_slice(pid_t pid, char **ret_slice);
index 7fd96ac542eb52b7a92f4eaf6b44ebfab368cdf5..d71aba4a8948b160c20892b0061025a01a05b81a 100644 (file)
@@ -1483,7 +1483,7 @@ static int gather_pid_metadata_from_procfs(struct iovec_wrapper *iovw, Context *
         if (cg_pidref_get_unit(&context->pidref, &t) >= 0)
                 (void) iovw_put_string_field_free(iovw, "COREDUMP_UNIT=", t);
 
-        if (cg_pid_get_user_unit(pid, &t) >= 0)
+        if (cg_pidref_get_user_unit(&context->pidref, &t) >= 0)
                 (void) iovw_put_string_field_free(iovw, "COREDUMP_USER_UNIT=", t);
 
         if (cg_pidref_get_session(&context->pidref, &t) >= 0)