chiark / gitweb /
sd-bus: let sd_bus_call() use the synchronous kdbus method
authorDaniel Mack <zonque@gmail.com>
Sat, 18 Jan 2014 19:09:14 +0000 (20:09 +0100)
committerDaniel Mack <zonque@gmail.com>
Sun, 19 Jan 2014 21:57:35 +0000 (22:57 +0100)
src/libsystemd/bus-kernel.c
src/libsystemd/bus-kernel.h
src/libsystemd/bus-message.h
src/libsystemd/sd-bus.c

index f85b4d5676ff252c0642e0dbd2082dc23d196727..5ace72440ff826247d6851174b8f133817756338 100644 (file)
@@ -251,7 +251,8 @@ static int bus_message_setup_kmsg(sd_bus *b, sd_bus_message *m) {
 
         m->kdbus->flags =
                 ((m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED) ? 0 : KDBUS_MSG_FLAGS_EXPECT_REPLY) |
-                ((m->header->flags & BUS_MESSAGE_NO_AUTO_START) ? KDBUS_MSG_FLAGS_NO_AUTO_START : 0);
+                ((m->header->flags & BUS_MESSAGE_NO_AUTO_START) ? KDBUS_MSG_FLAGS_NO_AUTO_START : 0) |
+                (m->reply_sync ? KDBUS_MSG_FLAGS_SYNC_REPLY : 0);
         m->kdbus->dst_id =
                 well_known ? 0 :
                 m->destination ? unique : KDBUS_DST_ID_BROADCAST;
@@ -788,6 +789,39 @@ int bus_kernel_write_message(sd_bus *bus, sd_bus_message *m) {
                 return 0;
         }
 
+        if (m->reply_sync) {
+                struct kdbus_msg *k;
+
+                k = (struct kdbus_msg *)((uint8_t *)bus->kdbus_buffer + m->kdbus->offset_reply);
+                r = bus_kernel_make_message(bus, k);
+                if (r < 0)
+                        return r;
+        }
+
+        return 1;
+}
+
+int bus_call_kernel(
+                sd_bus *bus,
+                sd_bus_message *m,
+                uint64_t usec,
+                sd_bus_error *error,
+                sd_bus_message **reply) {
+
+        int r;
+        uint64_t cookie;
+
+        m->reply_sync = !!reply;
+
+        r = sd_bus_send(bus, m, &cookie);
+        if (r < 0)
+                return r;
+
+        if (reply) {
+                assert(bus->rqueue_size > 0);
+                *reply = bus->rqueue[--bus->rqueue_size];
+        }
+
         return 1;
 }
 
index 2aba0bbe0a04dda3668d7bf1a8970e2b9fd36c6e..88954aa5cdaae2786db5b6c8a260ddb4a4f5e954 100644 (file)
@@ -62,6 +62,7 @@ int bus_kernel_take_fd(sd_bus *b);
 
 int bus_kernel_write_message(sd_bus *bus, sd_bus_message *m);
 int bus_kernel_read_message(sd_bus *bus);
+int bus_call_kernel(sd_bus *bus, sd_bus_message *m, uint64_t usec, sd_bus_error *error, sd_bus_message **reply);
 
 int bus_kernel_create_bus(const char *name, bool world, char **s);
 int bus_kernel_create_namespace(const char *name, char **s);
index 5322375ef1c576eb596e13bf7d009b85fa6143d5..efddc973459fb103a5098f2be62d68d11c1c6519 100644 (file)
@@ -107,6 +107,7 @@ struct sd_bus_message {
         bool free_fds:1;
         bool release_kdbus:1;
         bool poisoned:1;
+        bool reply_sync:1;
 
         struct bus_header *header;
         struct bus_body_part body;
index 95d80db2405c8698527c28a9fb5448d95cc340ac..fa045a67256ed65eba6e8b41b89ad7002002804b 100644 (file)
@@ -1720,41 +1720,19 @@ int bus_ensure_running(sd_bus *bus) {
         }
 }
 
-_public_ int sd_bus_call(
+static int bus_call_dbus1(
                 sd_bus *bus,
-                sd_bus_message *_m,
+                sd_bus_message *m,
                 uint64_t usec,
                 sd_bus_error *error,
                 sd_bus_message **reply) {
 
-        _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
         usec_t timeout;
         uint64_t cookie;
         unsigned i;
         int r;
 
-        assert_return(bus, -EINVAL);
-        assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
-        assert_return(m, -EINVAL);
-        assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
-        assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
-        assert_return(!bus_error_is_dirty(error), -EINVAL);
-        assert_return(!bus_pid_changed(bus), -ECHILD);
-
-        r = bus_ensure_running(bus);
-        if (r < 0)
-                return r;
-
         i = bus->rqueue_size;
-
-        r = bus_seal_message(bus, m, usec);
-        if (r < 0)
-                return r;
-
-        r = bus_remarshal_message(bus, &m);
-        if (r < 0)
-                return r;
-
         r = sd_bus_send(bus, m, &cookie);
         if (r < 0)
                 return r;
@@ -1853,6 +1831,42 @@ _public_ int sd_bus_call(
         }
 }
 
+_public_ int sd_bus_call(
+                sd_bus *bus,
+                sd_bus_message *_m,
+                uint64_t usec,
+                sd_bus_error *error,
+                sd_bus_message **reply) {
+
+        _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
+        int r;
+
+        assert_return(bus, -EINVAL);
+        assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
+        assert_return(m, -EINVAL);
+        assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
+        assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
+        assert_return(!bus_error_is_dirty(error), -EINVAL);
+        assert_return(!bus_pid_changed(bus), -ECHILD);
+
+        r = bus_ensure_running(bus);
+        if (r < 0)
+                return r;
+
+        r = bus_seal_message(bus, m, usec);
+        if (r < 0)
+                return r;
+
+        r = bus_remarshal_message(bus, &m);
+        if (r < 0)
+                return r;
+
+        if (bus->is_kernel)
+                return bus_call_kernel(bus, m, usec, error, reply);
+        else
+                return bus_call_dbus1(bus, m, usec, error, reply);
+}
+
 _public_ int sd_bus_get_fd(sd_bus *bus) {
 
         assert_return(bus, -EINVAL);