-/*-*- 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,
if (state != old_state)
log_debug("%s changed %s -> %s",
- UNIT(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. */
+
+ 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_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, NULL, true);
+}
+
+static int target_load(Unit *u) {
+ Target *t = TARGET(u);
+ int r;
+
+ assert(t);
+
+ if ((r = unit_load_fragment_and_dropin(u)) < 0)
+ return r;
+
+ /* This is a new unit? Then let's add in some extras */
+ if (u->load_state == UNIT_LOADED) {
+ if (u->default_dependencies)
+ if ((r = target_add_default_dependencies(t)) < 0)
+ return r;
+ }
+
+ return 0;
}
static int target_coldplug(Unit *u) {
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"
const UnitVTable target_vtable = {
.suffix = ".target",
+ .object_size = sizeof(Target),
+ .sections =
+ "Unit\0"
+ "Target\0"
+ "Install\0",
- .load = unit_load_fragment_and_dropin,
+ .load = target_load,
.coldplug = target_coldplug,
.dump = target_dump,
.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
};