From 7898b0cf7ec1a30454538b415e25d544ecee5d5b Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 12 Feb 2010 02:40:28 +0100 Subject: [PATCH] unit: if start is called for a non-startable service and it is around, return EALREADY, don't refuse --- unit.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/unit.c b/unit.c index c27e4ec..cb9fe7c 100644 --- a/unit.c +++ b/unit.c @@ -478,13 +478,18 @@ int unit_start(Unit *u) { assert(u); - if (!UNIT_VTABLE(u)->start) - return -EBADR; - + /* If this is already (being) started, then this will + * succeed. Note that this will even succeed if this unit is + * not startable by the user. This is relied on to detect when + * we need to wait for units and when waiting is finished. */ state = unit_active_state(u); if (UNIT_IS_ACTIVE_OR_RELOADING(state)) return -EALREADY; + /* If it is stopped, but we cannot start it, then fail */ + if (!UNIT_VTABLE(u)->start) + return -EBADR; + /* We don't suppress calls to ->start() here when we are * already starting, to allow this request to be used as a * "hurry up" call, for example when the unit is in some "auto @@ -511,13 +516,13 @@ int unit_stop(Unit *u) { assert(u); - if (!UNIT_VTABLE(u)->stop) - return -EBADR; - state = unit_active_state(u); if (state == UNIT_INACTIVE) return -EALREADY; + if (!UNIT_VTABLE(u)->stop) + return -EBADR; + if (state == UNIT_DEACTIVATING) return 0; -- 2.39.2