From: Lennart Poettering Date: Sun, 14 Apr 2013 01:20:12 +0000 (+0200) Subject: kdbus: also parse cmdline message attribute X-Git-Tag: v202~108 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=77930f11207ef6ec1f9284a1179fdd78c3364cba kdbus: also parse cmdline message attribute --- diff --git a/src/libsystemd-bus/bus-kernel.c b/src/libsystemd-bus/bus-kernel.c index ca47ea2f8..6105a0207 100644 --- a/src/libsystemd-bus/bus-kernel.c +++ b/src/libsystemd-bus/bus-kernel.c @@ -371,6 +371,11 @@ static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k, sd_bus_mess m->tid_comm = d->str; else if (d->type == KDBUS_MSG_SRC_EXE) m->exe = d->str; + else if (d->type == KDBUS_MSG_SRC_CMDLINE) { + m->cmdline = d->str; + m->cmdline_length = l; + } else + log_debug("Got unknown field from kernel %llu", d->type); } r = bus_message_parse_fields(m); diff --git a/src/libsystemd-bus/bus-message.c b/src/libsystemd-bus/bus-message.c index bae0812fa..e970d093c 100644 --- a/src/libsystemd-bus/bus-message.c +++ b/src/libsystemd-bus/bus-message.c @@ -70,6 +70,8 @@ static void message_free(sd_bus_message *m) { free(m->fds); } + free(m->cmdline_array); + reset_containers(m); free(m->root_container.signature); @@ -752,6 +754,38 @@ const char *sd_bus_message_get_exe(sd_bus_message *m) { return m->exe; } +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) { if (!m) return -EINVAL; @@ -2928,6 +2962,7 @@ int sd_bus_message_set_destination(sd_bus_message *m, const char *destination) { } int bus_message_dump(sd_bus_message *m) { + char **cmdline = NULL; unsigned level = 1; int r; @@ -2995,6 +3030,20 @@ int bus_message_dump(sd_bus_message *m) { if (m->label) printf("\tlabel=[%s]\n", m->label); + 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) { log_error("Failed to rewind: %s", strerror(-r)); diff --git a/src/libsystemd-bus/bus-message.h b/src/libsystemd-bus/bus-message.h index 1c403777f..60fc3fcda 100644 --- a/src/libsystemd-bus/bus-message.h +++ b/src/libsystemd-bus/bus-message.h @@ -110,6 +110,11 @@ struct sd_bus_message { const char *exe; const char *comm; const char *tid_comm; + + const char *cmdline; + size_t cmdline_length; + + char **cmdline_array; }; #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 70d41ebc4..7413d87e6 100644 --- a/src/systemd/sd-bus.h +++ b/src/systemd/sd-bus.h @@ -134,6 +134,7 @@ const char *sd_bus_message_get_selinux_context(sd_bus_message *m); const char *sd_bus_message_get_comm(sd_bus_message *m); const char *sd_bus_message_get_tid_comm(sd_bus_message *m); const char *sd_bus_message_get_exe(sd_bus_message *m); +int sd_bus_message_get_cmdline(sd_bus_message *m, char ***cmdline); 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);