diff options
author | Lennart Poettering <lennart@poettering.net> | 2015-09-05 20:21:46 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2015-09-05 20:27:52 +0200 |
commit | 8ff4d2ab0d4758e914aea6d86154d85f2b2c787f (patch) | |
tree | c2aad8dec5154f193f8ad6a83c5bc173519a4faa /src | |
parent | 9ce56418b1ff83303c607a7759e8830ec73dbc19 (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.
Diffstat (limited to 'src')
-rw-r--r-- | src/core/unit.c | 14 |
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; } |