X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=unit.c;h=392be841d9866529e2941d20019d27d6b3dc28b9;hb=8b6c71206d32b11683e5e7cebc9acb467ba01b38;hp=93c0d8d61a29bb442550d419e2331cbb5afb12c1;hpb=2882c7eda072e218516df584d2489f996d01dcf6;p=elogind.git diff --git a/unit.c b/unit.c index 93c0d8d61..392be841d 100644 --- a/unit.c +++ b/unit.c @@ -394,6 +394,8 @@ int unit_merge(Unit *u, Unit *other) { assert(other); assert(u->meta.manager == other->meta.manager); + other = unit_follow_merge(other); + if (other == u) return 0; @@ -403,7 +405,8 @@ int unit_merge(Unit *u, Unit *other) { if (u->meta.type != u->meta.type) return -EINVAL; - if (other->meta.load_state != UNIT_STUB) + if (other->meta.load_state != UNIT_STUB && + other->meta.load_state != UNIT_FAILED) return -EEXIST; /* Merge names */ @@ -826,6 +829,8 @@ static void retroactively_stop_dependencies(Unit *u) { } void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns) { + bool unexpected = false; + assert(u); assert(os < _UNIT_ACTIVE_STATE_MAX); assert(ns < _UNIT_ACTIVE_STATE_MAX); @@ -862,26 +867,24 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns) { case JOB_START: case JOB_VERIFY_ACTIVE: - if (UNIT_IS_ACTIVE_OR_RELOADING(ns)) { + if (UNIT_IS_ACTIVE_OR_RELOADING(ns)) job_finish_and_invalidate(u->meta.job, true); - return; - } else if (ns == UNIT_ACTIVATING) - return; - else + else if (ns != UNIT_ACTIVATING) { + unexpected = true; job_finish_and_invalidate(u->meta.job, false); + } break; case JOB_RELOAD: case JOB_RELOAD_OR_START: - if (ns == UNIT_ACTIVE) { + if (ns == UNIT_ACTIVE) job_finish_and_invalidate(u->meta.job, true); - return; - } else if (ns == UNIT_ACTIVATING || ns == UNIT_ACTIVE_RELOADING) - return; - else + else if (ns != UNIT_ACTIVATING && ns != UNIT_ACTIVE_RELOADING) { + unexpected = true; job_finish_and_invalidate(u->meta.job, false); + } break; @@ -889,13 +892,12 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns) { case JOB_RESTART: case JOB_TRY_RESTART: - if (ns == UNIT_INACTIVE) { + if (ns == UNIT_INACTIVE) job_finish_and_invalidate(u->meta.job, true); - return; - } else if (ns == UNIT_DEACTIVATING) - return; - else + else if (ns != UNIT_DEACTIVATING) { + unexpected = true; job_finish_and_invalidate(u->meta.job, false); + } break; @@ -908,22 +910,27 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns) { /* If this state change happened without being requested by a * job, then let's retroactively start or stop dependencies */ - if (UNIT_IS_INACTIVE_OR_DEACTIVATING(os) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns)) - retroactively_start_dependencies(u); - else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns)) - retroactively_stop_dependencies(u); + if (unexpected) { + if (UNIT_IS_INACTIVE_OR_DEACTIVATING(os) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns)) + retroactively_start_dependencies(u); + else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns)) + retroactively_stop_dependencies(u); + } if (!UNIT_IS_ACTIVE_OR_RELOADING(os) && UNIT_IS_ACTIVE_OR_RELOADING(ns)) { if (unit_has_name(u, SPECIAL_DBUS_SERVICE)) { + log_info("D-Bus became available, trying to reconnect."); /* The bus just got started, hence try to connect to it. */ bus_init_system(u->meta.manager); bus_init_api(u->meta.manager); } - if (unit_has_name(u, SPECIAL_SYSLOG_SERVICE)) + if (unit_has_name(u, SPECIAL_SYSLOG_SERVICE)) { /* The syslog daemon just got started, hence try to connect to it. */ + log_info("Syslog became available, trying to reconnect."); log_open_syslog(); + } } else if (UNIT_IS_ACTIVE_OR_RELOADING(os) && !UNIT_IS_ACTIVE_OR_RELOADING(ns)) { @@ -1439,3 +1446,11 @@ static const char* const unit_dependency_table[_UNIT_DEPENDENCY_MAX] = { }; DEFINE_STRING_TABLE_LOOKUP(unit_dependency, UnitDependency); + +static const char* const kill_mode_table[_KILL_MODE_MAX] = { + [KILL_PROCESS] = "process", + [KILL_PROCESS_GROUP] = "process-group", + [KILL_CONTROL_GROUP] = "control-group" +}; + +DEFINE_STRING_TABLE_LOOKUP(kill_mode, KillMode);