summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2013-12-12 01:42:41 +0100
committerLennart Poettering <lennart@poettering.net>2013-12-12 01:51:51 +0100
commitd78bf250b0e31b42eb8b86ebe3ee775b247bfcf8 (patch)
treecb82213cc656544e035c2576599ab0588637d020
parent689bd78d108819b362e75af42536725c56b5e939 (diff)
bus: properly generate NameOwnerChanged messages when we take from/give back to queue/starter
-rw-r--r--TODO1
-rw-r--r--src/libsystemd-bus/bus-kernel.c13
-rw-r--r--src/libsystemd-bus/kdbus.h6
3 files changed, 11 insertions, 9 deletions
diff --git a/TODO b/TODO
index e60211a1e2..7f56a26469 100644
--- a/TODO
+++ b/TODO
@@ -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];
};