chiark / gitweb /
bus: rework synchronization logic
authorLennart Poettering <lennart@poettering.net>
Fri, 22 Mar 2013 00:49:56 +0000 (01:49 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 22 Mar 2013 00:49:56 +0000 (01:49 +0100)
Instead of allowing certain actions fail during authentication and
connection setup, implicitly synchronize on the connection to be set up
completely before returning.

src/libsystemd-bus/sd-bus.c
src/libsystemd-bus/sd-bus.h
src/libsystemd-bus/test-bus-chat.c

index 049bd356a06f10deac234bf0f60e8c2c7a0c3949..6a6d43fac0a03dd01eac4f38faf6527345601804 100644 (file)
@@ -35,6 +35,7 @@
 #include "bus-message.h"
 #include "bus-type.h"
 
+static int ensure_running(sd_bus *bus);
 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec);
 
 static void bus_free(sd_bus *b) {
@@ -778,27 +779,37 @@ int sd_bus_is_open(sd_bus *bus) {
         return bus->fd >= 0;
 }
 
-int sd_bus_is_running(sd_bus *bus) {
+int sd_bus_can_send(sd_bus *bus, char type) {
+        int r;
+
         if (!bus)
                 return -EINVAL;
 
-        if (bus->fd < 0)
-                return -ENOTCONN;
+        if (type == SD_BUS_TYPE_UNIX_FD) {
+                r = ensure_running(bus);
+                if (r < 0)
+                        return r;
 
-        return bus->state == BUS_RUNNING;
+                return bus->can_fds;
+        }
+
+        return bus_type_is_valid(type);
 }
 
-int sd_bus_can_send(sd_bus *bus, char type) {
+int sd_bus_get_peer(sd_bus *bus, sd_id128_t *peer) {
+        int r;
 
         if (!bus)
                 return -EINVAL;
-        if (bus->state != BUS_RUNNING && bus->state != BUS_HELLO)
-                return -EAGAIN;
+        if (!peer)
+                return -EINVAL;
 
-        if (type == SD_BUS_TYPE_UNIX_FD)
-                return bus->can_fds;
+        r = ensure_running(bus);
+        if (r < 0)
+                return r;
 
-        return bus_type_is_valid(type);
+        *peer = bus->peer;
+        return 0;
 }
 
 static int bus_seal_message(sd_bus *b, sd_bus_message *m) {
@@ -1243,22 +1254,15 @@ static int ensure_running(sd_bus *bus) {
 
         assert(bus);
 
-        r = sd_bus_is_running(bus);
-        if (r != 0)
-                return r;
+        if (bus->state == BUS_RUNNING)
+                return 1;
 
         for (;;) {
-                int k;
-
                 r = sd_bus_process(bus, NULL);
-
                 if (r < 0)
                         return r;
-
-                k = sd_bus_is_running(bus);
-                if (k != 0)
-                        return k;
-
+                if (bus->state == BUS_RUNNING)
+                        return 1;
                 if (r > 0)
                         continue;
 
index 3ea4acc76f8ba12d72576169535efde8217d5638..adc7f8e2bdd55553d0ad3a3e163f72a864d2c377 100644 (file)
@@ -35,8 +35,9 @@
  * - always verify container depth
  * - merge busctl into systemctl or so?
  * - add object handlers
- * - verify object paths
  * - implicitly add stub introspection calls
+ * - implement unix exec protocol
+ * - server side
  */
 
 typedef struct sd_bus sd_bus;
@@ -62,8 +63,8 @@ sd_bus *sd_bus_ref(sd_bus *bus);
 sd_bus *sd_bus_unref(sd_bus *bus);
 
 int sd_bus_is_open(sd_bus *bus);
-int sd_bus_is_running(sd_bus *bus);
 int sd_bus_can_send(sd_bus *bus, char type);
+int sd_bus_get_peer(sd_bus *bus, sd_id128_t *peer);
 
 int sd_bus_send(sd_bus *bus, sd_bus_message *m, uint64_t *serial);
 int sd_bus_send_with_reply(sd_bus *bus, sd_bus_message *m, sd_message_handler_t callback, void *userdata, uint64_t usec, uint64_t *serial);
index d8677cc9e8a490435bac773bec896b2c09e1c014..5f533cc6d075ebefc26ed0f1c7768f839bfc0a3c 100644 (file)
@@ -33,6 +33,7 @@
 
 static int server_init(sd_bus **_bus) {
         sd_bus *bus = NULL;
+        sd_id128_t id;
         int r;
 
         assert(_bus);
@@ -43,6 +44,16 @@ static int server_init(sd_bus **_bus) {
                 goto fail;
         }
 
+        r = sd_bus_get_peer(bus, &id);
+        if (r < 0) {
+                log_error("Failed to get peer ID: %s", strerror(-r));
+                goto fail;
+        }
+
+        log_info("Peer ID is " SD_ID128_FORMAT_STR ".", SD_ID128_FORMAT_VAL(id));
+        log_info("Can send file handles: %i", sd_bus_can_send(bus, 'h'));
+        log_info("Unique ID: %s", strna(sd_bus_get_unique_name(bus)));
+
         r = sd_bus_request_name(bus, "org.freedesktop.systemd.test", 0);
         if (r < 0) {
                 log_error("Failed to acquire name: %s", strerror(-r));