summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2010-07-10 04:51:03 +0200
committerLennart Poettering <lennart@poettering.net>2010-07-10 04:51:03 +0200
commit82c64bf578623f0678b4de1ac08c6bd8e5d95662 (patch)
tree97306aeb4ecfb2b1fa7e3523d91bf2d879c3dd40
parent1e001f52d20a4685c9e8cf3cfa690021ca05c9e7 (diff)
snapshot: fix deserialization
-rw-r--r--src/manager.c22
-rw-r--r--src/manager.h2
-rw-r--r--src/snapshot.c2
3 files changed, 19 insertions, 7 deletions
diff --git a/src/manager.c b/src/manager.c
index a64326321..bd4f4659a 100644
--- a/src/manager.c
+++ b/src/manager.c
@@ -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) {
diff --git a/src/manager.h b/src/manager.h
index e5cf3a1c5..b44ffe27c 100644
--- a/src/manager.h
+++ b/src/manager.h
@@ -193,6 +193,8 @@ struct Manager {
bool utmp_reboot_written:1;
+ bool deserializing:1;
+
bool show_status;
bool confirm_spawn;
};
diff --git a/src/snapshot.c b/src/snapshot.c
index fe8a43dd3..11e7c3e28 100644
--- a/src/snapshot.c
+++ b/src/snapshot.c
@@ -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;