[systemd-commits] 2 commits - src/dbus.c src/systemctl.c

Lennart Poettering lennart at kemper.freedesktop.org
Mon Jun 14 19:24:38 PDT 2010


 src/dbus.c      |    2 +-
 src/systemctl.c |   53 ++++++++++++++++++++++++++++++++++++++++-------------
 2 files changed, 41 insertions(+), 14 deletions(-)

New commits:
commit 479ef5d398e4c7467396bdfcdbad3e121150cfd6
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Jun 15 04:24:30 2010 +0200

    systemctl: fix race in --block

diff --git a/src/systemctl.c b/src/systemctl.c
index 8a7a2de..b0fb7b2 100644
--- a/src/systemctl.c
+++ b/src/systemctl.c
@@ -447,13 +447,12 @@ static DBusHandlerResult wait_filter(DBusConnection *connection, DBusMessage *me
         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 }
 
-static int wait_for_jobs(DBusConnection *bus, Set *s) {
+static int enable_wait_for_jobs(DBusConnection *bus) {
         DBusError error;
         DBusMessage *m = NULL, *reply = NULL;
         int r;
 
         assert(bus);
-        assert(s);
 
         dbus_error_init(&error);
 
@@ -471,12 +470,6 @@ static int wait_for_jobs(DBusConnection *bus, Set *s) {
                 goto finish;
         }
 
-        if (!dbus_connection_add_filter(bus, wait_filter, s, NULL)) {
-                log_error("Failed to add filter.");
-                r = -ENOMEM;
-                goto finish;
-        }
-
         if (!(m = dbus_message_new_method_call(
                               "org.freedesktop.systemd1",
                               "/org/freedesktop/systemd1",
@@ -493,14 +486,10 @@ static int wait_for_jobs(DBusConnection *bus, Set *s) {
                 goto finish;
         }
 
-        while (!set_isempty(s) &&
-               dbus_connection_read_write_dispatch(bus, -1))
-                ;
-
         r = 0;
 
 finish:
-        /* This is slightly dirty, since we don't undo the filter or the matches. */
+        /* This is slightly dirty, since we don't undo the match registrations. */
 
         if (m)
                 dbus_message_unref(m);
@@ -513,6 +502,30 @@ finish:
         return r;
 }
 
+static int wait_for_jobs(DBusConnection *bus, Set *s) {
+        int r;
+
+        assert(bus);
+        assert(s);
+
+        if (!dbus_connection_add_filter(bus, wait_filter, s, NULL)) {
+                log_error("Failed to add filter.");
+                r = -ENOMEM;
+                goto finish;
+        }
+
+        while (!set_isempty(s) &&
+               dbus_connection_read_write_dispatch(bus, -1))
+                ;
+
+        r = 0;
+
+finish:
+        /* This is slightly dirty, since we don't undo the filter registration. */
+
+        return r;
+}
+
 static int start_unit(DBusConnection *bus, char **args, unsigned n) {
         DBusMessage *m = NULL, *reply = NULL;
         DBusError error;
@@ -532,6 +545,13 @@ static int start_unit(DBusConnection *bus, char **args, unsigned n) {
 
         mode = arg_replace ? "replace" : "fail";
 
+        if (arg_block) {
+                if ((r = enable_wait_for_jobs(bus)) < 0) {
+                        log_error("Could not watch jobs: %s", strerror(-r));
+                        goto finish;
+                }
+        }
+
         for (i = 1; i < n; i++) {
 
                 if (!(m = dbus_message_new_method_call(
@@ -628,6 +648,13 @@ static int isolate_unit(DBusConnection *bus, char **args, unsigned n) {
 
         dbus_error_init(&error);
 
+        if (arg_block) {
+                if ((r = enable_wait_for_jobs(bus)) < 0) {
+                        log_error("Could not watch jobs: %s", strerror(-r));
+                        goto finish;
+                }
+        }
+
         if (!(m = dbus_message_new_method_call(
                               "org.freedesktop.systemd1",
                               "/org/freedesktop/systemd1",
commit fd0d7f7a6ec746e8aa811f661c051cdf8f3a4c8e
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Jun 15 04:24:16 2010 +0200

    dbus: fix match

diff --git a/src/dbus.c b/src/dbus.c
index 69ed641..a4e350c 100644
--- a/src/dbus.c
+++ b/src/dbus.c
@@ -799,7 +799,7 @@ int bus_init_api(Manager *m) {
                            "type='signal',"
                            "sender='"DBUS_SERVICE_DBUS"',"
                            "interface='"DBUS_INTERFACE_DBUS"',"
-                           "member='NameOwnerChange',"
+                           "member='NameOwnerChanged',"
                            "path='"DBUS_PATH_DBUS"'",
                            &error);
 


More information about the systemd-commits mailing list