X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Funit.c;h=c0c3ce90a7af56d01307cde4b90a74d69ba653fb;hb=78edb35ab4f4227485cb9ec816b43c37e0d5e62a;hp=2525f49980ec2a584ab4931d76d9772a120b252f;hpb=c1b6628d64e5340d905d974bb95d673a4aae60c1;p=elogind.git diff --git a/src/core/unit.c b/src/core/unit.c index 2525f4998..c0c3ce90a 100644 --- a/src/core/unit.c +++ b/src/core/unit.c @@ -1304,7 +1304,7 @@ static void check_unneeded_dependencies(Unit *u) { unit_check_unneeded(other); } -void unit_trigger_on_failure(Unit *u) { +void unit_start_on_failure(Unit *u) { Unit *other; Iterator i; @@ -1324,6 +1324,17 @@ void unit_trigger_on_failure(Unit *u) { } } +void unit_trigger_notify(Unit *u) { + Unit *other; + Iterator i; + + assert(u); + + SET_FOREACH(other, u->dependencies[UNIT_TRIGGERED_BY], i) + if (UNIT_VTABLE(other)->trigger_notify) + UNIT_VTABLE(other)->trigger_notify(other, u); +} + void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_success) { Manager *m; bool unexpected; @@ -1354,9 +1365,6 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_su u->active_enter_timestamp = ts; else if (UNIT_IS_ACTIVE_OR_RELOADING(os) && !UNIT_IS_ACTIVE_OR_RELOADING(ns)) u->active_exit_timestamp = ts; - - timer_unit_notify(u, ns); - path_unit_notify(u, ns); } if (UNIT_IS_INACTIVE_OR_FAILED(ns)) @@ -1461,7 +1469,7 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_su if (ns != os && ns == UNIT_FAILED) { log_notice_unit(u->id, "MESSAGE=Unit %s entered failed state.", u->id); - unit_trigger_on_failure(u); + unit_start_on_failure(u); } } @@ -1512,6 +1520,7 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_su } manager_recheck_journal(m); + unit_trigger_notify(u); /* Maybe we finished startup and are now ready for being * stopped because unneeded? */ @@ -1810,14 +1819,13 @@ static const char *resolve_template(Unit *u, const char *name, const char*path, if (u->instance) s = unit_name_replace_instance(name, u->instance); else { - char *i; + _cleanup_free_ char *i = NULL; i = unit_name_to_prefix(u->id); if (!i) return NULL; s = unit_name_replace_instance(name, i); - free(i); } if (!s) @@ -1930,7 +1938,7 @@ char *unit_dbus_path(Unit *u) { return unit_dbus_path_from_name(u->id); } -int unit_add_cgroup(Unit *u, CGroupBonding *b) { +static int unit_add_cgroup(Unit *u, CGroupBonding *b) { int r; assert(u); @@ -1972,15 +1980,30 @@ char *unit_default_cgroup_path(Unit *u) { assert(u); if (u->instance) { - _cleanup_free_ char *t = NULL; + _cleanup_free_ char *t = NULL, *escaped_template = NULL, *escaped_instance = NULL; t = unit_name_template(u->id); if (!t) return NULL; - return strjoin(u->manager->cgroup_hierarchy, "/", t, "/", u->instance, NULL); - } else - return strjoin(u->manager->cgroup_hierarchy, "/", u->id, NULL); + escaped_template = cg_escape(t); + if (!escaped_template) + return NULL; + + escaped_instance = cg_escape(u->id); + if (!escaped_instance) + return NULL; + + return strjoin(u->manager->cgroup_hierarchy, "/", escaped_template, "/", escaped_instance, NULL); + } else { + _cleanup_free_ char *escaped = NULL; + + escaped = cg_escape(u->id); + if (!escaped) + return NULL; + + return strjoin(u->manager->cgroup_hierarchy, "/", escaped, NULL); + } } int unit_add_cgroup_from_text(Unit *u, const char *name, bool overwrite, CGroupBonding **ret) { @@ -2077,6 +2100,9 @@ static int unit_add_one_default_cgroup(Unit *u, const char *controller) { assert(u); + if (controller && !cg_controller_is_valid(controller, true)) + return -EINVAL; + if (!controller) controller = SYSTEMD_CGROUP_CONTROLLER; @@ -2179,13 +2205,15 @@ int unit_add_cgroup_attribute( controller = c; } - if (!controller || streq(controller, SYSTEMD_CGROUP_CONTROLLER)) + if (!controller || + streq(controller, SYSTEMD_CGROUP_CONTROLLER) || + streq(controller, "systemd")) return -EINVAL; if (!filename_is_safe(name)) return -EINVAL; - if (!filename_is_safe(controller)) + if (!cg_controller_is_valid(controller, false)) return -EINVAL; /* Check if this attribute already exists. Note that we will @@ -2253,42 +2281,39 @@ int unit_add_cgroup_attribute( } int unit_load_related_unit(Unit *u, const char *type, Unit **_found) { - char *t; + _cleanup_free_ char *t = NULL; int r; assert(u); assert(type); assert(_found); - if (!(t = unit_name_change_suffix(u->id, type))) + t = unit_name_change_suffix(u->id, type); + if (!t) return -ENOMEM; assert(!unit_has_name(u, t)); r = manager_load_unit(u->manager, t, NULL, NULL, _found); - free(t); - assert(r < 0 || *_found != u); - return r; } int unit_get_related_unit(Unit *u, const char *type, Unit **_found) { + _cleanup_free_ char *t = NULL; Unit *found; - char *t; assert(u); assert(type); assert(_found); - if (!(t = unit_name_change_suffix(u->id, type))) + t = unit_name_change_suffix(u->id, type); + if (!t) return -ENOMEM; assert(!unit_has_name(u, t)); found = manager_get_unit(u->manager, t); - free(t); - if (!found) return -ENOENT;