chiark / gitweb /
bus: catch up with kernel changes
[elogind.git] / src / libsystemd-bus / kdbus.h
index ba59fd0d372cbfa537fe7f690b27b23a3ad39f07..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
@@ -48,34 +50,43 @@ struct kdbus_creds {
        __u64 starttime;
 };
 
+struct kdbus_audit {
+       __u64 sessionid;
+       __u64 loginuid;
+};
+
+struct kdbus_timestamp {
+       __u64 monotonic_ns;
+       __u64 realtime_ns;
+};
+
 #define KDBUS_SRC_ID_KERNEL            (0)
 #define KDBUS_DST_ID_WELL_KNOWN_NAME   (0)
 #define KDBUS_MATCH_SRC_ID_ANY         (~0ULL)
 #define KDBUS_DST_ID_BROADCAST         (~0ULL)
 
-/* Message Data Types */
+/* Message Item Types */
 enum {
        /* Filled in by userspace */
        KDBUS_MSG_NULL,                 /* empty record */
        KDBUS_MSG_PAYLOAD,              /* .data */
-       KDBUS_MSG_PAYLOAD_VEC,          /* .data_vec, converted into _PAYLOAD at delivery */
-       KDBUS_MSG_MMAP,                 /* .data_vec */
-       KDBUS_MSG_MMAP_DONATE,          /* .data_vec, unmap the memory from the sender */
+       KDBUS_MSG_PAYLOAD_VEC,          /* .data_vec */
        KDBUS_MSG_UNIX_FDS,             /* .data_fds of file descriptors */
-       KDBUS_MSG_BLOOM,                /* for broadcasts, carries bloom filter blob */
-       KDBUS_MSG_DST_NAME,             /* destination's well-known name */
+       KDBUS_MSG_BLOOM,                /* for broadcasts, carries bloom filter blob in .data */
+       KDBUS_MSG_DST_NAME,             /* destination's well-known name, in .str */
 
        /* Filled in by kernelspace */
        KDBUS_MSG_SRC_NAMES     = 0x200,/* NUL separated string list with well-known names of source */
-       KDBUS_MSG_TIMESTAMP,            /* .ts_ns of CLOCK_MONOTONIC */
+       KDBUS_MSG_TIMESTAMP,            /* .timestamp */
        KDBUS_MSG_SRC_CREDS,            /* .creds */
-       KDBUS_MSG_SRC_COMM,             /* optional */
-       KDBUS_MSG_SRC_EXE,              /* optional */
-       KDBUS_MSG_SRC_CMDLINE,          /* optional */
-       KDBUS_MSG_SRC_CGROUP,           /* optional, specified which one */
-       KDBUS_MSG_SRC_CAPS,             /* caps data blob */
-       KDBUS_MSG_SRC_SECLABEL,         /* NUL terminated string */
-       KDBUS_MSG_SRC_AUDIT,            /* array of two uint64_t of audit loginuid + sessiond */
+       KDBUS_MSG_SRC_PID_COMM,         /* optional, in .str */
+       KDBUS_MSG_SRC_TID_COMM,         /* optional, in .str */
+       KDBUS_MSG_SRC_EXE,              /* optional, in .str */
+       KDBUS_MSG_SRC_CMDLINE,          /* optional, in .str (a chain of NUL str) */
+       KDBUS_MSG_SRC_CGROUP,           /* optional, in .str */
+       KDBUS_MSG_SRC_CAPS,             /* caps data blob, in .data */
+       KDBUS_MSG_SRC_SECLABEL,         /* NUL terminated string, in .str */
+       KDBUS_MSG_SRC_AUDIT,            /* .audit */
 
        /* Special messages from kernel, consisting of one and only one of these data blocks */
        KDBUS_MSG_NAME_ADD      = 0x400,/* .name_change */
@@ -83,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 */
 };
@@ -94,27 +104,29 @@ struct kdbus_vec {
 };
 
 /**
- * struct  kdbus_msg_data - chain of data blocks
+ * struct  kdbus_msg_item - chain of data blocks
  *
  * size: overall data record size
- * type: kdbus_msg_data_type of data
+ * type: kdbus_msg_item type of data
  */
