chiark / gitweb /
bus: parse unit/user unit/session from cgroup path
[elogind.git] / src / libsystemd-bus / bus-message.c
index 103e2c1f65629bb38c61b86994f0a51ab2db1bee..8134d77f36fea46634f8308d2a0cf836af871445 100644 (file)
@@ -26,6 +26,7 @@
 #include "utf8.h"
 #include "strv.h"
 #include "time-util.h"
+#include "cgroup-util.h"
 
 #include "sd-bus.h"
 #include "bus-message.h"
@@ -76,6 +77,10 @@ static void message_free(sd_bus_message *m) {
         free(m->root_container.signature);
 
         free(m->peeked_signature);
+
+        free(m->unit);
+        free(m->user_unit);
+        free(m->session);
         free(m);
 }
 
@@ -657,8 +662,10 @@ const sd_bus_error *sd_bus_message_get_error(sd_bus_message *m) {
 int sd_bus_message_get_uid(sd_bus_message *m, uid_t *uid) {
         if (!m)
                 return -EINVAL;
+        if (!uid)
+                return -EINVAL;
         if (!m->uid_valid)
-                return -ENOENT;
+                return -ESRCH;
 
         *uid = m->uid;
         return 0;
@@ -667,8 +674,10 @@ int sd_bus_message_get_uid(sd_bus_message *m, uid_t *uid) {
 int sd_bus_message_get_gid(sd_bus_message *m, gid_t *gid) {
         if (!m)
                 return -EINVAL;
+        if (!gid)
+                return -EINVAL;
         if (!m->gid_valid)
-                return -ENOENT;
+                return -ESRCH;
 
         *gid = m->gid;
         return 0;
@@ -677,8 +686,10 @@ int sd_bus_message_get_gid(sd_bus_message *m, gid_t *gid) {
 int sd_bus_message_get_pid(sd_bus_message *m, pid_t *pid) {
         if (!m)
                 return -EINVAL;
+        if (!pid)
+                return -EINVAL;
         if (m->pid <= 0)
-                return -ENOENT;
+                return -ESRCH;
 
         *pid = m->pid;
         return 0;
@@ -687,8 +698,10 @@ int sd_bus_message_get_pid(sd_bus_message *m, pid_t *pid) {
 int sd_bus_message_get_tid(sd_bus_message *m, pid_t *tid) {
         if (!m)
                 return -EINVAL;
+        if (!tid)
+                return -EINVAL;
         if (m->tid <= 0)
-                return -ENOENT;
+                return -ESRCH;
 
         *tid = m->tid;
         return 0;
@@ -697,26 +710,32 @@ int sd_bus_message_get_tid(sd_bus_message *m, pid_t *tid) {
 int sd_bus_message_get_pid_starttime(sd_bus_message *m, uint64_t *usec) {
         if (!m)
                 return -EINVAL;
+        if (!usec)
+                return -EINVAL;
         if (m->pid_starttime <= 0)
-                return -ENOENT;
+                return -ESRCH;
 
         *usec = m->pid_starttime;
         return 0;
 }
 
-const char *sd_bus_message_get_selinux_context(sd_bus_message *m) {
+int sd_bus_message_get_selinux_context(sd_bus_message *m, const char **ret) {
         if (!m)
-                return NULL;
+                return -EINVAL;
+        if (!m->label)
+                return -ESRCH;
 
-        return m->label;
+        *ret = m->label;
+        return 0;
 }
 
 int sd_bus_message_get_monotonic_timestamp(sd_bus_message *m, uint64_t *usec) {
         if (!m)
                 return -EINVAL;
-
+        if (!usec)
+                return -EINVAL;
         if (m->monotonic <= 0)
-                return -ENOENT;
+                return -ESRCH;
 
         *usec = m->monotonic;
         return 0;
@@ -725,33 +744,121 @@ int sd_bus_message_get_monotonic_timestamp(sd_bus_message *m, uint64_t *usec) {
 int sd_bus_message_get_realtime_timestamp(sd_bus_message *m, uint64_t *usec) {
         if (!m)
                 return -EINVAL;
-
+        if (!usec)
+                return -EINVAL;
         if (m->realtime <= 0)
-                return -ENOENT;
+                return -ESRCH;
 
         *usec = m->realtime;
         return 0;
 }
 
-const char *sd_bus_message_get_comm(sd_bus_message *m) {
+int sd_bus_message_get_comm(sd_bus_message *m, const char **ret) {
         if (!m)
-                return NULL;
+                return -EINVAL;
+        if (!ret)
+                return -EINVAL;
+        if (!m->comm)
+                return -ESRCH;
 
-        return m->comm;
+        *ret = m->comm;
+        return 0;
 }
 
-const char *sd_bus_message_get_tid_comm(sd_bus_message *m) {
+int sd_bus_message_get_tid_comm(sd_bus_message *m, const char **ret) {
         if (!m)
-                return NULL;
+                return -EINVAL;
+        if (!ret)
+                return -EINVAL;
+        if (!m->tid_comm)
+                return -ESRCH;
 
-        return m->tid_comm;
+        *ret = m->tid_comm;
+        return 0;
 }
 
-const char *sd_bus_message_get_exe(sd_bus_message *m) {
+int sd_bus_message_get_exe(sd_bus_message *m, const char **ret) {
         if (!m)
-                return NULL;
+                return -EINVAL;
+        if (!ret)
+                return -EINVAL;
+        if (!m->exe)
+                return -ESRCH;
+
+        *ret = m->exe;
+        return 0;
+}
+
+int sd_bus_message_get_cgroup(sd_bus_message *m, const char **ret) {
+        if (!m)
+                return -EINVAL;
+        if (!ret)
+                return -EINVAL;
+        if (!m->cgroup)
+                return -ESRCH;
+
+        *ret = m->cgroup;
+        return 0;
+}
+
+int sd_bus_message_get_unit(sd_bus_message *m, const char **ret) {
+        int r;
+
+        if (!m)
+                return -EINVAL;
+        if (!ret)
+                return -EINVAL;
+        if (!m->cgroup)
+                return -ESRCH;
+
+        if (!m->unit) {
+                r = cg_path_get_unit(m->cgroup, &m->unit);
+                if (r < 0)
+                        return r;
+        }
+
+        *ret = m->unit;
+        return 0;
+}
 
-        return m->exe;
+int sd_bus_message_get_user_unit(sd_bus_message *m, const char **ret) {
+        int r;
+
+        if (!m)
+                return -EINVAL;
+        if (!ret)
+                return -EINVAL;
+        if (!m->cgroup)
+                return -ESRCH;
+
+        if (!m->user_unit) {
+                r = cg_path_get_user_unit(m->cgroup, &m->user_unit);
+                if (r < 0)
+                        return r;
+        }
+
+        *ret = m->user_unit;
+        return 0;
+}
+
+int sd_bus_message_get_session(sd_bus_message *m, const char **ret) {
+        int r;
+
+        if (!m)
+                return -EINVAL;
+        if (!ret)
+                return -EINVAL;
+        if (!m->cgroup)
+                return -ESRCH;
+
+        if (!m->session) {
+                r = cg_path_get_session(m->cgroup, &m->session);
+                if (r < 0)
+                        return r;
+        }
+
+        *ret = m->session;
+        return 0;
 }
 
 int sd_bus_message_get_cmdline(sd_bus_message *m, char ***cmdline) {
@@ -2962,6 +3069,7 @@ int sd_bus_message_set_destination(sd_bus_message *m, const char *destination) {
 }
 
 int bus_message_dump(sd_bus_message *m) {
+        const char *u = NULL, *uu = NULL, *s = NULL;
         char **cmdline = NULL;
         unsigned level = 1;
         int r;
@@ -3029,6 +3137,18 @@ int bus_message_dump(sd_bus_message *m) {
                 printf("\ttid_comm=[%s]\n", m->tid_comm);
         if (m->label)
                 printf("\tlabel=[%s]\n", m->label);
+        if (m->cgroup)
+                printf("\tcgroup=[%s]\n", m->cgroup);
+
+        sd_bus_message_get_unit(m, &u);
+        if (u)
+                printf("\tunit=[%s]\n", u);
+        sd_bus_message_get_user_unit(m, &uu);
+        if (uu)
+                printf("\tuser_unit=[%s]\n", uu);
+        sd_bus_message_get_session(m, &s);
+        if (s)
+                printf("\tsession=[%s]\n", s);
 
         if (sd_bus_message_get_cmdline(m, &cmdline) >= 0) {
                 char **c;