X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fdbus-unit.c;h=2d5924219cd22ddf718efa5d4c2bc03c73208017;hp=d25f325013973deee12acb7c13f37a7bc65a5a02;hb=19b68260aa39abceedddbb4f602ba2f90007521c;hpb=a7f241db3f1ae96ab2708092e1b31d2feb989947 diff --git a/src/dbus-unit.c b/src/dbus-unit.c index d25f32501..2d5924219 100644 --- a/src/dbus-unit.c +++ b/src/dbus-unit.c @@ -147,7 +147,28 @@ int bus_unit_append_can_start(Manager *m, DBusMessageIter *i, const char *proper assert(u); b = unit_can_start(u) && - !u->meta.only_by_dependency; + !u->meta.refuse_manual_start; + + if (!dbus_message_iter_append_basic(i, DBUS_TYPE_BOOLEAN, &b)) + return -ENOMEM; + + return 0; +} + +int bus_unit_append_can_stop(Manager *m, DBusMessageIter *i, const char *property, void *data) { + Unit *u = data; + dbus_bool_t b; + + assert(m); + assert(i); + assert(property); + assert(u); + + /* On the lower levels we assume that every unit we can start + * we can also stop */ + + b = unit_can_start(u) && + !u->meta.refuse_manual_stop; if (!dbus_message_iter_append_basic(i, DBUS_TYPE_BOOLEAN, &b)) return -ENOMEM; @@ -334,8 +355,11 @@ static DBusHandlerResult bus_unit_message_dispatch(Unit *u, DBusConnection *conn Job *j; int r; - 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."); + if ((job_type == JOB_START && u->meta.refuse_manual_start) || + (job_type == JOB_STOP && u->meta.refuse_manual_stop) || + ((job_type == JOB_RESTART || job_type == JOB_TRY_RESTART) && + (u->meta.refuse_manual_start || u->meta.refuse_manual_stop))) { + dbus_set_error(&error, BUS_ERROR_ONLY_BY_DEPENDENCY, "Operation refused, may be requested by dependency only."); return bus_send_error_reply(m, connection, message, &error, -EPERM); } @@ -434,6 +458,9 @@ void bus_unit_send_change_signal(Unit *u) { u->meta.in_dbus_queue = false; } + if (!u->meta.id) + return; + if (!bus_has_subscriber(u->meta.manager)) { u->meta.sent_dbus_new_signal = true; return; @@ -491,6 +518,9 @@ void bus_unit_send_removed_signal(Unit *u) { if (!u->meta.sent_dbus_new_signal) bus_unit_send_change_signal(u); + if (!u->meta.id) + return; + if (!(p = unit_dbus_path(u))) goto oom;