From a8d4cac55cf9575d19ff5a1747e726387f5a552f Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Fri, 6 Dec 2013 14:31:43 +0100 Subject: [PATCH] bus: catch up with latest kdbus changes --- src/libsystemd-bus/bus-control.c | 10 +-- src/libsystemd-bus/bus-kernel.c | 8 +- src/libsystemd-bus/bus-kernel.h | 10 +-- src/libsystemd-bus/kdbus.h | 143 ++++++++++++++----------------- 4 files changed, 77 insertions(+), 94 deletions(-) diff --git a/src/libsystemd-bus/bus-control.c b/src/libsystemd-bus/bus-control.c index 186724e8a..966398944 100644 --- a/src/libsystemd-bus/bus-control.c +++ b/src/libsystemd-bus/bus-control.c @@ -216,7 +216,7 @@ static int kernel_get_list(sd_bus *bus, uint64_t flags, char ***x) { name_list = (struct kdbus_name_list *) ((uint8_t *) bus->kdbus_buffer + cmd.offset); - KDBUS_PART_FOREACH(name, name_list, names) { + KDBUS_ITEM_FOREACH(name, name_list, names) { if (name->size > sizeof(*name)) { r = strv_extend(x, name->name); @@ -383,7 +383,7 @@ static int bus_get_owner_kdbus( c->mask |= SD_BUS_CREDS_UNIQUE_NAME; } - KDBUS_PART_FOREACH(item, conn_info, items) { + KDBUS_ITEM_FOREACH(item, conn_info, items) { switch (item->type) { @@ -439,7 +439,7 @@ static int bus_get_owner_kdbus( case KDBUS_ITEM_CMDLINE: if (mask & SD_BUS_CREDS_CMDLINE) { - c->cmdline_size = item->size - KDBUS_PART_HEADER_SIZE; + c->cmdline_size = item->size - KDBUS_ITEM_HEADER_SIZE; c->cmdline = memdup(item->data, c->cmdline_size); if (!c->cmdline) { r = -ENOMEM; @@ -471,7 +471,7 @@ static int bus_get_owner_kdbus( SD_BUS_CREDS_INHERITABLE_CAPS | SD_BUS_CREDS_BOUNDING_CAPS) & mask; if (m) { - c->capability_size = item->size - KDBUS_PART_HEADER_SIZE; + c->capability_size = item->size - KDBUS_ITEM_HEADER_SIZE; c->capability = memdup(item->data, c->capability_size); if (!c->capability) { r = -ENOMEM; @@ -1010,7 +1010,7 @@ static int bus_add_match_internal_kernel( item->type = KDBUS_MATCH_BLOOM; memcpy(item->data64, bloom, BLOOM_SIZE); - item = KDBUS_PART_NEXT(item); + item = KDBUS_ITEM_NEXT(item); } if (sender) { diff --git a/src/libsystemd-bus/bus-kernel.c b/src/libsystemd-bus/bus-kernel.c index 5ed836eeb..f23489188 100644 --- a/src/libsystemd-bus/bus-kernel.c +++ b/src/libsystemd-bus/bus-kernel.c @@ -462,7 +462,7 @@ static void close_kdbus_msg(sd_bus *bus, struct kdbus_msg *k) { off = (uint8_t *)k - (uint8_t *)bus->kdbus_buffer; ioctl(bus->input_fd, KDBUS_CMD_FREE, &off); - KDBUS_PART_FOREACH(d, k, items) { + KDBUS_ITEM_FOREACH(d, k, items) { if (d->type == KDBUS_ITEM_FDS) close_many(d->fds, (d->size - offsetof(struct kdbus_item, fds)) / sizeof(int)); @@ -589,7 +589,7 @@ static int bus_kernel_translate_message(sd_bus *bus, struct kdbus_msg *k) { assert(k); assert(k->payload_type == KDBUS_PAYLOAD_KERNEL); - KDBUS_PART_FOREACH(d, k, items) { + KDBUS_ITEM_FOREACH(d, k, items) { if (d->type >= _KDBUS_ITEM_KERNEL_BASE && d->type < _KDBUS_ITEM_KERNEL_BASE + ELEMENTSOF(translate)) { if (found) return -EBADMSG; @@ -620,7 +620,7 @@ static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k) { assert(k); assert(k->payload_type == KDBUS_PAYLOAD_DBUS1); - KDBUS_PART_FOREACH(d, k, items) { + KDBUS_ITEM_FOREACH(d, k, items) { size_t l; l = d->size - offsetof(struct kdbus_item, data); @@ -680,7 +680,7 @@ static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k) { if (r < 0) return r; - KDBUS_PART_FOREACH(d, k, items) { + KDBUS_ITEM_FOREACH(d, k, items) { size_t l; l = d->size - offsetof(struct kdbus_item, data); diff --git a/src/libsystemd-bus/bus-kernel.h b/src/libsystemd-bus/bus-kernel.h index a9dddc23d..177102090 100644 --- a/src/libsystemd-bus/bus-kernel.h +++ b/src/libsystemd-bus/bus-kernel.h @@ -23,16 +23,16 @@ #include "sd-bus.h" -#define KDBUS_PART_NEXT(item) \ +#define KDBUS_ITEM_NEXT(item) \ (typeof(item))(((uint8_t *)item) + ALIGN8((item)->size)) -#define KDBUS_PART_FOREACH(part, head, first) \ +#define KDBUS_ITEM_FOREACH(part, head, first) \ for (part = (head)->first; \ (uint8_t *)(part) < (uint8_t *)(head) + (head)->size; \ - part = KDBUS_PART_NEXT(part)) + part = KDBUS_ITEM_NEXT(part)) -#define KDBUS_PART_HEADER_SIZE offsetof(struct kdbus_item, data) -#define KDBUS_ITEM_SIZE(s) ALIGN8((s) + KDBUS_PART_HEADER_SIZE) +#define KDBUS_ITEM_HEADER_SIZE offsetof(struct kdbus_item, data) +#define KDBUS_ITEM_SIZE(s) ALIGN8((s) + KDBUS_ITEM_HEADER_SIZE) #define MEMFD_CACHE_MAX 32 diff --git a/src/libsystemd-bus/kdbus.h b/src/libsystemd-bus/kdbus.h index 13fe49a2b..6775789fe 100644 --- a/src/libsystemd-bus/kdbus.h +++ b/src/libsystemd-bus/kdbus.h @@ -26,26 +26,12 @@ #define KDBUS_MATCH_SRC_ID_ANY (~0ULL) #define KDBUS_DST_ID_BROADCAST (~0ULL) -/** - * struct KDBUS_PART_HEADER - anonymous struct used as header - * @size: Size of element, excluding padding bytes - * @type Type of element - * - * Common first elements in a structure, used to specify the type - * and size of the data. - * */ -#define KDBUS_PART_HEADER \ - struct { \ - __u64 size; \ - __u64 type; \ - } - /** * 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_* - * @name Well-known name + * @old_id: Former owner of a name + * @new_id: New owner of a name + * @flags: flags from KDBUS_NAME_* + * @name: Well-known name * * Data attached to: * KDBUS_ITEM_NAME_ADD @@ -64,8 +50,8 @@ struct kdbus_notify_name_change { /** * struct kdbus_notify_id_change - name registry change message - * @id New or former owner of the name - * @flags flags field from KDBUS_HELLO_* + * @id: New or former owner of the name + * @flags: flags field from KDBUS_HELLO_* * * Data attached to: * KDBUS_ITEM_ID_ADD @@ -81,11 +67,11 @@ struct kdbus_notify_id_change { /** * struct kdbus_creds - process credentials - * @uid User ID - * @gid Group ID - * @pid Process ID - * @tid Thread ID - * @starttime Starttime of the process + * @uid: User ID + * @gid: Group ID + * @pid: Process ID + * @tid: Thread ID + * @starttime: Starttime of the process * * The starttime of the process PID. This is useful to detect PID overruns * from the client side. i.e. if you use the PID to look something up in @@ -102,8 +88,8 @@ struct kdbus_creds { /** * struct kdbus_audit - audit information - * @sessionid The audit session ID - * @loginuid The audit login uid + * @sessionid: The audit session ID + * @loginuid: The audit login uid */ struct kdbus_audit { __u64 sessionid; @@ -123,8 +109,8 @@ struct kdbus_timestamp { /** * struct kdbus_vec - I/O vector for kdbus payload items * @size: The size of the vector - * @address Memory address for memory addresses - * @offset Offset in the in-message payload memory + * @address: Memory address for memory addresses + * @offset: Offset in the in-message payload memory */ struct kdbus_vec { __u64 size; @@ -148,21 +134,50 @@ struct kdbus_memfd { /** * struct kdbus_name - a registered well-known name with its flags - * @flags flags from KDBUS_NAME_* - * @name well-known name + * @flags: flags from KDBUS_NAME_* + * @name: well-known name */ struct kdbus_name { __u64 flags; char name[0]; }; +/** + * struct kdbus_policy_access - policy access item + * @type: One of KDBUS_POLICY_ACCESS_* types + * @bits: Access to grant. One of KDBUS_POLICY_* + * @id: For KDBUS_POLICY_ACCESS_USER, the uid + * For KDBUS_POLICY_ACCESS_GROUP, the gid + */ +struct kdbus_policy_access { + __u64 type; /* USER, GROUP, WORLD */ + __u64 bits; /* RECV, SEND, OWN */ + __u64 id; /* uid, gid, 0 */ +}; + +/* + * struct kdbus_policy - a policy to upload + * @size: The total size of the structure + * @type: KDBUS_POLICY_NAME or KDBUS_POLICY_ACCESS + * @name: The well-known name to grant access to, + * if @type is KDBUS_POLICY_NAME + * @access: The policy access details, + * if @type is KDBUS_POLICY_ACCESS + */ +struct kdbus_policy { + union { + struct kdbus_policy_access access; + char name[0]; + }; +}; + /* Message Item Types */ enum { _KDBUS_ITEM_NULL, /* Filled in by userspace */ - _KDBUS_ITEM_USER_BASE = 1, - KDBUS_ITEM_PAYLOAD_VEC = 1, /* .data_vec, reference to memory area */ + _KDBUS_ITEM_USER_BASE, + KDBUS_ITEM_PAYLOAD_VEC = _KDBUS_ITEM_USER_BASE, KDBUS_ITEM_PAYLOAD_OFF, /* .data_vec, reference to memory area */ KDBUS_ITEM_PAYLOAD_MEMFD, /* file descriptor of a special data file */ KDBUS_ITEM_FDS, /* .data_fds of file descriptors */ @@ -170,13 +185,15 @@ enum { KDBUS_ITEM_DST_NAME, /* destination's well-known name, in .str */ KDBUS_ITEM_PRIORITY, /* queue priority for message */ + _KDBUS_ITEM_POLICY_BASE = 0x400, + KDBUS_ITEM_POLICY_NAME = _KDBUS_ITEM_POLICY_BASE, + KDBUS_ITEM_POLICY_ACCESS, + /* Filled in by kernelspace */ - _KDBUS_ITEM_ATTACH_BASE = 0x400, - KDBUS_ITEM_NAME = 0x400,/* NUL separated string list with well-known names of source */ + _KDBUS_ITEM_ATTACH_BASE = 0x600, + KDBUS_ITEM_NAME = _KDBUS_ITEM_ATTACH_BASE, KDBUS_ITEM_STARTER_NAME, /* Only used in HELLO for starter connection */ KDBUS_ITEM_TIMESTAMP, /* .timestamp */ - - /* when appended to a message, the following items refer to the sender */ KDBUS_ITEM_CREDS, /* .creds */ KDBUS_ITEM_PID_COMM, /* optional, in .str */ KDBUS_ITEM_TID_COMM, /* optional, in .str */ @@ -189,7 +206,7 @@ enum { /* Special messages from kernel, consisting of one and only one of these data blocks */ _KDBUS_ITEM_KERNEL_BASE = 0x800, - KDBUS_ITEM_NAME_ADD = 0x800,/* .name_change */ + KDBUS_ITEM_NAME_ADD = _KDBUS_ITEM_KERNEL_BASE, KDBUS_ITEM_NAME_REMOVE, /* .name_change */ KDBUS_ITEM_NAME_CHANGE, /* .name_change */ KDBUS_ITEM_ID_ADD, /* .id_change */ @@ -198,13 +215,14 @@ enum { KDBUS_ITEM_REPLY_DEAD, /* dito */ }; -/** +/* * struct kdbus_item - chain of data blocks - * @size : overall data record size + * @size: : overall data record size * @type: kdbus_item type of data */ struct kdbus_item { - KDBUS_PART_HEADER; + __u64 size; + __u64 type; union { /* inline data */ __u8 data[0]; @@ -229,6 +247,7 @@ struct kdbus_item { int fds[0]; struct kdbus_notify_name_change name_change; struct kdbus_notify_id_change id_change; + struct kdbus_policy policy; }; }; @@ -271,12 +290,6 @@ struct kdbus_msg { struct kdbus_item items[0]; }; -enum { - _KDBUS_POLICY_NULL, - KDBUS_POLICY_NAME, - KDBUS_POLICY_ACCESS, -}; - enum { _KDBUS_POLICY_ACCESS_NULL, KDBUS_POLICY_ACCESS_USER, @@ -290,36 +303,6 @@ enum { KDBUS_POLICY_OWN = 1 << 0, }; -/** - * struct kdbus_policy_access - policy access item - * @type: One of KDBUS_POLICY_ACCESS_* types - * @bits: Access to grant. One of KDBUS_POLICY_* - * @id: For KDBUS_POLICY_ACCESS_USER, the uid - * For KDBUS_POLICY_ACCESS_GROUP, the gid - */ -struct kdbus_policy_access { - __u64 type; /* USER, GROUP, WORLD */ - __u64 bits; /* RECV, SEND, OWN */ - __u64 id; /* uid, gid, 0 */ -}; - -/** - * struct kdbus_policy - a policy to upload - * @size: The total size of the structure - * @type: KDBUS_POLICY_NAME or KDBUS_POLICY_ACCESS - * @name: The well-known name to grant access to, - * if @type is KDBUS_POLICY_NAME - * @access: The policy access details, - * if @type is KDBUS_POLICY_ACCESS - */ -struct kdbus_policy { - KDBUS_PART_HEADER; - union { - char name[0]; - struct kdbus_policy_access access; - }; -}; - /** * struct kdbus_cmd_policy - a series of policies to upload * @size: The total size of the structure @@ -331,7 +314,7 @@ struct kdbus_policy { */ struct kdbus_cmd_policy { __u64 size; - struct kdbus_policy policies[0]; + struct kdbus_item policies[0]; }; /* Flags for struct kdbus_cmd_hello */ @@ -370,7 +353,7 @@ enum { * (kernel → userspace) * @pool_size: Maximum size of the pool buffer (kernel → userspace) * @id128: Unique 128-bit ID of the bus (kernel → userspace) - * @items; A list of items + * @items: A list of items * * This struct is used with the KDBUS_CMD_HELLO ioctl. See the ioctl * documentation for more information. @@ -409,7 +392,7 @@ enum { * struct kdbus_cmd_bus_make - struct to make a bus * @size: The total size of the struct * @flags: Properties for the bus to create - * @bloom_filter: Size of the bloom filter for this bus + * @bloom_size: Size of the bloom filter for this bus * @items: Items describing details such as the name of the bus * * This structure is used with the KDBUS_CMD_BUS_MAKE ioctl. Refer to the -- 2.30.2