X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Funit.c;h=07978134de959889f213740bd55aaeffd80bb939;hb=6e8ebcc7de321bac0ba494365a85a19040654405;hp=2f8b92d3b5c08f3eba35efd63b769b3fb2d21b79;hpb=e983b76024342278a0377eae116c925f2567776e;p=elogind.git diff --git a/src/unit.c b/src/unit.c index 2f8b92d3b..07978134d 100644 --- a/src/unit.c +++ b/src/unit.c @@ -103,7 +103,7 @@ int unit_add_name(Unit *u, const char *text) { if (!s) return -ENOMEM; - if (!unit_name_is_valid(s)) { + if (!unit_name_is_valid(s, false)) { r = -EINVAL; goto fail; } @@ -375,8 +375,9 @@ void unit_free(Unit *u) { set_free_free(u->meta.names); - free(u->meta.instance); + condition_free_list(u->meta.conditions); + free(u->meta.instance); free(u); } @@ -640,6 +641,8 @@ void unit_dump(Unit *u, FILE *f, const char *prefix) { if (u->meta.job_timeout > 0) fprintf(f, "%s\tJob Timeout: %s\n", prefix, format_timespan(timespan, sizeof(timespan), u->meta.job_timeout)); + condition_dump_list(u->meta.conditions, f, prefix); + for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++) { Unit *other; @@ -841,6 +844,12 @@ int unit_start(Unit *u) { if (!UNIT_VTABLE(u)->start) return -EBADR; + /* If the conditions failed, don't do anything at all */ + if (!condition_test_list(u->meta.conditions)) { + log_debug("Starting of %s requested but condition failed. Ignoring.", u->meta.id); + return -EALREADY; + } + /* 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 @@ -2222,21 +2231,22 @@ UnitType unit_name_to_type(const char *n) { return _UNIT_TYPE_INVALID; } -bool unit_name_is_valid(const char *n) { +bool unit_name_is_valid(const char *n, bool template_ok) { UnitType t; t = unit_name_to_type(n); if (t < 0 || t >= _UNIT_TYPE_MAX) return false; - return unit_name_is_valid_no_type(n); + return unit_name_is_valid_no_type(n, template_ok); } static const char* const unit_load_state_table[_UNIT_LOAD_STATE_MAX] = { [UNIT_STUB] = "stub", [UNIT_LOADED] = "loaded", [UNIT_ERROR] = "error", - [UNIT_MERGED] = "merged" + [UNIT_MERGED] = "merged", + [UNIT_MASKED] = "masked" }; DEFINE_STRING_TABLE_LOOKUP(unit_load_state, UnitLoadState);