chiark / gitweb /
snapshot: fix deserialization
authorLennart Poettering <lennart@poettering.net>
Sat, 10 Jul 2010 02:51:03 +0000 (04:51 +0200)
committerLennart Poettering <lennart@poettering.net>
Sat, 10 Jul 2010 02:51:03 +0000 (04:51 +0200)
src/manager.c
src/manager.h
src/snapshot.c

index a643263..bd4f465 100644 (file)
@@ -2279,6 +2279,8 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
 
         log_debug("Deserializing state...");
 
+        m->deserializing = true;
+
         for (;;) {
                 Unit *u;
                 char name[UNIT_NAME_MAX+2];
@@ -2288,22 +2290,30 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
                         if (feof(f))
                                 break;
 
-                        return -errno;
+                        r = -errno;
+                        goto finish;
                 }
 
                 char_array_0(name);
 
                 if ((r = manager_load_unit(m, strstrip(name), NULL, NULL, &u)) < 0)
-                        return r;
+                        goto finish;
 
                 if ((r = unit_deserialize(u, f, fds)) < 0)
-                        return r;
+                        goto finish;
         }
 
-        if (ferror(f))
-                return -EIO;
+        if (ferror(f)) {
+                r = -EIO;
+                goto finish;
+        }
 
-        return 0;
+        r = 0;
+
+finish:
+        m->deserializing = false;
+
+        return r;
 }
 
 int manager_reload(Manager *m) {
index e5cf3a1..b44ffe2 100644 (file)
@@ -193,6 +193,8 @@ struct Manager {
 
         bool utmp_reboot_written:1;
 
+        bool deserializing:1;
+
         bool show_status;
         bool confirm_spawn;
 };
index fe8a43d..11e7c3e 100644 (file)
@@ -56,7 +56,7 @@ static int snapshot_load(Unit *u) {
 
         /* Make sure that only snapshots created via snapshot_create()
          * can be loaded */
-        if (!s->by_snapshot_create)
+        if (!s->by_snapshot_create && !s->meta.manager->deserializing)
                 return -ENOENT;
 
         u->meta.load_state = UNIT_LOADED;