X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fcore%2Fdbus-unit.c;h=f5185057503aaeeddc26dc77ad16fd395c9959cb;hp=1611da0172daa336cb7fb5ef4adb19c4647cb9f7;hb=c2756a68401102786be343712c0c35acbd73d28d;hpb=8e2af478402414f060bbc16e1b4bbe7de1779c13 diff --git a/src/core/dbus-unit.c b/src/core/dbus-unit.c index 1611da017..f51850575 100644 --- a/src/core/dbus-unit.c +++ b/src/core/dbus-unit.c @@ -415,7 +415,7 @@ static DBusHandlerResult bus_unit_message_dispatch(Unit *u, DBusConnection *conn SELINUX_UNIT_ACCESS_CHECK(u, connection, message, "start"); - r = bus_unit_set_properties(u, &iter, runtime ? UNIT_RUNTIME : UNIT_PERSISTENT, &error); + r = bus_unit_set_properties(u, &iter, runtime ? UNIT_RUNTIME : UNIT_PERSISTENT, true, &error); if (r < 0) return bus_send_error_reply(connection, message, &error, r); @@ -716,7 +716,7 @@ DBusHandlerResult bus_unit_queue_job( (type == JOB_START || type == JOB_RESTART || type == JOB_TRY_RESTART) ? "start" : type == JOB_STOP ? "stop" : "reload"); - if (type == JOB_STOP && u->load_state == UNIT_ERROR && unit_active_state(u) == UNIT_INACTIVE) { + if (type == JOB_STOP && (u->load_state == UNIT_NOT_FOUND || u->load_state == UNIT_ERROR) && unit_active_state(u) == UNIT_INACTIVE) { dbus_set_error(&error, BUS_ERROR_NO_SUCH_UNIT, "Unit %s not loaded.", u->id); return bus_send_error_reply(connection, message, &error, -EPERM); } @@ -764,7 +764,13 @@ oom: return DBUS_HANDLER_RESULT_NEED_MEMORY; } -int bus_unit_set_properties(Unit *u, DBusMessageIter *iter, UnitSetPropertiesMode mode, DBusError *error) { +int bus_unit_set_properties( + Unit *u, + DBusMessageIter *iter, + UnitSetPropertiesMode mode, + bool commit, + DBusError *error) { + bool for_real = false; DBusMessageIter sub; unsigned n = 0; @@ -773,6 +779,9 @@ int bus_unit_set_properties(Unit *u, DBusMessageIter *iter, UnitSetPropertiesMod assert(u); assert(iter); + if (u->transient) + mode &= UNIT_RUNTIME; + /* We iterate through the array twice. First run we just check * if all passed data is valid, second run actually applies * it. This is to implement transaction-like behaviour without @@ -783,7 +792,6 @@ int bus_unit_set_properties(Unit *u, DBusMessageIter *iter, UnitSetPropertiesMod return -EINVAL; dbus_message_iter_recurse(iter, &sub); - for (;;) { DBusMessageIter sub2, sub3; const char *name; @@ -827,10 +835,10 @@ int bus_unit_set_properties(Unit *u, DBusMessageIter *iter, UnitSetPropertiesMod n += for_real; } - if (n > 0 && UNIT_VTABLE(u)->bus_commit_properties) + if (commit && n > 0 && UNIT_VTABLE(u)->bus_commit_properties) UNIT_VTABLE(u)->bus_commit_properties(u); - return 0; + return n; } const BusProperty bus_unit_properties[] = { @@ -897,5 +905,6 @@ const BusProperty bus_unit_properties[] = { { "ConditionResult", bus_property_append_bool, "b", offsetof(Unit, condition_result) }, { "LoadError", bus_unit_append_load_error, "(ss)", 0 }, { "ControlGroup", bus_property_append_string, "s", offsetof(Unit, cgroup_path), true }, + { "Transient", bus_property_append_bool, "b", offsetof(Unit, transient) }, { NULL, } };