X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Funit.c;h=359cb2d08478b928fb0410b4a98ebdeb80a0f38a;hb=fc7a744cc44cdb80bf9bc6304fc3f80ca2cb65f9;hp=edc636412d98f682b62a6ca973c35783f347fd8b;hpb=8c4dd542afde23d21d736b24b5ab66c25ab091e8;p=elogind.git diff --git a/src/unit.c b/src/unit.c index edc636412..359cb2d08 100644 --- a/src/unit.c +++ b/src/unit.c @@ -556,8 +556,12 @@ int unit_add_exec_dependencies(Unit *u, ExecContext *c) { if (c->std_output != EXEC_OUTPUT_KMSG && c->std_output != EXEC_OUTPUT_SYSLOG && + c->std_output != EXEC_OUTPUT_KMSG_AND_CONSOLE && + c->std_output != EXEC_OUTPUT_SYSLOG_AND_CONSOLE && c->std_error != EXEC_OUTPUT_KMSG && - c->std_error != EXEC_OUTPUT_SYSLOG) + c->std_error != EXEC_OUTPUT_SYSLOG_AND_CONSOLE && + c->std_error != EXEC_OUTPUT_KMSG && + c->std_error != EXEC_OUTPUT_SYSLOG_AND_CONSOLE) return 0; /* If syslog or kernel logging is requested, make sure our own @@ -732,7 +736,7 @@ int unit_add_default_target_dependency(Unit *u, Unit *target) { if (target->meta.type != UNIT_TARGET) return 0; - /* Only add the dependency if boths units are loaded, so that + /* Only add the dependency if both units are loaded, so that * that loop check below is reliable */ if (u->meta.load_state != UNIT_LOADED || target->meta.load_state != UNIT_LOADED) @@ -1067,7 +1071,17 @@ static void retroactively_stop_dependencies(Unit *u) { unit_check_unneeded(other); } -void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns) { +void unit_trigger_on_failure(Unit *u) { + Unit *other; + Iterator i; + + assert(u); + + SET_FOREACH(other, u->meta.dependencies[UNIT_ON_FAILURE], i) + manager_add_job(u->meta.manager, JOB_START, other, JOB_REPLACE, true, NULL, NULL); +} + +void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_success) { dual_timestamp ts; bool unexpected; @@ -1110,7 +1124,7 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns) { job_add_to_run_queue(u->meta.job); /* Let's check whether this state change constitutes a - * finished job, or maybe cotradicts a running job and + * finished job, or maybe contradicts a running job and * hence needs to invalidate jobs. */ switch (u->meta.job->type) { @@ -1119,12 +1133,12 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns) { case JOB_VERIFY_ACTIVE: if (UNIT_IS_ACTIVE_OR_RELOADING(ns)) - job_finish_and_invalidate(u->meta.job, true); + job_finish_and_invalidate(u->meta.job, JOB_DONE); else if (u->meta.job->state == JOB_RUNNING && ns != UNIT_ACTIVATING) { unexpected = true; if (UNIT_IS_INACTIVE_OR_FAILED(ns)) - job_finish_and_invalidate(u->meta.job, ns != UNIT_FAILED); + job_finish_and_invalidate(u->meta.job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE); } break; @@ -1134,12 +1148,12 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns) { if (u->meta.job->state == JOB_RUNNING) { if (ns == UNIT_ACTIVE) - job_finish_and_invalidate(u->meta.job, true); + job_finish_and_invalidate(u->meta.job, reload_success ? JOB_DONE : JOB_FAILED); else if (ns != UNIT_ACTIVATING && ns != UNIT_RELOADING) { unexpected = true; if (UNIT_IS_INACTIVE_OR_FAILED(ns)) - job_finish_and_invalidate(u->meta.job, ns != UNIT_FAILED); + job_finish_and_invalidate(u->meta.job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE); } } @@ -1150,10 +1164,10 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns) { case JOB_TRY_RESTART: if (UNIT_IS_INACTIVE_OR_FAILED(ns)) - job_finish_and_invalidate(u->meta.job, true); + job_finish_and_invalidate(u->meta.job, JOB_DONE); else if (u->meta.job->state == JOB_RUNNING && ns != UNIT_DEACTIVATING) { unexpected = true; - job_finish_and_invalidate(u->meta.job, false); + job_finish_and_invalidate(u->meta.job, JOB_FAILED); } break; @@ -1179,13 +1193,8 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns) { } if (ns != os && ns == UNIT_FAILED) { - Iterator i; - Unit *other; - - SET_FOREACH(other, u->meta.dependencies[UNIT_ON_FAILURE], i) - manager_add_job(u->meta.manager, JOB_START, other, JOB_REPLACE, true, NULL, NULL); - log_notice("Unit %s entered failed state.", u->meta.id); + unit_trigger_on_failure(u); } /* Some names are special */ @@ -1194,7 +1203,7 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns) { /* The bus just might have become available, * hence try to connect to it, if we aren't * yet connected. */ - bus_init(u->meta.manager); + bus_init(u->meta.manager, true); if (unit_has_name(u, SPECIAL_SYSLOG_SERVICE)) /* The syslog daemon just might have become @@ -1682,7 +1691,6 @@ char *unit_dbus_path(Unit *u) { } int unit_add_cgroup(Unit *u, CGroupBonding *b) { - CGroupBonding *l; int r; assert(u); @@ -1697,12 +1705,16 @@ int unit_add_cgroup(Unit *u, CGroupBonding *b) { /* Ensure this hasn't been added yet */ assert(!b->unit); - l = hashmap_get(u->meta.manager->cgroup_bondings, b->path); - LIST_PREPEND(CGroupBonding, by_path, l, b); + if (streq(b->controller, SYSTEMD_CGROUP_CONTROLLER)) { + CGroupBonding *l; - if ((r = hashmap_replace(u->meta.manager->cgroup_bondings, b->path, l)) < 0) { - LIST_REMOVE(CGroupBonding, by_path, l, b); - return r; + l = hashmap_get(u->meta.manager->cgroup_bondings, b->path); + LIST_PREPEND(CGroupBonding, by_path, l, b); + + if ((r = hashmap_replace(u->meta.manager->cgroup_bondings, b->path, l)) < 0) { + LIST_REMOVE(CGroupBonding, by_path, l, b); + return r; + } } LIST_PREPEND(CGroupBonding, by_unit, u->meta.cgroup_bondings, b); @@ -1767,8 +1779,7 @@ int unit_add_cgroup_from_text(Unit *u, const char *name) { b->controller = controller; b->path = path; - b->only_us = false; - b->clean_up = false; + b->ours = false; if ((r = unit_add_cgroup(u, b)) < 0) goto fail; @@ -1783,25 +1794,29 @@ fail: return r; } -int unit_add_default_cgroup(Unit *u) { - CGroupBonding *b; +static int unit_add_one_default_cgroup(Unit *u, const char *controller) { + CGroupBonding *b = NULL; int r = -ENOMEM; assert(u); - /* Adds in the default cgroup data, if it wasn't specified yet */ + if (!controller) + controller = SYSTEMD_CGROUP_CONTROLLER; - if (unit_get_default_cgroup(u)) + if (cgroup_bonding_find_list(u->meta.cgroup_bondings, controller)) return 0; if (!(b = new0(CGroupBonding, 1))) return -ENOMEM; + if (!(b->controller = strdup(controller))) + goto fail; + if (!(b->path = default_cgroup_path(u))) goto fail; - b->clean_up = true; - b->only_us = true; + b->ours = true; + b->essential = streq(controller, SYSTEMD_CGROUP_CONTROLLER); if ((r = unit_add_cgroup(u, b)) < 0) goto fail; @@ -1816,6 +1831,24 @@ fail: return r; } +int unit_add_default_cgroups(Unit *u) { + char **c; + int r; + assert(u); + + /* Adds in the default cgroups, if they weren't specified + * otherwise. */ + + if ((r = unit_add_one_default_cgroup(u, NULL)) < 0) + return r; + + STRV_FOREACH(c, u->meta.manager->default_controllers) + if ((r = unit_add_one_default_cgroup(u, *c)) < 0) + return r; + + return 0; +} + CGroupBonding* unit_get_default_cgroup(Unit *u) { assert(u);