[systemd-commits] src/libsystemd-bus

Daniel Mack zonque at kemper.freedesktop.org
Mon Dec 2 11:30:31 PST 2013


 src/libsystemd-bus/bus-control.c |   16 +-
 src/libsystemd-bus/kdbus.h       |  312 ++++++++++++++++++++++++++++++---------
 2 files changed, 249 insertions(+), 79 deletions(-)

New commits:
commit c85a5a243bc65b48b2b416315bee0e9057ef7fa3
Author: Daniel Mack <zonque at gmail.com>
Date:   Mon Dec 2 20:29:58 2013 +0100

    libsystemd-bus: catch up with latest kdbus changes

diff --git a/src/libsystemd-bus/bus-control.c b/src/libsystemd-bus/bus-control.c
index 77c4543..6f0bf06 100644
--- a/src/libsystemd-bus/bus-control.c
+++ b/src/libsystemd-bus/bus-control.c
@@ -404,8 +404,8 @@ static int bus_get_owner_kdbus(
                 sd_bus_creds **creds) {
 
         _cleanup_bus_creds_unref_ sd_bus_creds *c = NULL;
-        struct kdbus_cmd_name_info *cmd;
-        struct kdbus_name_info *name_info;
+        struct kdbus_cmd_conn_info *cmd;
+        struct kdbus_conn_info *conn_info;
         struct kdbus_item *item;
         size_t size;
         uint64_t m, id;
@@ -415,34 +415,34 @@ static int bus_get_owner_kdbus(
         if (r < 0)
                 return r;
         if (r > 0) {
-                size = offsetof(struct kdbus_cmd_name_info, name);
+                size = offsetof(struct kdbus_cmd_conn_info, name);
                 cmd = alloca0(size);
                 cmd->id = id;
         } else {
-                size = offsetof(struct kdbus_cmd_name_info, name) + strlen(name) + 1;
+                size = offsetof(struct kdbus_cmd_conn_info, name) + strlen(name) + 1;
                 cmd = alloca0(size);
                 strcpy(cmd->name, name);
         }
 
         cmd->size = size;
-        r = ioctl(bus->input_fd, KDBUS_CMD_NAME_INFO, cmd);
+        r = ioctl(bus->input_fd, KDBUS_CMD_CONN_INFO, cmd);
         if (r < 0)
                 return -errno;
 
-        name_info = (struct kdbus_name_info *) ((uint8_t *) bus->kdbus_buffer + cmd->offset);
+        conn_info = (struct kdbus_conn_info *) ((uint8_t *) bus->kdbus_buffer + cmd->offset);
 
         c = bus_creds_new();
         if (!c)
                 return -ENOMEM;
 
         if (mask & SD_BUS_CREDS_UNIQUE_NAME) {
-                if (asprintf(&c->unique_name, ":1.%llu", (unsigned long long) name_info->id) < 0)
+                if (asprintf(&c->unique_name, ":1.%llu", (unsigned long long) conn_info->id) < 0)
                         return -ENOMEM;
 
                 c->mask |= SD_BUS_CREDS_UNIQUE_NAME;
         }
 
-        KDBUS_PART_FOREACH(item, name_info, items) {
+        KDBUS_PART_FOREACH(item, conn_info, items) {
 
                 switch (item->type) {
 
diff --git a/src/libsystemd-bus/kdbus.h b/src/libsystemd-bus/kdbus.h
index 838a087..98f513f 100644
--- a/src/libsystemd-bus/kdbus.h
+++ b/src/libsystemd-bus/kdbus.h
@@ -62,16 +62,32 @@ struct kdbus_creds {
 	__u64 starttime;
 };
 
+/**
+ * struct kdbus_audit - audit information
+ * @sessionid		The audit session ID
+ * @loginuid		The audit login uid
+ */
 struct kdbus_audit {
 	__u64 sessionid;
 	__u64 loginuid;
 };
 
+/**
+ * struct kdbus_timestamp
+ * @monotonic_ns:	Monotonic timestamp, in nanoseconds
+ * @realtime_ns:	Realtime timestamp, in nanoseconds
+ */
 struct kdbus_timestamp {
 	__u64 monotonic_ns;
 	__u64 realtime_ns;
 };
 
+/**
+ * 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
+ */
 struct kdbus_vec {
 	__u64 size;
 	union {
@@ -80,6 +96,12 @@ struct kdbus_vec {
 	};
 };
 
+/**
+ * struct kdbus_memfd - a kdbus memfd
+ * @size:	The memfd's size
+ * @fd:		The file descriptor number
+ * @__pad:	Padding to make the struct aligned
+ */
 struct kdbus_memfd {
 	__u64 size;
 	int fd;
@@ -129,10 +151,9 @@ enum {
 };
 
 /**
- * struct  kdbus_item - chain of data blocks
- *
- * size: overall data record size
- * type: kdbus_item type of data
+ * struct kdbus_item - chain of data blocks
+ * @size:	overall data record size
+ * @type:	kdbus_item type of data
  */
 struct kdbus_item {
 	KDBUS_PART_HEADER;
@@ -173,16 +194,30 @@ enum {
 	KDBUS_PAYLOAD_GVARIANT	= 0x4756617269616e74ULL, /* 'GVariant' */
 };
 
+/**
+ * struct kdbus_msg - the representation of a kdbus message
+ * @size:		Total size of the message
+ * @flags:		Message flags (KDBUS_MSG_FLAGS_*)
+ * @dst_id:		64-bit ID of the destination connection
+ * @src_id:		64-bit ID of the source connection
+ * @payload_type:	Payload type (KDBUS_PAYLOAD_*)
+ * @cookie:		Userspace-supplied cookie
+ * @cookie_reply:	For kernel-generated messages, this is the cookie
+ * 			the message is a reply to
+ * @timeout_ns:		For non-kernel-generated messages, this denotes the
+ * 			message timeout in nanoseconds
+ * @items:		A list of kdbus_items containing the message payload
+ */
 struct kdbus_msg {
 	__u64 size;
 	__u64 flags;
-	__u64 dst_id;			/* connection, 0 == name in data, ~0 broadcast */
-	__u64 src_id;			/* connection, 0 == kernel */
-	__u64 payload_type;		/* 'DBusVer1', 'GVariant', ... */
-	__u64 cookie;			/* userspace-supplied cookie */
+	__u64 dst_id;
+	__u64 src_id;
+	__u64 payload_type;
+	__u64 cookie;
 	union {
-		__u64 cookie_reply;	/* cookie we reply to */
-		__u64 timeout_ns;	/* timespan to wait for reply */
+		__u64 cookie_reply;
+		__u64 timeout_ns;
 	};
 	struct kdbus_item items[0];
 };
@@ -206,12 +241,28 @@ 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 {
@@ -220,7 +271,15 @@ struct kdbus_policy {
 	};
 };
 
-/* A series of KDBUS_POLICY_NAME, plus one or more KDBUS_POLICY_ACCESS */
+/**
+ * struct kdbus_cmd_policy - a series of policies to upload
+ * @size:	The total size of the structure
+ * @policies:	The policies to upload
+ *
+ * A KDBUS_POLICY_NAME must always preceed a KDBUS_POLICY_ACCESS entry.
+ * A new KDBUS_POLICY_NAME can be added after KDBUS_POLICY_ACCESS for
+ * chaining multiple policies together.
+ */
 struct kdbus_cmd_policy {
 	__u64 size;
 	struct kdbus_policy policies[0];
@@ -246,44 +305,52 @@ enum {
 	KDBUS_ATTACH_AUDIT		=  1 <<  9,
 };
 
-/* KDBUS_CMD_HELLO */
+/**
+ * struct kdbus_cmd_hello - struct to say hello to kdbus
+ * @size:		The total size of the structure
+ * @conn_flags:		Connection flags (KDBUS_HELLO_*). The kernel will
+ * 			return its capabilities in that field.
+ * @attach_flags:	Mask of metdata to attach to each message sent
+ * 			(KDBUS_ATTACH_*)
+ * @bus_flags:		The flags field copied verbatim from the original
+ * 			KDBUS_CMD_BUS_MAKE ioctl. It's intended to be useful
+ *			to do negotiation of features of the payload that is
+ *			transferred (kernel → userspace)
+ * @id:			The id of this connection (kernel → userspace)
+ * @bloom_size:		The bloom filter size chosen by the owner
+ * 			(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
+ *
+ * This struct is used with the KDBUS_CMD_HELLO ioctl. See the ioctl
+ * documentation for more information.
+ */
 struct kdbus_cmd_hello {
 	__u64 size;
 
 	/* userspace → kernel, kernel → userspace */
-	__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_HELLO */
-	__u64 attach_flags;	/* userspace specifies the metadata
-				 * attachments it wishes to receive with
-				 * every message. */
+	__u64 conn_flags;
+	__u64 attach_flags;
 
 	/* 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;		/* id assigned to this connection */
-	__u64 bloom_size;	/* The bloom filter size chosen by the
-				 * bus owner */
-	__u64 pool_size;	/* maximum size of pool buffer */
-	__u8 id128[16];		/* the unique id of the bus */
+	__u64 bus_flags;
+	__u64 id;
+	__u64 bloom_size;
+	__u64 pool_size;
+	__u8 id128[16];
 
 	struct kdbus_item items[0];
 };
 
-/* Flags for kdbus_cmd_{bus,ep,ns}_make */
+/* Flags for KDBUS_CMD_{BUS,EP,NS}_MAKE */
 enum {
 	KDBUS_MAKE_ACCESS_GROUP		= 1 <<  0,
 	KDBUS_MAKE_ACCESS_WORLD		= 1 <<  1,
 	KDBUS_MAKE_POLICY_OPEN		= 1 <<  2,
 };
 
-/* Items to append to kdbus_cmd_{bus,ep,ns}_make */
+/* Items to append to KDBUS_CMD_{BUS,EP,NS}_MAKE */
 enum {
 	_KDBUS_MAKE_NULL,
 	KDBUS_MAKE_NAME,
@@ -294,39 +361,54 @@ enum {
 				 * privileges */
 };
 
+/**
+ * struct kdbus_cmd_bus_make - struct to make a bus
+ * @size:		The total size of the struct
+ * @flags:		FIXME
+ * @bus_flags:
+ * @bloom_filter:	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
+ * documentation for more information.
+ */
 struct kdbus_cmd_bus_make {
 	__u64 size;
-	__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 */
-	__u64 bloom_size;	/* size of the bloom filter for this bus */
+	__u64 flags;
+	__u64 bus_flags;
+	__u64 bloom_size;
 	struct kdbus_item items[0];
 };
 
+/**
+ * struct kdbus_cmd_ep_make - struct to make an endpoint
+ * @size:		The total size of the struct
+ * @flags:		Unused for now
+ * @items:		Items describing details such as the
+ * 			name of the endpoint
+ *
+ * This structure is used with the KDBUS_CMD_EP_MAKE ioctl. Refer to the
+ * documentation for more information.
+ */
 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. */
+	__u64 flags;
 	struct kdbus_item items[0];
 };
 
+/**
+ * struct kdbus_cmd_ns_make - struct to make a namespace
+ * @size:		The total size of the struct
+ * @flags:		Unused for now
+ * @items:		Items describing details such as the
+ * 			name of the namespace
+ *
+ * This structure is used with the KDBUS_CMD_NS_MAKE ioctl. Refer to the
+ * documentation for more information.
+ */
 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. */
+	__u64 flags;
 	struct kdbus_item items[0];
 };
 
@@ -340,11 +422,22 @@ enum {
 	KDBUS_NAME_IN_QUEUE			= 1 << 16,
 };
 
-/* KDBUS_CMD_NAME_ACQUIRE */
+/**
+ * struct kdbus_cmd_name - struct to describe a well-known name
+ * @size:		The total size of the struct
+ * @flags:		Flags for a name entry (KDBUS_NAME_*)
+ * @id:			Priviledged users may use this field to (de)register
+ * 			names on behalf of other peers.
+ * @conn_flags:		The flags of the owning connection
+ * @name:		The well-known name
+ *
+ * This structure is used with the KDBUS_CMD_NAME_ACQUIRE ioctl.
+ * Refer to the documentation for more information.
+ */
 struct kdbus_cmd_name {
 	__u64 size;
 	__u64 flags;
-	__u64 id;		/* we allow (de)registration of names of other peers */
+	__u64 id;
 	__u64 conn_flags;
 	char name[0];
 };
@@ -352,20 +445,61 @@ struct kdbus_cmd_name {
 /* KDBUS_CMD_NAME_LIST */
 enum {
 	KDBUS_NAME_LIST_UNIQUE_NAMES		= 1 <<  0,
+	KDBUS_NAME_LIST_STARTERS_ONLY		= 1 <<  1,
+	KDBUS_NAME_LIST_QUEUED_OWNERS		= 1 <<  2,
 };
 
+/**
+ * struct kdbus_cmd_name_list - request a list of name entries
+ * @flags:	Flags for the query (KDBUS_NAME_LIST_*)
+ * @offset:	The returned offset in the caller's pool buffer.
+ *		The user must use KDBUS_CMD_FREE to free the
+ *		allocated memory.
+ * @name	If KDBUS_NAME_LIST_QUEUED_OWNERS is set in @flags,
+ * 		a name must be provided.
+ * 
+ * This structure is used with the KDBUS_CMD_NAME_LIST ioctl.
+ * Refer to the documentation for more information.
+ */
 struct kdbus_cmd_name_list {
 	__u64 flags;
-	__u64 offset;		/* returned offset in the caller's buffer */
+	__u64 offset;
+	char name[0];
 };
 
+/**
+ * struct kdbus_name_list - information returned by KDBUS_CMD_NAME_LIST
+ * @size:	The total size of the structure
+ * @names:	A list of names
+ *
+ * Note that the user is responsible for freeing the allocated memory with
+ * the KDBUS_CMD_FREE ioctl.
+ */
 struct kdbus_name_list {
 	__u64 size;
 	struct kdbus_cmd_name names[0];
 };
 
-/* KDBUS_CMD_NAME_INFO */
-struct kdbus_cmd_name_info {
+/* KDBUS_CMD_CONN_INFO */
+
+/**
+ * struct kdbus_cmd_conn_info - struct used for KDBUS_CMD_CONN_INFO ioctl
+ * @size:	The total size of the struct
+ * @flags:	Query flags, currently unused
+ * @id:		The 64-bit ID of the connection. If set to zero, passing
+ * 		@name is required. kdbus will look up the name to determine
+ * 		the ID in this case.
+ * @offset:	Returned offset in the caller's pool buffer where the
+ * 		kdbus_name_info struct result is stored. The user must
+ * 		use KDBUS_CMD_FREE to free the allocated memory.
+ * @name:	The optional well-known name to look up. Only needed in
+ * 		case @if is zero.
+ *
+ * On success, the KDBUS_CMD_CONN_INFO ioctl will return 0 and @offset will
+ * tell the user the offset in the connection pool buffer at which to find the
+ * result in a struct kdbus_conn_info.
+ */
+struct kdbus_cmd_conn_info {
 	__u64 size;
 	__u64 flags;			/* query flags */
 	__u64 id;			/* either ID, or 0 and name follows */
@@ -373,7 +507,17 @@ struct kdbus_cmd_name_info {
 	char name[0];
 };
 
-struct kdbus_name_info {
+/**
+ * struct kdbus_conn_info - information returned by KDBUS_CMD_CONN_INFO
+ * @size:	The total size of the struct
+ * @id:		The connection's 64-bit ID
+ * @flags:	The connection's flags
+ * @items:	A list of struct kdbus_item
+ *
+ * Note that the user is responsible for freeing the allocated memory with
+ * the KDBUS_CMD_FREE ioctl.
+ */
+struct kdbus_conn_info {
 	__u64 size;
 	__u64 id;
 	__u64 flags;			/* connection flags */
@@ -392,6 +536,22 @@ enum {
 	KDBUS_MATCH_ID_REMOVE,		/* Matches an ID against KDBUS_MSG_ID_REMOVE */
 };
 
+/**
+ * struct kdbus_cmd_match - struct to add or remove matches
+ * @size:	The total size of the struct
+ * @id:		Priviledged users may (de)register matches on behalf
+ * 		of other peers.
+ * 		In other cases, set to 0.
+ * @cookie:	Userspace supplied cookie. When removing, the cookie is
+ * 		suffices as information
+ * @src_id:	The source ID to match against. Use KDBUS_MATCH_SRC_ID_ANY or
+ * 		any other value for a unique match.
+ * @items:	A list of items for additional information
+ *
+ * This structure is used with the KDBUS_CMD_ADD_MATCH and
+ * KDBUS_CMD_REMOVE_MATCH ioctl. Refer to the documentation for more
+ * information.
+ */
 struct kdbus_cmd_match {
 	__u64 size;
 	__u64 id;	/* We allow registration/deregestration of matches for other peers */
@@ -405,8 +565,17 @@ enum {
 	KDBUS_MONITOR_ENABLE		= 1 <<  0,
 };
 
+/**
+ * struct kdbus_cmd_monitor - struct to enable or disable eavesdropping
+ * @id:		Priviledged users may enable or disable the monitor feature
+ * 		on behalf of other peers
+ * @flags:	Use KDBUS_MONITOR_ENABLE to enable eavesdropping
+ *
+ * This structure is used with the KDBUS_CMD_MONITOR ioctl.
+ * Refer to the documentation for more information.
+ */
 struct kdbus_cmd_monitor {
-	__u64 id;		/* We allow setting the monitor flag of other peers */
+	__u64 id;
 	__u64 flags;
 };
 
@@ -427,20 +596,21 @@ enum {
 	KDBUS_CMD_NAME_ACQUIRE =	_IOWR(KDBUS_IOC_MAGIC, 0x50, struct kdbus_cmd_name),
 	KDBUS_CMD_NAME_RELEASE =	_IOW(KDBUS_IOC_MAGIC, 0x51, struct kdbus_cmd_name),
 	KDBUS_CMD_NAME_LIST =		_IOWR(KDBUS_IOC_MAGIC, 0x52, struct kdbus_cmd_name_list),
-	KDBUS_CMD_NAME_INFO =		_IOWR(KDBUS_IOC_MAGIC, 0x53, struct kdbus_cmd_name_info),
 
-	KDBUS_CMD_MATCH_ADD =		_IOW(KDBUS_IOC_MAGIC, 0x60, struct kdbus_cmd_match),
-	KDBUS_CMD_MATCH_REMOVE =	_IOW(KDBUS_IOC_MAGIC, 0x61, struct kdbus_cmd_match),
-	KDBUS_CMD_MONITOR =		_IOW(KDBUS_IOC_MAGIC, 0x62, struct kdbus_cmd_monitor),
+	KDBUS_CMD_CONN_INFO =		_IOWR(KDBUS_IOC_MAGIC, 0x60, struct kdbus_cmd_conn_info),
+
+	KDBUS_CMD_MATCH_ADD =		_IOW(KDBUS_IOC_MAGIC, 0x70, struct kdbus_cmd_match),
+	KDBUS_CMD_MATCH_REMOVE =	_IOW(KDBUS_IOC_MAGIC, 0x71, struct kdbus_cmd_match),
+	KDBUS_CMD_MONITOR =		_IOW(KDBUS_IOC_MAGIC, 0x72, struct kdbus_cmd_monitor),
 
 	/* kdbus ep node commands: require ep owner state */
-	KDBUS_CMD_EP_POLICY_SET =	_IOW(KDBUS_IOC_MAGIC, 0x70, struct kdbus_cmd_policy),
+	KDBUS_CMD_EP_POLICY_SET =	_IOW(KDBUS_IOC_MAGIC, 0x80, struct kdbus_cmd_policy),
 
 	/* kdbus memfd commands: */
-	KDBUS_CMD_MEMFD_NEW =		_IOR(KDBUS_IOC_MAGIC, 0x80, int *),
-	KDBUS_CMD_MEMFD_SIZE_GET =	_IOR(KDBUS_IOC_MAGIC, 0x81, __u64 *),
-	KDBUS_CMD_MEMFD_SIZE_SET =	_IOW(KDBUS_IOC_MAGIC, 0x82, __u64 *),
-	KDBUS_CMD_MEMFD_SEAL_GET =	_IOR(KDBUS_IOC_MAGIC, 0x83, int *),
-	KDBUS_CMD_MEMFD_SEAL_SET =	_IO(KDBUS_IOC_MAGIC, 0x84),
+	KDBUS_CMD_MEMFD_NEW =		_IOR(KDBUS_IOC_MAGIC, 0x90, int *),
+	KDBUS_CMD_MEMFD_SIZE_GET =	_IOR(KDBUS_IOC_MAGIC, 0x91, __u64 *),
+	KDBUS_CMD_MEMFD_SIZE_SET =	_IOW(KDBUS_IOC_MAGIC, 0x92, __u64 *),
+	KDBUS_CMD_MEMFD_SEAL_GET =	_IOR(KDBUS_IOC_MAGIC, 0x93, int *),
+	KDBUS_CMD_MEMFD_SEAL_SET =	_IO(KDBUS_IOC_MAGIC, 0x94),
 };
 #endif



More information about the systemd-commits mailing list