[systemd-commits] src/bus-proxyd src/libsystemd

Daniel Mack zonque at kemper.freedesktop.org
Mon Oct 6 09:38:33 PDT 2014


 src/bus-proxyd/bus-proxyd.c         |    6 +++++-
 src/libsystemd/sd-bus/bus-control.c |   23 ++++++++++++++++++++---
 src/libsystemd/sd-bus/bus-kernel.c  |    7 +++++--
 src/libsystemd/sd-bus/kdbus.h       |   32 ++++++++++++++++++++++++++++++--
 4 files changed, 60 insertions(+), 8 deletions(-)

New commits:
commit d663f1b1a92a778bcdc68f29b8c08cb49431b4f7
Author: Daniel Mack <daniel at zonque.org>
Date:   Mon Oct 6 18:36:16 2014 +0200

    sd-bus: sync kdbus.h (ABI break)
    
    The KDBUS_CMD_FREE ioctl now uses a struct rather than a direct pointer
    to the offset to free.
    
    The KDBUS_CMD_MSG_CANCEL ioctl has also changes, but there's no user of
    it yet in systemd.

diff --git a/src/bus-proxyd/bus-proxyd.c b/src/bus-proxyd/bus-proxyd.c
index 5d58cd2..cbec049 100644
--- a/src/bus-proxyd/bus-proxyd.c
+++ b/src/bus-proxyd/bus-proxyd.c
@@ -730,6 +730,7 @@ static int process_driver(sd_bus *a, sd_bus *b, sd_bus_message *m) {
         } else if (sd_bus_message_is_method_call(m, "org.freedesktop.DBus", "ListQueuedOwners")) {
                 struct kdbus_cmd_name_list cmd = {};
                 struct kdbus_name_list *name_list;
+                struct kdbus_cmd_free cmd_free;
                 struct kdbus_cmd_name *name;
                 _cleanup_strv_free_ char **owners = NULL;
                 char *arg0;
@@ -773,7 +774,10 @@ static int process_driver(sd_bus *a, sd_bus *b, sd_bus_message *m) {
                         }
                 }
 
-                r = ioctl(a->input_fd, KDBUS_CMD_FREE, &cmd.offset);
+                cmd_free.flags = 0;
+                cmd_free.offset = cmd.offset;
+
+                r = ioctl(a->input_fd, KDBUS_CMD_FREE, &cmd_free);
                 if (r < 0)
                         return synthetic_reply_method_errno(m, r, NULL);
 
diff --git a/src/libsystemd/sd-bus/bus-control.c b/src/libsystemd/sd-bus/bus-control.c
index d9a53c7..dbd94fc 100644
--- a/src/libsystemd/sd-bus/bus-control.c
+++ b/src/libsystemd/sd-bus/bus-control.c
@@ -223,6 +223,23 @@ _public_ int sd_bus_release_name(sd_bus *bus, const char *name) {
                 return bus_release_name_dbus1(bus, name);
 }
 
+static int kernel_cmd_free(sd_bus *bus, uint64_t offset)
+{
+        struct kdbus_cmd_free cmd;
+        int r;
+
+        assert(bus);
+
+        cmd.flags = 0;
+        cmd.offset = offset;
+
+        r = ioctl(bus->input_fd, KDBUS_CMD_FREE, &cmd);
+        if (r < 0)
+                return -errno;
+
+        return 0;
+}
+
 static int kernel_get_list(sd_bus *bus, uint64_t flags, char ***x) {
         struct kdbus_cmd_name_list cmd = {};
         struct kdbus_name_list *name_list;
@@ -269,9 +286,9 @@ static int kernel_get_list(sd_bus *bus, uint64_t flags, char ***x) {
                 }
         }
 
-        r = ioctl(bus->input_fd, KDBUS_CMD_FREE, &cmd.offset);
+        r = kernel_cmd_free(bus, cmd.offset);
         if (r < 0)
-                return -errno;
+                return r;
 
         return 0;
 }
