diff options
author | Lennart Poettering <lennart@poettering.net> | 2013-12-12 01:42:41 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2013-12-12 01:51:51 +0100 |
commit | d78bf250b0e31b42eb8b86ebe3ee775b247bfcf8 (patch) | |
tree | cb82213cc656544e035c2576599ab0588637d020 | |
parent | 689bd78d108819b362e75af42536725c56b5e939 (diff) |
bus: properly generate NameOwnerChanged messages when we take from/give back to queue/starter
-rw-r--r-- | TODO | 1 | ||||
-rw-r--r-- | src/libsystemd-bus/bus-kernel.c | 13 | ||||
-rw-r--r-- | src/libsystemd-bus/kdbus.h | 6 |
3 files changed, 11 insertions, 9 deletions
@@ -127,7 +127,6 @@ Features: - kdbus: matches against source or destination pids for an "strace -p"-like feel. Problem: The PID info needs to be available in userspace too... - kdbus: we need a way to distuingish messages we got due to monitoring from normal messages, since we want to bind methods only to the latter - figure out what to do when fields in the kdbus header and in the payload header do not match - - nameownerchange cannot be properly synthesized since we cannot distuingish messages from kernel when a name changed ownership starter → real from real → starter - longer term: * priority queues * priority inheritance diff --git a/src/libsystemd-bus/bus-kernel.c b/src/libsystemd-bus/bus-kernel.c index 92acbeec5e..81dfba7476 100644 --- a/src/libsystemd-bus/bus-kernel.c +++ b/src/libsystemd-bus/bus-kernel.c @@ -514,17 +514,18 @@ static int translate_name_change(sd_bus *bus, struct kdbus_msg *k, struct kdbus_ assert(k); assert(d); - if (d->name_change.flags & (KDBUS_NAME_IN_QUEUE|KDBUS_NAME_STARTER)) - return 0; - - if (d->type == KDBUS_ITEM_NAME_ADD) + if (d->type == KDBUS_ITEM_NAME_ADD || (d->name_change.old_flags & (KDBUS_NAME_IN_QUEUE|KDBUS_NAME_STARTER))) old_owner[0] = 0; else sprintf(old_owner, ":1.%llu", (unsigned long long) d->name_change.old_id); - if (d->type == KDBUS_ITEM_NAME_REMOVE) + if (d->type == KDBUS_ITEM_NAME_REMOVE || (d->name_change.new_flags & (KDBUS_NAME_IN_QUEUE|KDBUS_NAME_STARTER))) { + + if (isempty(old_owner)) + return 0; + new_owner[0] = 0; - else + } else sprintf(new_owner, ":1.%llu", (unsigned long long) d->name_change.new_id); return push_name_owner_changed(bus, d->name_change.name, old_owner, new_owner); diff --git a/src/libsystemd-bus/kdbus.h b/src/libsystemd-bus/kdbus.h index ccc65cb15a..168d08a3ec 100644 --- a/src/libsystemd-bus/kdbus.h +++ b/src/libsystemd-bus/kdbus.h @@ -30,7 +30,8 @@ * struct kdbus_notify_name_change - name registry change message * @old_id: Former owner of a name * @new_id: New owner of a name - * @flags: flags from KDBUS_NAME_* + * @old_flags: flags from KDBUS_NAME_* the name entry used to have + * @new_flags: flags from KDBUS_NAME_* the name entry has now * @name: Well-known name * * Sent from kernel to userspace when the owner or starter of @@ -44,7 +45,8 @@ struct kdbus_notify_name_change { __u64 old_id; __u64 new_id; - __u64 flags; + __u64 old_flags; + __u64 new_flags; char name[0]; }; |