summaryrefslogtreecommitdiff
path: root/src/libsystemd-bus
diff options
context:
space:
mode:
Diffstat (limited to 'src/libsystemd-bus')
-rw-r--r--src/libsystemd-bus/bus-kernel.c22
-rw-r--r--src/libsystemd-bus/kdbus.h69
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 {