-struct kdbus_msg_data {
+struct kdbus_msg_item {
        __u64 size;
        __u64 type;
        union {
                /* inline data */
                __u8 data[0];
-               __u32 data_u32[0];
-               __u64 data_u64[0];
+               __u32 data32[0];
+               __u64 data64[0];
+               char str[0];
 
                /* data vector */
                struct kdbus_vec vec;
 
                /* specific fields */
                int fds[0];                             /* int array of file descriptors */
-               __u64 ts_ns;                            /* timestamp in nanoseconds */
                struct kdbus_creds creds;
+               struct kdbus_audit audit;
+               struct kdbus_timestamp timestamp;
                struct kdbus_manager_msg_name_change name_change;
                struct kdbus_manager_msg_id_change id_change;
        };
@@ -137,8 +149,7 @@ enum {
  * set by userspace:
  * dst_id: destination id
  * flags: KDBUS_MSG_FLAGS_*
- * data_size: overall message size
- * data: data records
+ * items: data records
  *
  * set by kernel:
  * src_id: who sent the message
@@ -154,7 +165,7 @@ struct kdbus_msg {
                __u64 cookie_reply;     /* cookie we reply to */
                __u64 timeout_ns;       /* timespan to wait for reply */
        };
-       struct kdbus_msg_data data[0];
+       struct kdbus_msg_item items[0];
 };
 
 enum {
@@ -189,61 +200,118 @@ struct kdbus_policy {
 
 struct kdbus_cmd_policy {
        __u64 size;
-       __u8 buffer[0]; /* a series of KDBUS_POLICY_NAME plus one or more KDBUS_POLICY_ACCESS each. */
+       __u8 buffer[0]; /* a series of KDBUS_POLICY_NAME plus one or
+                        * more KDBUS_POLICY_ACCESS each. */
 };
 
 enum {
-       KDBUS_CMD_HELLO_STARTER         =  1,
-       KDBUS_CMD_HELLO_ACCEPT_FD       =  2,
-       KDBUS_CMD_HELLO_ACCEPT_MMAP     =  4,
+       KDBUS_CMD_HELLO_STARTER         =  1 <<  0,
+       KDBUS_CMD_HELLO_ACCEPT_FD       =  1 <<  1,
+       KDBUS_CMD_HELLO_ACCEPT_MMAP     =  1 <<  2,
+
+       /* The following have an effect on directed messages only --
+        * not for broadcasts */
+       KDBUS_CMD_HELLO_ATTACH_COMM     =  1 << 10,
+       KDBUS_CMD_HELLO_ATTACH_EXE      =  1 << 11,
+       KDBUS_CMD_HELLO_ATTACH_CMDLINE  =  1 << 12,
+       KDBUS_CMD_HELLO_ATTACH_CGROUP   =  1 << 13,
+       KDBUS_CMD_HELLO_ATTACH_CAPS     =  1 << 14,
+       KDBUS_CMD_HELLO_ATTACH_SECLABEL =  1 << 15,
+       KDBUS_CMD_HELLO_ATTACH_AUDIT    =  1 << 16,
 };
 
+/* Flags for kdbus_cmd_bus_make, kdbus_cmd_ep_make and
+ * kdbus_cmd_ns_make */
 enum {
-       KDBUS_CMD_FNAME_ACCESS_GROUP    =  1,
-       KDBUS_CMD_FNAME_ACCESS_WORLD    =  2,
+       KDBUS_ACCESS_GROUP      =  1,
+       KDBUS_ACCESS_WORLD      =  2,
+       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 kernel_flags;     /* userspace specifies its
+       __u64 conn_flags;       /* userspace specifies its
                                 * capabilities and more, kernel
                                 * returns its capabilites and
                                 * more. Kernel might refuse client's
                                 * 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_fname {
+struct kdbus_cmd_bus_make {
        __u64 size;
-       __u64 kernel_flags;     /* userspace → kernel, kernel → userspace
-                                * When creating a bus/ns/ep feature
-                                * kernel negotiation done the same
-                                * way as for KDBUS_CMD_BUS_MAKE. */
-       __u64 user_flags;       /* userspace → kernel
+       __u64 flags;            /* userspace → kernel, kernel → userspace
+                                * When creating a bus feature
+                                * kernel negotiation. */
+       __u64 bus_flags;        /* userspace → kernel
                                 * When a bus is created this value is
                                 * copied verbatim into the bus
                                 * structure and returned from
                                 * KDBUS_CMD_HELLO, later */
-       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 {
+       __u64 size;
+       __u64 flags;            /* userspace → kernel, kernel → userspace
+                                * When creating an entry point
+                                * feature kernel negotiation done the
+                                * same way as for
+                                * KDBUS_CMD_BUS_MAKE. Unused for
+                                * now. */
+       struct kdbus_cmd_make_item items[0];
+};
+
+struct kdbus_cmd_ns_make {
+       __u64 size;
+       __u64 flags;            /* userspace → kernel, kernel → userspace
+                                * When creating an entry point
+                                * feature kernel negotiation done the
+                                * same way as for
+                                * KDBUS_CMD_BUS_MAKE. Unused for
+                                * now. */
+       struct kdbus_cmd_make_item items[0];
 };
 
 enum {
@@ -251,7 +319,6 @@ enum {
        KDBUS_CMD_NAME_REPLACE_EXISTING         =  1,
        KDBUS_CMD_NAME_QUEUE                    =  2,
        KDBUS_CMD_NAME_ALLOW_REPLACEMENT        =  4,
-       KDBUS_CMD_NAME_STEAL_MESSAGES           =  8,
 
        /* kernel → userspace */
        KDBUS_CMD_NAME_IN_QUEUE = 0x200,
@@ -259,8 +326,9 @@ enum {
 
 struct kdbus_cmd_name {
        __u64 size;
-       __u64 flags;
+       __u64 name_flags;
        __u64 id;               /* We allow registration/deregestration of names of other peers */
+       __u64 conn_flags;
        char name[0];
 };
 
@@ -270,9 +338,9 @@ 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 {
@@ -286,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 {
@@ -297,13 +365,16 @@ 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 {
        __u64 size;
        __u64 type;
-       __u8 data[0];
+       union {
+               __u64 id;
+               __u8 data[0];
+               char str[0];
+       };
 };
 
 struct kdbus_cmd_match {
@@ -331,14 +402,14 @@ struct kdbus_cmd_monitor {
  */
 enum kdbus_cmd {
        /* kdbus control node commands: require unset state */
-       KDBUS_CMD_BUS_MAKE =            _IOWR(KDBUS_IOC_MAGIC, 0x00, struct kdbus_cmd_fname),
-       KDBUS_CMD_NS_MAKE =             _IOWR(KDBUS_IOC_MAGIC, 0x10, struct kdbus_cmd_fname),
+       KDBUS_CMD_BUS_MAKE =            _IOWR(KDBUS_IOC_MAGIC, 0x00, struct kdbus_cmd_bus_make),
+       KDBUS_CMD_NS_MAKE =             _IOWR(KDBUS_IOC_MAGIC, 0x10, struct kdbus_cmd_ns_make),
 
        /* kdbus control node commands: require bus owner state */
        KDBUS_CMD_BUS_POLICY_SET =      _IOWR(KDBUS_IOC_MAGIC, 0x20, struct kdbus_cmd_policy),
 
        /* kdbus ep node commands: require unset state */
-       KDBUS_CMD_EP_MAKE =             _IOWR(KDBUS_IOC_MAGIC, 0x30, struct kdbus_cmd_fname),
+       KDBUS_CMD_EP_MAKE =             _IOWR(KDBUS_IOC_MAGIC, 0x30, struct kdbus_cmd_ep_make),
        KDBUS_CMD_HELLO =               _IOWR(KDBUS_IOC_MAGIC, 0x31, struct kdbus_cmd_hello),
 
        /* kdbus ep node commands: require connected state */