From 0faacd470dfbd24f4c6504da6f04213aa05f9d19 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 12 Dec 2014 21:05:32 +0100 Subject: unit: handle nicely of certain unit types are not supported on specific systems Containers do not really support .device, .automount or .swap units; Systems compiled without support for swap do not support .swap units; Systems without kdbus do not support .busname units. With this change attempts to start a unsupported unit types will result in an immediate "unsupported" job result, which is a lot more descriptive then before. Also, attempts to start device units in containers will now immediately fail instead of causing jobs to be enqueued that never go away. --- src/core/unit.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'src/core/unit.c') diff --git a/src/core/unit.c b/src/core/unit.c index fe0dfb2083..8cec0e7e7f 100644 --- a/src/core/unit.c +++ b/src/core/unit.c @@ -1453,6 +1453,9 @@ int unit_start(Unit *u) { unit_status_log_starting_stopping_reloading(u, JOB_START); unit_status_print_starting_stopping(u, JOB_START); + if (UNIT_VTABLE(u)->supported && !UNIT_VTABLE(u)->supported(u->manager)) + return -ENOTSUP; + /* If it is stopped, but we cannot start it, then fail */ if (!UNIT_VTABLE(u)->start) return -EBADR; @@ -1496,9 +1499,9 @@ int unit_stop(Unit *u) { if (UNIT_IS_INACTIVE_OR_FAILED(state)) return -EALREADY; - if ((following = unit_following(u))) { - log_unit_debug(u->id, "Redirecting stop request from %s to %s.", - u->id, following->id); + following = unit_following(u); + if (following) { + log_unit_debug(u->id, "Redirecting stop request from %s to %s.", u->id, following->id); return unit_stop(following); } @@ -1535,15 +1538,13 @@ int unit_reload(Unit *u) { return -EALREADY; if (state != UNIT_ACTIVE) { - log_unit_warning(u->id, "Unit %s cannot be reloaded because it is inactive.", - u->id); + log_unit_warning(u->id, "Unit %s cannot be reloaded because it is inactive.", u->id); return -ENOEXEC; } following = unit_following(u); if (following) { - log_unit_debug(u->id, "Redirecting reload request from %s to %s.", - u->id, following->id); + log_unit_debug(u->id, "Redirecting reload request from %s to %s.", u->id, following->id); return unit_reload(following); } -- cgit v1.2.3-54-g00ecf