diff options
author | Lennart Poettering <lennart@poettering.net> | 2013-04-12 20:17:00 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2013-04-12 20:17:00 +0200 |
commit | 51038c03263b2db1d63f495327267b29b3fa9656 (patch) | |
tree | 8ec67a4c09e1b1e68cb5b845192bfbc36e9319ae | |
parent | 4e6db59202ad2dbbef56a69985643390ffdd57bd (diff) |
dbus: fill in kdbus sender+destination from kdbus data
-rw-r--r-- | src/libsystemd-bus/bus-kernel.c | 28 | ||||
-rw-r--r-- | src/libsystemd-bus/bus-message.h | 3 | ||||
-rw-r--r-- | 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 ff687ac489..dc6f5b9985 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 c501325b12..8eea46baf1 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 4310ef3ae9..16a3a49f6d 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]; |