diff options
-rw-r--r-- | src/libsystemd-bus/bus-kernel.c | 22 | ||||
-rw-r--r-- | src/libsystemd-bus/kdbus.h | 69 |
2 files changed, 59 insertions, 32 deletions
diff --git a/src/libsystemd-bus/bus-kernel.c b/src/libsystemd-bus/bus-kernel.c index 2bb1b9a19a..5172b32113 100644 --- a/src/libsystemd-bus/bus-kernel.c +++ b/src/libsystemd-bus/bus-kernel.c @@ -540,6 +540,7 @@ int bus_kernel_read_message(sd_bus *bus, sd_bus_message **m) { int bus_kernel_create(const char *name, char **s) { struct kdbus_cmd_bus_make *make; + struct kdbus_cmd_make_item *n, *cg; size_t l; int fd; char *p; @@ -552,16 +553,27 @@ int bus_kernel_create(const char *name, char **s) { return -errno; l = strlen(name); - make = alloca0(offsetof(struct kdbus_cmd_bus_make, name) + DECIMAL_STR_MAX(uid_t) + 1 + l + 1); - sprintf(make->name, "%lu-%s", (unsigned long) getuid(), name); - make->size = offsetof(struct kdbus_cmd_bus_make, name) + strlen(make->name) + 1; + make = alloca0(offsetof(struct kdbus_cmd_bus_make, items) + + sizeof(struct kdbus_cmd_make_item) + sizeof(uint64_t) + + sizeof(struct kdbus_cmd_make_item) + DECIMAL_STR_MAX(uid_t) + 1 + l + 1); + + cg = make->items; + cg->type = KDBUS_CMD_MAKE_CGROUP; + cg->data64[0] = 1; + cg->size = sizeof(struct kdbus_cmd_make_item) + sizeof(uint64_t); + + n = KDBUS_ITEM_NEXT(cg); + n->type = KDBUS_CMD_MAKE_NAME; + sprintf(n->str, "%lu-%s", (unsigned long) getuid(), name); + n->size = sizeof(struct kdbus_cmd_make_item) + strlen(n->str) + 1; + + make->size = offsetof(struct kdbus_cmd_bus_make, items) + cg->size + n->size; make->flags = KDBUS_ACCESS_WORLD | KDBUS_POLICY_OPEN; make->bus_flags = 0; make->bloom_size = BLOOM_SIZE; - make->cgroup_id = 1; assert_cc(BLOOM_SIZE % 8 == 0); - p = strjoin("/dev/kdbus/", make->name, "/bus", NULL); + p = strjoin("/dev/kdbus/", n->str, "/bus", NULL); if (!p) return -ENOMEM; diff --git a/src/libsystemd-bus/kdbus.h b/src/libsystemd-bus/kdbus.h index 305ded720e..6d93454702 100644 --- a/src/libsystemd-bus/kdbus.h +++ b/src/libsystemd-bus/kdbus.h @@ -2,6 +2,8 @@ * Copyright (C) 2013 Kay Sievers * Copyright (C) 2013 Greg Kroah-Hartman <gregkh@linuxfoundation.org> * Copyright (C) 2013 Linux Foundation + * Copyright (C) 2013 Lennart Poettering + * Copyright (C) 2013 Daniel Mack <daniel@zonque.org> * * kdbus is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the @@ -92,7 +94,6 @@ enum { KDBUS_MSG_NAME_CHANGE, /* .name_change */ KDBUS_MSG_ID_ADD, /* .id_change */ KDBUS_MSG_ID_REMOVE, /* .id_change */ - KDBUS_MSG_ID_CHANGE, /* .id_change */ KDBUS_MSG_REPLY_TIMEOUT, /* empty, but .reply_cookie in .kdbus_msg is filled in */ KDBUS_MSG_REPLY_DEAD, /* dito */ }; @@ -227,7 +228,35 @@ enum { KDBUS_POLICY_OPEN = 4, }; +/* Items to append to kdbus_cmd_bus_make, kdbus_cmd_ep_make and + * kdbus_cmd_ns_make */ + +enum { + KDBUS_CMD_MAKE_NONE, + KDBUS_CMD_MAKE_NAME, + KDBUS_CMD_MAKE_CGROUP, /* the cgroup hierarchy ID for which to attach + * cgroup membership paths * to messages. */ + KDBUS_CMD_MAKE_CRED, /* allow translator services which connect + * to the bus on behalf of somebody else, + * allow specifiying the credentials of the + * client to connect on behalf on. Needs + * privileges */ + +}; + +struct kdbus_cmd_make_item { + __u64 size; + __u64 type; + union { + __u8 data[0]; + __u64 data64[0]; + char str[0]; + }; +}; + struct kdbus_cmd_hello { + __u64 size; + /* userspace → kernel, kernel → userspace */ __u64 conn_flags; /* userspace specifies its * capabilities and more, kernel @@ -236,26 +265,16 @@ struct kdbus_cmd_hello { * capabilities by returning an error * from KDBUS_CMD_HELLO */ - /* userspace → kernel */ - __u64 pid; /* To allow translator services which - * connect to the bus on behalf of - * somebody else, allow specifiying - * the PID of the client to connect on - * behalf on. Normal clients should - * pass this as 0 (i.e. to do things - * under their own PID). Priviliged - * clients can pass != 0, to operate - * on behalf of somebody else. */ - /* kernel → userspace */ __u64 bus_flags; /* this is .flags copied verbatim from * from original KDBUS_CMD_BUS_MAKE * ioctl. It's intended to be useful * to do negotiation of features of * the payload that is transfreted. */ - __u64 id; /* peer id */ + __u64 id; /* id assigned to this connection */ __u64 bloom_size; /* The bloom filter size chosen by the * bus owner */ + struct kdbus_cmd_make_item items[0]; }; struct kdbus_cmd_bus_make { @@ -268,12 +287,9 @@ struct kdbus_cmd_bus_make { * copied verbatim into the bus * structure and returned from * KDBUS_CMD_HELLO, later */ - __u64 cgroup_id; /* the cgroup hierarchy ID for which - * to attach cgroup membership paths - * to messages. 0 if no cgroup data - * shall be attached. */ - __u64 bloom_size; /* Size of the bloom filter for this bus. */ - char name[0]; + __u64 bloom_size; /* size of the bloom filter for this bus */ + struct kdbus_cmd_make_item items[0]; + }; struct kdbus_cmd_ep_make { @@ -284,7 +300,7 @@ struct kdbus_cmd_ep_make { * same way as for * KDBUS_CMD_BUS_MAKE. Unused for * now. */ - char name[0]; + struct kdbus_cmd_make_item items[0]; }; struct kdbus_cmd_ns_make { @@ -295,7 +311,7 @@ struct kdbus_cmd_ns_make { * same way as for * KDBUS_CMD_BUS_MAKE. Unused for * now. */ - char name[0]; + struct kdbus_cmd_make_item items[0]; }; enum { @@ -322,15 +338,15 @@ struct kdbus_cmd_names { }; enum { - KDBUS_CMD_NAME_INFO_ITEM_NAME, - KDBUS_CMD_NAME_INFO_ITEM_SECLABEL, - KDBUS_CMD_NAME_INFO_ITEM_AUDIT, + KDBUS_CMD_NAME_INFO_ITEM_NAME, /* userspace → kernel */ + KDBUS_CMD_NAME_INFO_ITEM_SECLABEL, /* kernel → userspace */ + KDBUS_CMD_NAME_INFO_ITEM_AUDIT, /* kernel → userspace */ }; struct kdbus_cmd_name_info_item { __u64 size; __u64 type; - __u8 items[0]; + __u8 data[0]; }; struct kdbus_cmd_name_info { @@ -338,7 +354,7 @@ struct kdbus_cmd_name_info { __u64 flags; __u64 id; /* either ID, or 0 and _ITEM_NAME follows */ struct kdbus_creds creds; - struct kdbus_cmd_name_info_item item[0]; /* list of item records */ + struct kdbus_cmd_name_info_item items[0]; /* list of item records */ }; enum { @@ -349,7 +365,6 @@ enum { KDBUS_CMD_MATCH_NAME_CHANGE, /* Matches a name string against KDBUS_MSG_NAME_CHANGE */ KDBUS_CMD_MATCH_ID_ADD, /* Matches an ID against KDBUS_MSG_ID_ADD */ KDBUS_CMD_MATCH_ID_REMOVE, /* Matches an ID against KDBUS_MSG_ID_REMOVE */ - KDBUS_CMD_MATCH_ID_CHANGE, /* Matches an ID against KDBUS_MSG_ID_CHANGE */ }; struct kdbus_cmd_match_item { |