1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2024-12-25 23:21:33 +03:00

unit: don't accidently create ordering links to targets when default deps are off for either target and unit

This commit is contained in:
Lennart Poettering 2011-03-08 03:24:42 +01:00
parent d4a7e06dea
commit 21256a2b3b
2 changed files with 32 additions and 26 deletions

View File

@ -53,9 +53,19 @@ static void target_set_state(Target *t, TargetState state) {
}
static int target_add_default_dependencies(Target *t) {
static const UnitDependency deps[] = {
UNIT_REQUIRES,
UNIT_REQUIRES_OVERRIDABLE,
UNIT_REQUISITE,
UNIT_REQUISITE_OVERRIDABLE,
UNIT_WANTS,
UNIT_BIND_TO
};
Iterator i;
Unit *other;
int r;
unsigned k;
assert(t);
@ -64,17 +74,10 @@ static int target_add_default_dependencies(Target *t) {
* ordering manually we won't add anything in here to make
* sure we don't create a loop. */
SET_FOREACH(other, t->meta.dependencies[UNIT_REQUIRES], i)
if ((r = unit_add_default_target_dependency(other, UNIT(t))) < 0)
return r;
SET_FOREACH(other, t->meta.dependencies[UNIT_REQUIRES_OVERRIDABLE], i)
if ((r = unit_add_default_target_dependency(other, UNIT(t))) < 0)
return r;
SET_FOREACH(other, t->meta.dependencies[UNIT_WANTS], i)
if ((r = unit_add_default_target_dependency(other, UNIT(t))) < 0)
return r;
for (k = 0; k < ELEMENTSOF(deps); k++)
SET_FOREACH(other, t->meta.dependencies[deps[k]], i)
if ((r = unit_add_default_target_dependency(other, UNIT(t))) < 0)
return r;
/* Make sure targets are unloaded on shutdown */
return unit_add_dependency_by_name(UNIT(t), UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, NULL, true);

View File

@ -742,6 +742,12 @@ int unit_add_default_target_dependency(Unit *u, Unit *target) {
target->meta.load_state != UNIT_LOADED)
return 0;
/* If either side wants no automatic dependencies, then let's
* skip this */
if (!u->meta.default_dependencies ||
target->meta.default_dependencies)
return 0;
/* Don't create loops */
if (set_get(target->meta.dependencies[UNIT_BEFORE], u))
return 0;
@ -750,27 +756,24 @@ int unit_add_default_target_dependency(Unit *u, Unit *target) {
}
static int unit_add_default_dependencies(Unit *u) {
static const UnitDependency deps[] = {
UNIT_REQUIRED_BY,
UNIT_REQUIRED_BY_OVERRIDABLE,
UNIT_WANTED_BY,
UNIT_BOUND_BY
};
Unit *target;
Iterator i;
int r;
unsigned k;
assert(u);
SET_FOREACH(target, u->meta.dependencies[UNIT_REQUIRED_BY], i)
if ((r = unit_add_default_target_dependency(u, target)) < 0)
return r;
SET_FOREACH(target, u->meta.dependencies[UNIT_REQUIRED_BY_OVERRIDABLE], i)
if ((r = unit_add_default_target_dependency(u, target)) < 0)
return r;
SET_FOREACH(target, u->meta.dependencies[UNIT_WANTED_BY], i)
if ((r = unit_add_default_target_dependency(u, target)) < 0)
return r;
SET_FOREACH(target, u->meta.dependencies[UNIT_BOUND_BY], i)
if ((r = unit_add_default_target_dependency(u, target)) < 0)
return r;
for (k = 0; k < ELEMENTSOF(deps); k++)
SET_FOREACH(target, u->meta.dependencies[deps[k]], i)
if ((r = unit_add_default_target_dependency(u, target)) < 0)
return r;
return 0;
}