X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flibsystemd-bus%2Fbus-message.c;h=8134d77f36fea46634f8308d2a0cf836af871445;hp=bae0812facabbf109cc72b5a3113744ecf2fb348;hb=d8d3d8a781031d6b1ee4e5f57ec21f16c20a4cf2;hpb=69aec65cf8da55e400cf0a4f213b0a48268ca19f diff --git a/src/libsystemd-bus/bus-message.c b/src/libsystemd-bus/bus-message.c index bae0812fa..8134d77f3 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" @@ -70,10 +71,16 @@ static void message_free(sd_bus_message *m) { free(m->fds); } + free(m->cmdline_array); + reset_containers(m); free(m->root_container.signature); free(m->peeked_signature); + + free(m->unit); + free(m->user_unit); + free(m->session); free(m); } @@ -655,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; @@ -665,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; @@ -675,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; @@ -685,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; @@ -695,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; @@ -723,33 +744,153 @@ 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; - return m->exe; + 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; + bool first; + + if (!m) + return -EINVAL; + + if (!m->cmdline) + return -ENOENT; + + for (p = m->cmdline, n = 0; p < m->cmdline + m->cmdline_length; p++) + if (*p == 0) + n++; + + m->cmdline_array = new(char*, n + 1); + if (!m->cmdline_array) + return -ENOMEM; + + for (p = m->cmdline, i = 0, first = true; p < m->cmdline + m->cmdline_length; p++) { + if (first) + m->cmdline_array[i++] = (char*) p; + + first = *p == 0; + } + + m->cmdline_array[i] = NULL; + *cmdline = m->cmdline_array; + + return 0; } int sd_bus_message_is_signal(sd_bus_message *m, const char *interface, const char *member) { @@ -2928,6 +3069,8 @@ 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; @@ -2994,6 +3137,32 @@ 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; + + fputs("\tcmdline=[", stdout); + STRV_FOREACH(c, cmdline) { + if (c != cmdline) + putchar(' '); + + fputs(*c, stdout); + } + + fputs("]\n", stdout); + } r = sd_bus_message_rewind(m, true); if (r < 0) { @@ -3214,8 +3383,8 @@ int bus_message_read_strv_extend(sd_bus_message *m, char ***l) { const char* bus_message_get_arg(sd_bus_message *m, unsigned i) { int r; - const char *t; - char type; + const char *t = NULL; + unsigned j; assert(m); @@ -3223,7 +3392,9 @@ const char* bus_message_get_arg(sd_bus_message *m, unsigned i) { if (r < 0) return NULL; - while (i > 0) { + for (j = 0; j <= i; j++) { + char type; + r = sd_bus_message_peek_type(m, &type, NULL); if (r < 0) return NULL; @@ -3236,14 +3407,8 @@ const char* bus_message_get_arg(sd_bus_message *m, unsigned i) { r = sd_bus_message_read_basic(m, type, &t); if (r < 0) return NULL; - - i--; } - r = sd_bus_message_rewind(m, true); - if (r < 0) - return NULL; - return t; }