]> git.ipfire.org Git - people/ms/systemd.git/commitdiff
properly implement target unit
authorLennart Poettering <lennart@poettering.net>
Wed, 27 Jan 2010 05:33:27 +0000 (06:33 +0100)
committerLennart Poettering <lennart@poettering.net>
Wed, 27 Jan 2010 05:33:27 +0000 (06:33 +0100)
socket.c
target.c
target.h

index 86104aa85a098b23088b86c683cda0ba06a0d1ce..68a4d812d6f6956b989a762ca36c9b17071084b5 100644 (file)
--- a/socket.c
+++ b/socket.c
@@ -140,6 +140,7 @@ static void socket_dump(Unit *u, FILE *f, const char *prefix) {
         char *prefix2;
 
         assert(s);
+        assert(f);
 
         prefix2 = strappend(prefix, "\t");
         if (!prefix2)
index bf448158cb66327714574849c8f851467a47ea13..6c84908e9b605730e69f0c3db7ffc1bdbf7b4e1a 100644 (file)
--- a/target.c
+++ b/target.c
@@ -3,24 +3,76 @@
 #include "unit.h"
 #include "target.h"
 #include "load-fragment.h"
+#include "log.h"
 
-static void target_done(Unit *u) {
-        Target *m = TARGET(u);
+static const UnitActiveState state_translation_table[_TARGET_STATE_MAX] = {
+        [TARGET_DEAD] = UNIT_INACTIVE,
+        [TARGET_ACTIVE] = UNIT_ACTIVE
+};
+
+static const char* const state_string_table[_TARGET_STATE_MAX] = {
+        [TARGET_DEAD] = "dead",
+        [TARGET_ACTIVE] = "active"
+};
+
+static void target_dump(Unit *u, FILE *f, const char *prefix) {
+        Target *t = TARGET(u);
+
+        assert(t);
+        assert(f);
+
+        fprintf(f,
+                "%sTarget State: %s\n",
+                prefix, state_string_table[t->state]);
+}
+
+static void target_set_state(Target *t, TargetState state) {
+        TargetState old_state;
+        assert(t);
+
+        old_state = t->state;
+        t->state = state;
+
+        log_debug("%s changing %s → %s", unit_id(UNIT(t)), state_string_table[old_state], state_string_table[state]);
 
-        assert(m);
+        unit_notify(UNIT(t), state_translation_table[old_state], state_translation_table[state]);
+}
+
+static int target_start(Unit *u) {
+        Target *t = TARGET(u);
+
+        assert(t);
+        assert(t->state == TARGET_DEAD);
+
+        target_set_state(t, TARGET_ACTIVE);
+        return 0;
+}
 
-        /* Nothing here for now */
+static int target_stop(Unit *u) {
+        Target *t = TARGET(u);
+
+        assert(t);
+        assert(t->state == TARGET_ACTIVE);
+
+        target_set_state(t, TARGET_DEAD);
+        return 0;
 }
 
 static UnitActiveState target_active_state(Unit *u) {
-        return TARGET(u)->state == TARGET_DEAD ? UNIT_INACTIVE : UNIT_ACTIVE;
+        assert(u);
+
+        return state_translation_table[TARGET(u)->state];
 }
 
 const UnitVTable target_vtable = {
         .suffix = ".target",
 
         .init = unit_load_fragment_and_dropin,
-        .done = target_done,
+
+        .dump = target_dump,
+
+        .start = target_start,
+        .stop = target_stop,
 
         .active_state = target_active_state
 };
index 16cd9c4492c1723d9c095b1a940fd6f33d9d173c..27331782868070438ca790ef57cb9043beb187ff 100644 (file)
--- a/target.h
+++ b/target.h
@@ -9,7 +9,8 @@ typedef struct Target Target;
 
 typedef enum TargetState {
         TARGET_DEAD,
-        TARGET_ACTIVE
+        TARGET_ACTIVE,
+        _TARGET_STATE_MAX
 } TargetState;
 
 struct Target {