summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2015-09-05 20:21:46 +0200
committerLennart Poettering <lennart@poettering.net>2015-09-05 20:27:52 +0200
commit8ff4d2ab0d4758e914aea6d86154d85f2b2c787f (patch)
treec2aad8dec5154f193f8ad6a83c5bc173519a4faa
parent9ce56418b1ff83303c607a7759e8830ec73dbc19 (diff)
unit: make unit_can_start() more accurate
This funciton is exposed via CanStart on the bus, and should be as accurate as possible. Hence: make sure to return false for units of unit types not supported on the system, and for unit types where configuration failed to load. Also see #1105.
-rw-r--r--src/core/unit.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/core/unit.c b/src/core/unit.c
index a5714adf38..45ce1b172d 100644
--- a/src/core/unit.c
+++ b/src/core/unit.c
@@ -1416,9 +1416,14 @@ int unit_start(Unit *u) {
assert(u);
+ /* Units that aren't loaded cannot be started */
if (u->load_state != UNIT_LOADED)
return -EINVAL;
+ /* Units of types that aren't supported annot be started either */
+ if (!unit_supported(u))
+ return -EOPNOTSUPP;
+
/* If this is already 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
@@ -1451,9 +1456,6 @@ int unit_start(Unit *u) {
return unit_start(following);
}
- if (!unit_supported(u))
- return -EOPNOTSUPP;
-
/* If it is stopped, but we cannot start it, then fail */
if (!UNIT_VTABLE(u)->start)
return -EBADR;
@@ -1472,6 +1474,12 @@ int unit_start(Unit *u) {
bool unit_can_start(Unit *u) {
assert(u);
+ if (u->load_state != UNIT_LOADED)
+ return false;
+
+ if (!unit_supported(u))
+ return false;
+
return !!UNIT_VTABLE(u)->start;
}