chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
util: introduce mkdir_p()
[elogind.git]
/
unit.c
diff --git
a/unit.c
b/unit.c
index 93c0d8d61a29bb442550d419e2331cbb5afb12c1..392be841d9866529e2941d20019d27d6b3dc28b9 100644
(file)
--- 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);
assert(other);
assert(u->meta.manager == other->meta.manager);
+ other = unit_follow_merge(other);
+
if (other == u)
return 0;
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 (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 */
return -EEXIST;
/* Merge names */
@@
-826,6
+829,8
@@
static void retroactively_stop_dependencies(Unit *u) {
}
void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns) {
}
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);
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:
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);
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);
job_finish_and_invalidate(u->meta.job, false);
+ }
break;
case JOB_RELOAD:
case JOB_RELOAD_OR_START:
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);
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);
job_finish_and_invalidate(u->meta.job, false);
+ }
break;
break;
@@
-889,13
+892,12
@@
void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns) {
case JOB_RESTART:
case JOB_TRY_RESTART:
case JOB_RESTART:
case JOB_TRY_RESTART:
- if (ns == UNIT_INACTIVE)
{
+ if (ns == UNIT_INACTIVE)
job_finish_and_invalidate(u->meta.job, true);
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);
job_finish_and_invalidate(u->meta.job, false);
+ }
break;
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 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)) {
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);
}
/* 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. */
/* The syslog daemon just got started, hence try to connect to it. */
+ log_info("Syslog became available, trying to reconnect.");
log_open_syslog();
log_open_syslog();
+ }
} else if (UNIT_IS_ACTIVE_OR_RELOADING(os) && !UNIT_IS_ACTIVE_OR_RELOADING(ns)) {
} 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);
};
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);