From ceceaf09f9e4a53f86c623d70931676255aef334 Mon Sep 17 00:00:00 2001 From: Daniel Mack Date: Wed, 18 Dec 2013 00:20:55 +0100 Subject: [PATCH 1/1] bus: sync with kdbus Two new things here: a) struct kdbus_notify_name_change now carries two struct kdbus_notify_id_change b) a new KDBUS_CMD_BYEBYE ioctl that has no user yet in systemd --- src/libsystemd-bus/bus-control.c | 4 +-- src/libsystemd-bus/bus-kernel.c | 8 ++--- src/libsystemd-bus/kdbus.h | 58 +++++++++++++++++--------------- 3 files changed, 37 insertions(+), 33 deletions(-) diff --git a/src/libsystemd-bus/bus-control.c b/src/libsystemd-bus/bus-control.c index 0072c37a8..986668138 100644 --- a/src/libsystemd-bus/bus-control.c +++ b/src/libsystemd-bus/bus-control.c @@ -787,8 +787,8 @@ static int add_name_change_match(sd_bus *bus, offsetof(struct kdbus_notify_name_change, name) + l+1; - item->name_change.old_id = old_owner_id; - item->name_change.new_id = new_owner_id; + item->name_change.old.id = old_owner_id; + item->name_change.new.id = new_owner_id; if (name) strcpy(item->name_change.name, name); diff --git a/src/libsystemd-bus/bus-kernel.c b/src/libsystemd-bus/bus-kernel.c index 5be91d464..bd6b84a7b 100644 --- a/src/libsystemd-bus/bus-kernel.c +++ b/src/libsystemd-bus/bus-kernel.c @@ -515,19 +515,19 @@ static int translate_name_change(sd_bus *bus, struct kdbus_msg *k, struct kdbus_ assert(k); assert(d); - if (d->type == KDBUS_ITEM_NAME_ADD || (d->name_change.old_flags & (KDBUS_NAME_IN_QUEUE|KDBUS_NAME_ACTIVATOR))) + if (d->type == KDBUS_ITEM_NAME_ADD || (d->name_change.old.flags & (KDBUS_NAME_IN_QUEUE|KDBUS_NAME_ACTIVATOR))) old_owner[0] = 0; else - sprintf(old_owner, ":1.%llu", (unsigned long long) d->name_change.old_id); + sprintf(old_owner, ":1.%llu", (unsigned long long) d->name_change.old.id); - if (d->type == KDBUS_ITEM_NAME_REMOVE || (d->name_change.new_flags & (KDBUS_NAME_IN_QUEUE|KDBUS_NAME_ACTIVATOR))) { + if (d->type == KDBUS_ITEM_NAME_REMOVE || (d->name_change.new.flags & (KDBUS_NAME_IN_QUEUE|KDBUS_NAME_ACTIVATOR))) { if (isempty(old_owner)) return 0; new_owner[0] = 0; } else - sprintf(new_owner, ":1.%llu", (unsigned long long) d->name_change.new_id); + 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 e9ffecd54..f570c0d67 100644 --- a/src/libsystemd-bus/kdbus.h +++ b/src/libsystemd-bus/kdbus.h @@ -26,6 +26,23 @@ #define KDBUS_MATCH_SRC_ID_ANY (~0ULL) #define KDBUS_DST_ID_BROADCAST (~0ULL) +/** + * struct kdbus_notify_id_change - name registry change message + * @id: New or former owner of the name + * @flags: flags field from KDBUS_HELLO_* + * + * Sent from kernel to userspace when the owner or activator of + * a well-known name changes. + * + * Attached to: + * KDBUS_ITEM_ID_ADD + * KDBUS_ITEM_ID_REMOVE + */ +struct kdbus_notify_id_change { + __u64 id; + __u64 flags; +}; + /** * struct kdbus_notify_name_change - name registry change message * @old_id: Former owner of a name @@ -43,30 +60,11 @@ * KDBUS_ITEM_NAME_CHANGE */ struct kdbus_notify_name_change { - __u64 old_id; - __u64 new_id; - __u64 old_flags; - __u64 new_flags; + struct kdbus_notify_id_change old; + struct kdbus_notify_id_change new; char name[0]; }; -/** - * struct kdbus_notify_id_change - name registry change message - * @id: New or former owner of the name - * @flags: flags field from KDBUS_HELLO_* - * - * Sent from kernel to userspace when the owner or activator of - * a well-known name changes. - * - * Attached to: - * KDBUS_ITEM_ID_ADD - * KDBUS_ITEM_ID_REMOVE - */ -struct kdbus_notify_id_change { - __u64 id; - __u64 flags; -}; - /** * struct kdbus_creds - process credentials * @uid: User ID @@ -518,11 +516,11 @@ struct kdbus_cmd_make { * @KDBUS_NAME_ACTIVATOR: Name is owned by a activator connection */ enum kdbus_name_flags { - KDBUS_NAME_REPLACE_EXISTING = 1 << 0, - KDBUS_NAME_ALLOW_REPLACEMENT = 1 << 1, - KDBUS_NAME_QUEUE = 1 << 2, - KDBUS_NAME_IN_QUEUE = 1 << 3, - KDBUS_NAME_ACTIVATOR = 1 << 4, + KDBUS_NAME_REPLACE_EXISTING = 1 << 0, + KDBUS_NAME_ALLOW_REPLACEMENT = 1 << 1, + KDBUS_NAME_QUEUE = 1 << 2, + KDBUS_NAME_IN_QUEUE = 1 << 3, + KDBUS_NAME_ACTIVATOR = 1 << 4, }; /** @@ -564,7 +562,7 @@ enum kdbus_name_list_flags { * @offset: The returned offset in the caller's pool buffer. * The user must use KDBUS_CMD_FREE to free the * allocated memory. - * + * * This structure is used with the KDBUS_CMD_NAME_LIST ioctl. */ struct kdbus_cmd_name_list { @@ -687,6 +685,11 @@ struct kdbus_cmd_match { * @KDBUS_CMD_HELLO: By opening the bus device node a connection is * created. After a HELLO the opened connection * becomes an active peer on the bus. + * @KDBUS_CMD_BYEBYE: Disconnect a connection. If the connection's + * message list is empty, the calls succeeds, and + * the handle is rendered unusable. Otherwise, + * -EAGAIN is returned without any further side- + * effects. * @KDBUS_CMD_MSG_SEND: Send a message and pass data from userspace to * the kernel. * @KDBUS_CMD_MSG_RECV: Receive a message from the kernel which is @@ -748,6 +751,7 @@ enum kdbus_ioctl_type { KDBUS_CMD_EP_MAKE = _IOW (KDBUS_IOC_MAGIC, 0x20, struct kdbus_cmd_make), KDBUS_CMD_HELLO = _IOWR(KDBUS_IOC_MAGIC, 0x30, struct kdbus_cmd_hello), + KDBUS_CMD_BYEBYE = _IO (KDBUS_IOC_MAGIC, 0x31), KDBUS_CMD_MSG_SEND = _IOW (KDBUS_IOC_MAGIC, 0x40, struct kdbus_msg), KDBUS_CMD_MSG_RECV = _IOR (KDBUS_IOC_MAGIC, 0x41, __u64 *), -- 2.30.2