From d8d3d8a781031d6b1ee4e5f57ec21f16c20a4cf2 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 16 Apr 2013 04:54:46 +0200 Subject: bus: parse unit/user unit/session from cgroup path --- TODO | 2 ++ src/libsystemd-bus/bus-message.c | 76 ++++++++++++++++++++++++++++++++++++++++ src/libsystemd-bus/bus-message.h | 4 +++ src/systemd/sd-bus.h | 3 ++ 4 files changed, 85 insertions(+) diff --git a/TODO b/TODO index 4ffdd3eefd..f90c66b981 100644 --- a/TODO +++ b/TODO @@ -38,6 +38,8 @@ Fedora 19: Features: +* move session owner code from sd-login.c to cgroup-util.c + * decimal_str_max() should become a type-safe macro * show-cgroup.c uses its own ulog10 implementation diff --git a/src/libsystemd-bus/bus-message.c b/src/libsystemd-bus/bus-message.c index b78d34bf7a..8134d77f36 100644 --- a/src/libsystemd-bus/bus-message.c +++ b/src/libsystemd-bus/bus-message.c @@ -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); } @@ -796,6 +801,66 @@ int sd_bus_message_get_cgroup(sd_bus_message *m, const char **ret) { 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; +} + +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) { size_t n, i; const char *p; @@ -3004,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; @@ -3074,6 +3140,16 @@ int bus_message_dump(sd_bus_message *m) { 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; diff --git a/src/libsystemd-bus/bus-message.h b/src/libsystemd-bus/bus-message.h index 2cd1ef257d..9440bbebb4 100644 --- a/src/libsystemd-bus/bus-message.h +++ b/src/libsystemd-bus/bus-message.h @@ -115,6 +115,10 @@ struct sd_bus_message { const char *cmdline; size_t cmdline_length; char **cmdline_array; + + char *session; + char *unit; + char *user_unit; }; #define BUS_MESSAGE_NEED_BSWAP(m) ((m)->header->endian != SD_BUS_NATIVE_ENDIAN) diff --git a/src/systemd/sd-bus.h b/src/systemd/sd-bus.h index 5d082f26b3..1352acc908 100644 --- a/src/systemd/sd-bus.h +++ b/src/systemd/sd-bus.h @@ -136,6 +136,9 @@ int sd_bus_message_get_tid_comm(sd_bus_message *m, const char **r); int sd_bus_message_get_exe(sd_bus_message *m, const char **r); int sd_bus_message_get_cgroup(sd_bus_message *m, const char **r); int sd_bus_message_get_cmdline(sd_bus_message *m, char ***cmdline); +int sd_bus_message_get_unit(sd_bus_message *m, const char **unit); +int sd_bus_message_get_user_unit(sd_bus_message *m, const char **unit); +int sd_bus_message_get_session(sd_bus_message *m, const char **session); int sd_bus_message_is_signal(sd_bus_message *m, const char *interface, const char *member); int sd_bus_message_is_method_call(sd_bus_message *m, const char *interface, const char *member); -- cgit v1.2.3-54-g00ecf