X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fsystemctl.c;h=4afe53e18d4d09ba0035070d373b26de2eec844d;hp=8a7a2de4031c6d1cd22563f9b1bcebdedd580516;hb=b08a35509c1e09ac3ec2de37a259ff0fbbe69928;hpb=7e4249b94e7f6edb9ffa842c3e790acee298594d diff --git a/src/systemctl.c b/src/systemctl.c index 8a7a2de40..4afe53e18 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", @@ -1316,7 +1343,8 @@ static int parse_argv(int argc, char *argv[]) { { "replace", no_argument, NULL, ARG_REPLACE }, { "session", no_argument, NULL, ARG_SESSION }, { "system", no_argument, NULL, ARG_SYSTEM }, - { "block", no_argument, NULL, ARG_BLOCK } + { "block", no_argument, NULL, ARG_BLOCK }, + { NULL, 0, NULL, 0 } }; int c; @@ -1370,7 +1398,6 @@ static int parse_argv(int argc, char *argv[]) { int main(int argc, char*argv[]) { - static const struct { const char* verb; const enum {