X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fdbus-unit.c;h=d25f325013973deee12acb7c13f37a7bc65a5a02;hp=840eaa571fe4e27cd0ebb6ed3d6e25f952e1d3e7;hb=30609d9c187331640125d6b7e3c650330304b383;hpb=398ef8ba0266cca453d90a90b3a2aa1caa44189f diff --git a/src/dbus-unit.c b/src/dbus-unit.c index 840eaa571..d25f32501 100644 --- a/src/dbus-unit.c +++ b/src/dbus-unit.c @@ -47,6 +47,24 @@ int bus_unit_append_names(Manager *m, DBusMessageIter *i, const char *property, return 0; } +int bus_unit_append_following(Manager *m, DBusMessageIter *i, const char *property, void *data) { + Unit *u = data, *f; + const char *d; + + assert(m); + assert(i); + assert(property); + assert(u); + + f = unit_following(u); + d = f ? f->meta.id : ""; + + if (!dbus_message_iter_append_basic(i, DBUS_TYPE_STRING, &d)) + return -ENOMEM; + + return 0; +} + int bus_unit_append_dependencies(Manager *m, DBusMessageIter *i, const char *property, void *data) { Unit *u; Iterator j; @@ -128,7 +146,8 @@ int bus_unit_append_can_start(Manager *m, DBusMessageIter *i, const char *proper assert(property); assert(u); - b = unit_can_start(u); + b = unit_can_start(u) && + !u->meta.only_by_dependency; if (!dbus_message_iter_append_basic(i, DBUS_TYPE_BOOLEAN, &b)) return -ENOMEM; @@ -254,7 +273,22 @@ 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); +int bus_unit_append_need_daemon_reload(Manager *m, DBusMessageIter *i, const char *property, void *data) { + Unit *u = data; + dbus_bool_t b; + + assert(m); + assert(i); + assert(property); + assert(u); + + b = unit_need_daemon_reload(u); + + if (!dbus_message_iter_append_basic(i, DBUS_TYPE_BOOLEAN, &b)) + return -ENOMEM; + + return 0; +} static DBusHandlerResult bus_unit_message_dispatch(Unit *u, DBusConnection *connection, DBusMessage *message) { DBusMessage *reply = NULL; @@ -262,6 +296,7 @@ static DBusHandlerResult bus_unit_message_dispatch(Unit *u, DBusConnection *conn DBusError error; JobType job_type = _JOB_TYPE_INVALID; char *path = NULL; + bool reload_if_possible = false; dbus_error_init(&error); @@ -275,7 +310,20 @@ static DBusHandlerResult bus_unit_message_dispatch(Unit *u, DBusConnection *conn 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) + else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Unit", "ReloadOrRestart")) { + reload_if_possible = true; + job_type = JOB_RESTART; + } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Unit", "ReloadOrTryRestart")) { + reload_if_possible = true; + job_type = JOB_TRY_RESTART; + } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Unit", "ResetMaintenance")) { + + unit_reset_maintenance(u); + + if (!(reply = dbus_message_new_method_return(message))) + goto oom; + + } else if (UNIT_VTABLE(u)->bus_message_handler) return UNIT_VTABLE(u)->bus_message_handler(u, connection, message); else return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; @@ -298,6 +346,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 (reload_if_possible && unit_can_reload(u)) { + if (job_type == JOB_RESTART) + job_type = JOB_RELOAD_OR_START; + else if (job_type == JOB_TRY_RESTART) + job_type = JOB_RELOAD; + } + 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); @@ -373,10 +428,11 @@ 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 (!bus_has_subscriber(u->meta.manager)) { u->meta.sent_dbus_new_signal = true;