From 90bb85e140a238ce76f05c473e2eb68f147671f3 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 19 Oct 2010 21:53:19 +0200 Subject: fsck: atomically replace base.target by rescue.target/reboot.target when fsck fails --- src/dbus-manager.c | 45 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 37 insertions(+), 8 deletions(-) (limited to 'src/dbus-manager.c') diff --git a/src/dbus-manager.c b/src/dbus-manager.c index c700abbe22..52638435c2 100644 --- a/src/dbus-manager.c +++ b/src/dbus-manager.c @@ -48,6 +48,12 @@ " \n" \ " \n" \ " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ " \n" \ " \n" \ " \n" \ @@ -408,6 +414,8 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "StartUnit")) job_type = JOB_START; + else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "StartUnitReplace")) + job_type = JOB_START; else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "StopUnit")) job_type = JOB_STOP; else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "ReloadUnit")) @@ -910,19 +918,40 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, return bus_default_message_handler(m, connection, message, NULL, properties); if (job_type != _JOB_TYPE_INVALID) { - const char *name, *smode; + const char *name, *smode, *old_name = NULL; JobMode mode; Job *j; Unit *u; - - if (!dbus_message_get_args( - message, - &error, - DBUS_TYPE_STRING, &name, - DBUS_TYPE_STRING, &smode, - DBUS_TYPE_INVALID)) + bool b; + + if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "StartUnitReplace")) + b = dbus_message_get_args( + message, + &error, + DBUS_TYPE_STRING, &old_name, + DBUS_TYPE_STRING, &name, + DBUS_TYPE_STRING, &smode, + DBUS_TYPE_INVALID); + else + b = dbus_message_get_args( + message, + &error, + DBUS_TYPE_STRING, &name, + DBUS_TYPE_STRING, &smode, + DBUS_TYPE_INVALID); + + if (!b) return bus_send_error_reply(m, connection, message, &error, -EINVAL); + if (old_name) + if (!(u = manager_get_unit(m, old_name)) || + !u->meta.job || + u->meta.job->type != JOB_START) { + dbus_set_error(&error, BUS_ERROR_NO_SUCH_JOB, "No job queued for unit %s", old_name); + return bus_send_error_reply(m, connection, message, &error, -ENOENT); + } + + if ((mode = job_mode_from_string(smode)) == _JOB_MODE_INVALID) { dbus_set_error(&error, BUS_ERROR_INVALID_JOB_MODE, "Job mode %s is invalid.", smode); return bus_send_error_reply(m, connection, message, &error, -EINVAL); -- cgit v1.2.3-54-g00ecf