chiark / gitweb /
sysv: drop warning about missing chkconfig header
[elogind.git] / swap.c
diff --git a/swap.c b/swap.c
index aacf0e8d554ba107f2e577202f9fc4dfcb8178dc..275f1d4a9f54c0ff1a4ab93baa761a40396323cb 100644 (file)
--- a/swap.c
+++ b/swap.c
@@ -40,6 +40,14 @@ static const UnitActiveState state_translation_table[_SWAP_STATE_MAX] = {
         [SWAP_MAINTAINANCE] = UNIT_INACTIVE
 };
 
+static void swap_done(Unit *u) {
+        Swap *s = SWAP(u);
+
+        assert(s);
+
+        free(s->what);
+}
+
 static int swap_verify(Swap *s) {
         bool b;
         char *e;
@@ -60,17 +68,52 @@ static int swap_verify(Swap *s) {
         return 0;
 }
 
+int swap_add_one_mount_link(Swap *s, Mount *m) {
+         int r;
+
+        assert(s);
+        assert(m);
+
+        if (s->meta.load_state != UNIT_LOADED ||
+            m->meta.load_state != UNIT_LOADED)
+                return 0;
+
+        if (!path_startswith(s->what, m->where))
+                return 0;
+
+        if ((r = unit_add_dependency(UNIT(m), UNIT_BEFORE, UNIT(s), true)) < 0)
+                return r;
+
+        if ((r = unit_add_dependency(UNIT(s), UNIT_REQUIRES, UNIT(m), true)) < 0)
+                return r;
+
+        return 0;
+}
+
+static int swap_add_mount_links(Swap *s) {
+        Meta *other;
+        int r;
+
+        assert(s);
+
+        LIST_FOREACH(units_per_type, other, s->meta.manager->units_per_type[UNIT_MOUNT])
+                if ((r = swap_add_one_mount_link(s, (Mount*) other)) < 0)
+                        return r;
+
+        return 0;
+}
+
 static int swap_add_target_links(Swap *s) {
         Manager *m = s->meta.manager;
         Unit *tu;
         int r;
 
-        r = manager_load_unit(m, SPECIAL_SWAP_TARGET, NULL, &tu);
-        if (r < 0)
+        if ((r = manager_load_unit(m, SPECIAL_SWAP_TARGET, NULL, &tu)) < 0)
                 return r;
 
-        if (!s->no_auto && (r = unit_add_dependency(tu, UNIT_WANTS, UNIT(s), true)) < 0)
-                return r;
+        if (!s->no_auto)
+                if ((r = unit_add_dependency(tu, UNIT_WANTS, UNIT(s), true)) < 0)
+                        return r;
 
         return unit_add_dependency(UNIT(s), UNIT_BEFORE, tu, true);
 }
@@ -93,12 +136,13 @@ static int swap_load(Unit *u) {
 
                 path_kill_slashes(s->what);
 
-                if ((r = mount_add_node_links(u, s->what)) < 0)
+                if ((r = unit_add_node_link(u, s->what,
+                                            (u->meta.manager->running_as == MANAGER_INIT ||
+                                             u->meta.manager->running_as == MANAGER_SYSTEM))) < 0)
                         return r;
 
-                if (!path_startswith(s->what, "/dev/"))
-                        if ((r = mount_add_path_links(u, s->what, true)) < 0)
-                                return r;
+                if ((r = swap_add_mount_links(s)) < 0)
+                        return r;
 
                 if ((r = swap_add_target_links(s)) < 0)
                         return r;
@@ -310,7 +354,8 @@ static int swap_load_proc_swaps(Manager *m) {
         Meta *meta;
 
         rewind(m->proc_swaps);
-        fscanf(m->proc_self_mountinfo, "%*s %*s %*s %*s %*s\n");
+
+        (void) fscanf(m->proc_self_mountinfo, "%*s %*s %*s %*s %*s\n");
 
         for (;;) {
                 char *dev = NULL, *d;
@@ -398,8 +443,10 @@ const UnitVTable swap_vtable = {
 
         .no_alias = true,
         .no_instances = true,
+        .no_isolate = true,
 
         .load = swap_load,
+        .done = swap_done,
 
         .coldplug = swap_coldplug,
 
@@ -418,7 +465,6 @@ const UnitVTable swap_vtable = {
 
         .bus_message_handler = bus_swap_message_handler,
 
-        .shutdown = swap_shutdown,
-
-        .enumerate = swap_enumerate
+        .enumerate = swap_enumerate,
+        .shutdown = swap_shutdown
 };