From 51038c03263b2db1d63f495327267b29b3fa9656 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 12 Apr 2013 20:17:00 +0200 Subject: [PATCH] dbus: fill in kdbus sender+destination from kdbus data --- src/libsystemd-bus/bus-kernel.c | 28 ++++++++++++++++++++++++---- src/libsystemd-bus/bus-message.h | 3 +++ src/libsystemd-bus/kdbus.h | 1 + 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/libsystemd-bus/bus-kernel.c b/src/libsystemd-bus/bus-kernel.c index ff687ac48..dc6f5b998 100644 --- a/src/libsystemd-bus/bus-kernel.c +++ b/src/libsystemd-bus/bus-kernel.c @@ -69,9 +69,9 @@ static void append_destination(struct kdbus_msg_data **d, const char *s, size_t assert(d); assert(d); - (*d)->size = offsetof(struct kdbus_msg_data, data) + length + 1; + (*d)->size = offsetof(struct kdbus_msg_data, str) + length + 1; (*d)->type = KDBUS_MSG_DST_NAME; - memcpy((*d)->data, s, length + 1); + memcpy((*d)->str, s, length + 1); *d = (struct kdbus_msg_data*) ((uint8_t*) *d + ALIGN8((*d)->size)); } @@ -211,7 +211,7 @@ int bus_kernel_write_message(sd_bus *bus, sd_bus_message *m) { if (r < 0) return errno == EAGAIN ? 0 : -errno; - return 0; + return 1; } static void close_kdbus_msg(struct kdbus_msg *k) { @@ -235,6 +235,7 @@ static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k, sd_bus_mess size_t total, n_bytes = 0, idx = 0; struct kdbus_creds *creds = NULL; uint64_t nsec = 0; + const char *destination = NULL; int r; assert(bus); @@ -278,6 +279,8 @@ static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k, sd_bus_mess creds = &d->creds; else if (d->type == KDBUS_MSG_TIMESTAMP) nsec = d->ts_ns; + else if (d->type == KDBUS_MSG_DST_NAME) + destination = d->str; } if (!h) @@ -333,6 +336,23 @@ static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k, sd_bus_mess return r; } + if (k->src_id == KDBUS_SRC_ID_KERNEL) + m->sender = "org.freedesktop.DBus"; + else { + snprintf(m->sender_buffer, sizeof(m->sender_buffer), ":1.%llu", (unsigned long long) k->src_id); + m->sender = m->sender_buffer; + } + + if (!m->destination) { + if (destination) + m->destination = destination; + else if (k->dst_id != KDBUS_DST_ID_WELL_KNOWN_NAME && + k->dst_id != KDBUS_DST_ID_BROADCAST) { + snprintf(m->destination_buffer, sizeof(m->destination_buffer), ":1.%llu", (unsigned long long) k->dst_id); + m->destination = m->destination_buffer; + } + } + /* We take possession of the kmsg struct now */ m->kdbus = k; m->free_kdbus = true; @@ -389,7 +409,7 @@ int bus_kernel_read_message(sd_bus *bus, sd_bus_message **m) { else close_kdbus_msg(k); - return r; + return r < 0 ? r : 1; } int bus_kernel_create(const char *name, char **s) { diff --git a/src/libsystemd-bus/bus-message.h b/src/libsystemd-bus/bus-message.h index c501325b1..8eea46baf 100644 --- a/src/libsystemd-bus/bus-message.h +++ b/src/libsystemd-bus/bus-message.h @@ -102,6 +102,9 @@ struct sd_bus_message { char *peeked_signature; usec_t timeout; + + char sender_buffer[3 + DECIMAL_STR_MAX(uint64_t) + 1]; + char destination_buffer[3 + DECIMAL_STR_MAX(uint64_t) + 1]; }; #define BUS_MESSAGE_NEED_BSWAP(m) ((m)->header->endian != SD_BUS_NATIVE_ENDIAN) diff --git a/src/libsystemd-bus/kdbus.h b/src/libsystemd-bus/kdbus.h index 4310ef3ae..16a3a49f6 100644 --- a/src/libsystemd-bus/kdbus.h +++ b/src/libsystemd-bus/kdbus.h @@ -105,6 +105,7 @@ struct kdbus_msg_data { union { /* inline data */ __u8 data[0]; + char str[0]; __u32 data_u32[0]; __u64 data_u64[0]; -- 2.30.2