[systemd-commits] src/libsystemd

Kay Sievers kay at kemper.freedesktop.org
Thu Jan 16 16:43:30 PST 2014


 src/libsystemd/bus-kernel.c |    6 ++---
 src/libsystemd/kdbus.h      |   52 +++++++++++++++++++++++++++++++++++---------
 2 files changed, 45 insertions(+), 13 deletions(-)

New commits:
commit 9ff1897bb564bcb885a8e2fd9a73902de830b6e0
Author: Kay Sievers <kay at vrfy.org>
Date:   Fri Jan 17 01:29:48 2014 +0100

    bus: update kdbus.h (ABI break)

diff --git a/src/libsystemd/bus-kernel.c b/src/libsystemd/bus-kernel.c
index d69d6f3..d3eeb52 100644
--- a/src/libsystemd/bus-kernel.c
+++ b/src/libsystemd/bus-kernel.c
@@ -947,8 +947,8 @@ fail:
 }
 
 int bus_kernel_read_message(sd_bus *bus) {
+        struct kdbus_cmd_recv recv = {};
         struct kdbus_msg *k;
-        uint64_t off;
         int r;
 
         assert(bus);
@@ -957,14 +957,14 @@ int bus_kernel_read_message(sd_bus *bus) {
         if (r < 0)
                 return r;
 
-        r = ioctl(bus->input_fd, KDBUS_CMD_MSG_RECV, &off);
+        r = ioctl(bus->input_fd, KDBUS_CMD_MSG_RECV, &recv);
         if (r < 0) {
                 if (errno == EAGAIN)
                         return 0;
 
                 return -errno;
         }
-        k = (struct kdbus_msg *)((uint8_t *)bus->kdbus_buffer + off);
+        k = (struct kdbus_msg *)((uint8_t *)bus->kdbus_buffer + recv.offset);
 
         if (k->payload_type == KDBUS_PAYLOAD_DBUS) {
                 r = bus_kernel_make_message(bus, k);
diff --git a/src/libsystemd/kdbus.h b/src/libsystemd/kdbus.h
index d2e4fd3..10102d4 100644
--- a/src/libsystemd/kdbus.h
+++ b/src/libsystemd/kdbus.h
@@ -349,6 +349,7 @@ enum kdbus_payload_type {
  * struct kdbus_msg - the representation of a kdbus message
  * @size:		Total size of the message
  * @flags:		Message flags (KDBUS_MSG_FLAGS_*)
+ * @priority:		Message queue priority value
  * @dst_id:		64-bit ID of the destination connection
  * @src_id:		64-bit ID of the source connection
  * @payload_type:	Payload type (KDBUS_PAYLOAD_*)
@@ -366,6 +367,7 @@ enum kdbus_payload_type {
 struct kdbus_msg {
 	__u64 size;
 	__u64 flags;
+	__s64 priority;
 	__u64 dst_id;
 	__u64 src_id;
 	__u64 payload_type;
@@ -378,6 +380,42 @@ struct kdbus_msg {
 } __attribute__((aligned(8)));
 
 /**
+ * enum kdbus_recv_flags - flags for de-queuing messages
+ * @KDBUS_RECV_PEEK:		Return the next queued message without
+ *				actually de-queuing it, and without installing
+ *				any file descriptors or other resources. It is
+ *				usually used to determine the activating
+ *				connection of a bus name.
+ * @KDBUS_RECV_DROP:		Drop and free the next queued message and all
+ *				its resources without actually receiving it.
+ * @KDBUS_RECV_USE_PRIORITY:	Only de-queue messages with the specified or
+ * 				higher priority (lowest values); if not set,
+ * 				the priority value is ignored.
+ */
+enum kdbus_recv_flags {
+	KDBUS_RECV_PEEK		= 1 <<  0,
+	KDBUS_RECV_DROP		= 1 <<  1,
+	KDBUS_RECV_USE_PRIORITY	= 1 <<  2,
+};
+
+/**
+ * kdbus_cmd_recv - struct to de-queue a buffered message
+ * @flags:		KDBUS_RECV_* flags
+ * @priority:		Minimum priority of the messages to de-queue. Lowest
+ *			values have the highest priority.
+ * @offset:		Returned offset in the pool where the message is
+ * 			stored. The user must use KDBUS_CMD_FREE to free
+ * 			the allocated memory.
+ *
+ * This struct is used with the KDBUS_CMD_MSG_RECV ioctl.
+ */
+struct kdbus_cmd_recv {
+	__u64 flags;
+	__s64 priority;
+	__u64 offset;
+} __attribute__((aligned(8)));
+
+/**
  * enum kdbus_policy_access_type - permissions of a policy record
  * @_KDBUS_POLICY_ACCESS_NULL:	Uninitialized/invalid
  * @KDBUS_POLICY_ACCESS_USER:	Grant access to a uid
@@ -480,8 +518,7 @@ enum kdbus_attach_flags {
  * @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.
+ * This struct is used with the KDBUS_CMD_HELLO ioctl.
  */
 struct kdbus_cmd_hello {
 	__u64 size;
@@ -700,11 +737,6 @@ struct kdbus_cmd_memfd_make {
  *				placed in the receiver's pool.
  * @KDBUS_CMD_FREE:		Release the allocated memory in the receiver's
  *				pool.
- * @KDBUS_CMD_DROP:		Drop and free the next queued message and all
- *				its ressources without actually receiveing it.
- * @KDBUS_CMD_SRC:		Query the sender's connection ID of the next
- *				queued message, used to determine the activating
- *				connection of a bus name.
  * @KDBUS_CMD_NAME_ACQUIRE:	Request a well-known bus name to associate with
  *				the connection. Well-known names are used to
  *				address a peer on the bus.
@@ -759,10 +791,8 @@ enum kdbus_ioctl_type {
 	KDBUS_CMD_BYEBYE =		_IO  (KDBUS_IOC_MAGIC, 0x31),
 
 	KDBUS_CMD_MSG_SEND =		_IOW (KDBUS_IOC_MAGIC, 0x40, struct kdbus_msg),
-	KDBUS_CMD_MSG_RECV =		_IOR (KDBUS_IOC_MAGIC, 0x41, __u64 *),
+	KDBUS_CMD_MSG_RECV =		_IOWR(KDBUS_IOC_MAGIC, 0x41, struct kdbus_cmd_recv),
 	KDBUS_CMD_FREE =		_IOW (KDBUS_IOC_MAGIC, 0x42, __u64 *),
-	KDBUS_CMD_MSG_DROP =		_IO  (KDBUS_IOC_MAGIC, 0x43),
-	KDBUS_CMD_MSG_SRC =		_IOR (KDBUS_IOC_MAGIC, 0x44, __u64 *),
 
 	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),
@@ -827,6 +857,8 @@ enum kdbus_ioctl_type {
  * @ENOENT:		The name to query information about is currently not on
  *			the bus.
  * @ENOMEM:		Out of memory.
+ * @ENOMSG:		The queue is not empty, but no message with a matching
+ * 			priority is currently queued.
  * @ENOSYS:		The requested functionality is not available.
  * @ENOTSUPP:		The feature negotiation failed, a not supported feature
  *			was requested, or an unknown item type was received.



More information about the systemd-commits mailing list