X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fdbus-unit.c;h=735e5a53f275252b20b235d2b35a7b6cffe1868a;hp=17ca7bdd8965bc51dd5da46fc5e60496c9457195;hb=b708e7cea941538bfd5e20ce0a723c19b7da7d1d;hpb=5e8d1c9a9f15b7453474dc4879bdb4021c3f50a1 diff --git a/src/dbus-unit.c b/src/dbus-unit.c index 17ca7bdd8..735e5a53f 100644 --- a/src/dbus-unit.c +++ b/src/dbus-unit.c @@ -24,6 +24,7 @@ #include "dbus.h" #include "log.h" #include "dbus-unit.h" +#include "bus-errors.h" const char bus_unit_interface[] = BUS_UNIT_INTERFACE; @@ -253,8 +254,6 @@ int bus_unit_append_cgroups(Manager *m, DBusMessageIter *i, const char *property return 0; } -DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_unit_append_kill_mode, kill_mode, KillMode); - static DBusHandlerResult bus_unit_message_dispatch(Unit *u, DBusConnection *connection, DBusMessage *message) { DBusMessage *reply = NULL; Manager *m = u->meta.manager; @@ -272,6 +271,8 @@ static DBusHandlerResult bus_unit_message_dispatch(Unit *u, DBusConnection *conn job_type = JOB_RELOAD; else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Unit", "Restart")) job_type = JOB_RESTART; + else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Unit", "TryRestart")) + job_type = JOB_TRY_RESTART; else if (UNIT_VTABLE(u)->bus_message_handler) return UNIT_VTABLE(u)->bus_message_handler(u, connection, message); else @@ -283,8 +284,10 @@ static DBusHandlerResult bus_unit_message_dispatch(Unit *u, DBusConnection *conn Job *j; int r; - if (job_type == JOB_START && u->meta.only_by_dependency) - return bus_send_error_reply(m, connection, message, NULL, -EPERM); + if (job_type == JOB_START && u->meta.only_by_dependency) { + dbus_set_error(&error, BUS_ERROR_ONLY_BY_DEPENDENCY, "Unit may be activated by dependency only."); + return bus_send_error_reply(m, connection, message, &error, -EPERM); + } if (!dbus_message_get_args( message, @@ -293,11 +296,13 @@ static DBusHandlerResult bus_unit_message_dispatch(Unit *u, DBusConnection *conn DBUS_TYPE_INVALID)) return bus_send_error_reply(m, connection, message, &error, -EINVAL); - if ((mode = job_mode_from_string(smode)) == _JOB_MODE_INVALID) - return bus_send_error_reply(m, connection, message, NULL, -EINVAL); + 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); + } - if ((r = manager_add_job(m, job_type, u, mode, true, &j)) < 0) - return bus_send_error_reply(m, connection, message, NULL, r); + if ((r = manager_add_job(m, job_type, u, mode, true, &error, &j)) < 0) + return bus_send_error_reply(m, connection, message, &error, r); if (!(reply = dbus_message_new_method_return(message))) goto oom; @@ -343,11 +348,6 @@ static DBusHandlerResult bus_unit_message_handler(DBusConnection *connection, DB assert(message); assert(m); - log_debug("Got D-Bus request: %s.%s() on %s", - dbus_message_get_interface(message), - dbus_message_get_member(message), - dbus_message_get_path(message)); - if ((r = manager_get_unit_from_dbus_path(m, dbus_message_get_path(message), &u)) < 0) { if (r == -ENOMEM) @@ -371,12 +371,13 @@ void bus_unit_send_change_signal(Unit *u) { DBusMessage *m = NULL; assert(u); - assert(u->meta.in_dbus_queue); - LIST_REMOVE(Meta, dbus_queue, u->meta.manager->dbus_unit_queue, &u->meta); - u->meta.in_dbus_queue = false; + if (u->meta.in_dbus_queue) { + LIST_REMOVE(Meta, dbus_queue, u->meta.manager->dbus_unit_queue, &u->meta); + u->meta.in_dbus_queue = false; + } - if (set_isempty(u->meta.manager->subscribed)) { + if (!bus_has_subscriber(u->meta.manager)) { u->meta.sent_dbus_new_signal = true; return; } @@ -427,7 +428,7 @@ void bus_unit_send_removed_signal(Unit *u) { assert(u); - if (set_isempty(u->meta.manager->subscribed)) + if (!bus_has_subscriber(u->meta.manager)) return; if (!u->meta.sent_dbus_new_signal)