chiark / gitweb /
bus: catch up with kernel changes
authorKay Sievers <kay@vrfy.org>
Thu, 18 Apr 2013 16:54:17 +0000 (18:54 +0200)
committerKay Sievers <kay@vrfy.org>
Thu, 18 Apr 2013 16:54:17 +0000 (18:54 +0200)
src/libsystemd-bus/bus-kernel.c
src/libsystemd-bus/kdbus.h

index 2bb1b9a19a70993ebbcedf7891cd89f7e0d02f17..5172b321139ba9bcf963b1ece2f3eebe48f22998 100644 (file)
@@ -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;
 
index 305ded720ed677e84371a7f7c52403cee9f202f6..6d934547023c25f52a341efdce30499fe70758ec 100644 (file)
@@ -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 {