chiark / gitweb /
unit: if start is called for a non-startable service and it is around, return EALREAD...
authorLennart Poettering <lennart@poettering.net>
Fri, 12 Feb 2010 01:40:28 +0000 (02:40 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 12 Feb 2010 01:40:28 +0000 (02:40 +0100)
unit.c

diff --git a/unit.c b/unit.c
index c27e4ec902c74ed793b5f9fbaf1837900ad75c1c..cb9fe7cdaaa6429c2de4dc52cd142c62ad8eb5a4 100644 (file)
--- 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;