-/*-*- Mode: C; c-basic-offset: 8 -*-*/
+/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
/***
This file is part of systemd.
#include <errno.h>
#include <signal.h>
+#include <unistd.h>
#include "unit.h"
#include "target.h"
#include "log.h"
#include "dbus-target.h"
#include "special.h"
+#include "unit-name.h"
static const UnitActiveState state_translation_table[_TARGET_STATE_MAX] = {
[TARGET_DEAD] = UNIT_INACTIVE,
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, t->meta.dependencies[deps[k]], i)
+ if ((r = unit_add_default_target_dependency(other, UNIT(t))) < 0)
return r;
- return 0;
+ /* Make sure targets are unloaded on shutdown */
+ return unit_add_dependency_by_name(UNIT(t), UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, NULL, true);
}
static int target_load(Unit *u) {
const UnitVTable target_vtable = {
.suffix = ".target",
+ .sections =
+ "Unit\0"
+ "Target\0"
+ "Install\0",
.load = target_load,
.coldplug = target_coldplug,
.active_state = target_active_state,
.sub_state_to_string = target_sub_state_to_string,
+ .bus_interface = "org.freedesktop.systemd1.Target",
.bus_message_handler = bus_target_message_handler
};