Unit *other;
int r;
- /* Imply ordering for requirement dependencies
- * on target units. */
+ /* Imply ordering for requirement dependencies on target
+ * units. Note that when the user created a contradicting
+ * 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_dependency(UNIT(t), UNIT_AFTER, other, true)) < 0)
- return r;
+ if (!set_get(t->meta.dependencies[UNIT_BEFORE], other))
+ if ((r = unit_add_dependency(UNIT(t), UNIT_AFTER, other, true)) < 0)
+ return r;
SET_FOREACH(other, t->meta.dependencies[UNIT_REQUIRES_OVERRIDABLE], i)
- if ((r = unit_add_dependency(UNIT(t), UNIT_AFTER, other, true)) < 0)
- return r;
+ if (!set_get(t->meta.dependencies[UNIT_BEFORE], other))
+ if ((r = unit_add_dependency(UNIT(t), UNIT_AFTER, other, true)) < 0)
+ return r;
SET_FOREACH(other, t->meta.dependencies[UNIT_WANTS], i)
- if ((r = unit_add_dependency(UNIT(t), UNIT_AFTER, other, true)) < 0)
- return r;
+ if (!set_get(t->meta.dependencies[UNIT_BEFORE], other))
+ if ((r = unit_add_dependency(UNIT(t), UNIT_AFTER, other, true)) < 0)
+ return r;
return 0;
}
return target_state_to_string(TARGET(u)->state);
}
-int target_get_runlevel(Target *t) {
-
- static const struct {
- const char *special;
- const int runlevel;
- } table[] = {
- { SPECIAL_RUNLEVEL5_TARGET, '5' },
- { SPECIAL_RUNLEVEL4_TARGET, '4' },
- { SPECIAL_RUNLEVEL3_TARGET, '3' },
- { SPECIAL_RUNLEVEL2_TARGET, '2' },
- { SPECIAL_RESCUE_TARGET, '1' },
- { SPECIAL_POWEROFF_TARGET, '0' },
- { SPECIAL_REBOOT_TARGET, '6' },
- };
-
- unsigned i;
-
- assert(t);
-
- /* Tries to determine if this is a SysV runlevel and returns
- * it if that is so. */
-
- for (i = 0; i < ELEMENTSOF(table); i++)
- if (unit_has_name(UNIT(t), table[i].special))
- return table[i].runlevel;
-
- return 0;
-}
-
static const char* const target_state_table[_TARGET_STATE_MAX] = {
[TARGET_DEAD] = "dead",
[TARGET_ACTIVE] = "active"