@@ -597,7 +614,7 @@ static int bus_get_owner_kdbus(
         r = 0;
 
 fail:
-        ioctl(bus->input_fd, KDBUS_CMD_FREE, &cmd->offset);
+        kernel_cmd_free(bus, cmd->offset);
         return r;
 }
 
diff --git a/src/libsystemd/sd-bus/bus-kernel.c b/src/libsystemd/sd-bus/bus-kernel.c
index 09ff25f..5ae1418 100644
--- a/src/libsystemd/sd-bus/bus-kernel.c
+++ b/src/libsystemd/sd-bus/bus-kernel.c
@@ -799,14 +799,17 @@ int bus_kernel_connect(sd_bus *b) {
 }
 
 static void close_kdbus_msg(sd_bus *bus, struct kdbus_msg *k) {
+        struct kdbus_cmd_free cmd;
         uint64_t off _alignas_(8);
         struct kdbus_item *d;
 
         assert(bus);
         assert(k);
 
-        off = (uint8_t *)k - (uint8_t *)bus->kdbus_buffer;
-        ioctl(bus->input_fd, KDBUS_CMD_FREE, &off);
+        cmd.flags = 0;
+        cmd.offset = (uint8_t *)k - (uint8_t *)bus->kdbus_buffer;
+
+        ioctl(bus->input_fd, KDBUS_CMD_FREE, &cmd);
 
         KDBUS_ITEM_FOREACH(d, k, items) {
 
diff --git a/src/libsystemd/sd-bus/kdbus.h b/src/libsystemd/sd-bus/kdbus.h
index 8011259..8994b56 100644
--- a/src/libsystemd/sd-bus/kdbus.h
+++ b/src/libsystemd/sd-bus/kdbus.h
@@ -444,6 +444,31 @@ struct kdbus_cmd_recv {
 } __attribute__((aligned(8)));
 
 /**
+ * struct kdbus_cmd_cancel - struct to cancel a synchronously pending message
+ * @cookie		The cookie of the pending message
+ * @flags		Flags for the free command. Currently unused.
+ *
+ * This struct is used with the KDBUS_CMD_CANCEL ioctl.
+ */
+struct kdbus_cmd_cancel {
+	__u64 cookie;
+	__u64 flags;
+} __attribute__((aligned(8)));
+
+/**
+ * struct kdbus_cmd_free - struct to free a slice of memory in the pool
+ * @offset		The offset of the memory slice, as returned by other
+ *			ioctls
+ * @flags		Flags for the free command. Currently unused.
+ *
+ * This struct is used with the KDBUS_CMD_FREE ioctl.
+ */
+struct kdbus_cmd_free {
+	__u64 offset;
+	__u64 flags;
+} __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
@@ -710,6 +735,7 @@ struct kdbus_conn_info {
  */
 struct kdbus_cmd_update {
 	__u64 size;
+	__u64 flags;
 	struct kdbus_item items[0];
 } __attribute__((aligned(8)));
 
@@ -807,8 +833,10 @@ enum kdbus_ioctl_type {
 					      struct kdbus_msg),
 	KDBUS_CMD_MSG_RECV =		_IOWR(KDBUS_IOCTL_MAGIC, 0x41,
 					      struct kdbus_cmd_recv),
-	KDBUS_CMD_MSG_CANCEL =		_IOW(KDBUS_IOCTL_MAGIC, 0x42, __u64 *),
-	KDBUS_CMD_FREE =		_IOW(KDBUS_IOCTL_MAGIC, 0x43, __u64 *),
+	KDBUS_CMD_MSG_CANCEL =		_IOW(KDBUS_IOCTL_MAGIC, 0x42,
+					     struct kdbus_cmd_cancel),
+	KDBUS_CMD_FREE =		_IOW(KDBUS_IOCTL_MAGIC, 0x43,
+					     struct kdbus_cmd_free),
 
 	KDBUS_CMD_NAME_ACQUIRE =	_IOWR(KDBUS_IOCTL_MAGIC, 0x50,
 					      struct kdbus_cmd_name),



More information about the systemd-commits mailing list