X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;ds=sidebyside;f=unit.c;h=cb9fe7cdaaa6429c2de4dc52cd142c62ad8eb5a4;hb=65d2ebdc3408c81a947de8712b37b9398d955465;hp=c27e4ec902c74ed793b5f9fbaf1837900ad75c1c;hpb=c1e1601e8c6cace85b19a0eebe50076e5d119688;p=elogind.git diff --git a/unit.c b/unit.c index c27e4ec90..cb9fe7cda 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;