if (state != old_state)
log_debug("%s changed %s -> %s",
- t->meta.id,
+ UNIT(t)->id,
target_state_to_string(old_state),
target_state_to_string(state));
- unit_notify(UNIT(t), state_translation_table[old_state], state_translation_table[state]);
+ unit_notify(UNIT(t), state_translation_table[old_state], state_translation_table[state], true);
}
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);
/* 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 (!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 (!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 (!set_get(t->meta.dependencies[UNIT_BEFORE], other))
- if ((r = unit_add_dependency(UNIT(t), UNIT_AFTER, other, true)) < 0)
+ for (k = 0; k < ELEMENTSOF(deps); k++)
+ SET_FOREACH(other, UNIT(t)->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_CONFLICTED_BY, SPECIAL_SHUTDOWN_TARGET, NULL, true);
-}
-
-static int target_add_getty_dependencies(Target *t) {
- char *n;
- int r;
-
- assert(t);
-
- if (!unit_has_name(UNIT(t), SPECIAL_GETTY_TARGET))
- return 0;
-
- /* Automatically add in a serial getty on the kernel
- * console */
- if (t->meta.manager->console) {
- log_debug("Automatically adding serial getty for %s", t->meta.manager->console);
- if (!(n = unit_name_replace_instance(SPECIAL_SERIAL_GETTY_SERVICE, t->meta.manager->console)))
- return -ENOMEM;
-
- r = unit_add_two_dependencies_by_name(UNIT(t), UNIT_AFTER, UNIT_WANTS, n, NULL, true);
- free(n);
-
- if (r < 0)
- return r;
- }
-
- /* Automatically add in a serial getty on the first
- * virtualizer console */
- if (access("/sys/class/tty/hvc0", F_OK) == 0) {
- log_debug("Automatic adding serial getty for hvc0");
- if (!(n = unit_name_replace_instance(SPECIAL_SERIAL_GETTY_SERVICE, "hvc0")))
- return -ENOMEM;
-
- r = unit_add_two_dependencies_by_name(UNIT(t), UNIT_AFTER, UNIT_WANTS, n, NULL, true);
- free(n);
-
- if (r < 0)
- return r;
- }
-
- return 0;
+ return unit_add_dependency_by_name(UNIT(t), UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, NULL, true);
}
static int target_load(Unit *u) {
return r;
/* This is a new unit? Then let's add in some extras */
- if (u->meta.load_state == UNIT_LOADED) {
- if (u->meta.default_dependencies)
+ if (u->load_state == UNIT_LOADED) {
+ if (u->default_dependencies)
if ((r = target_add_default_dependencies(t)) < 0)
return r;
-
- if ((r = target_add_getty_dependencies(t)) < 0)
- return r;
}
return 0;
const UnitVTable target_vtable = {
.suffix = ".target",
+ .object_size = sizeof(Target),
+ .sections =
+ "Unit\0"
+ "Target\0"
+ "Install\0",
.load = target_load,
.coldplug = target_coldplug,