summaryrefslogtreecommitdiff
path: root/src/core/snapshot.c
diff options
context:
space:
mode:
authorPaul Sherwood <paul.sherwood@codethink.co.uk>2013-11-17 18:32:22 +0000
committerPaul Sherwood <paul.sherwood@codethink.co.uk>2013-11-17 18:32:22 +0000
commitaf04dc70741e58c16a3b2c003ef9779d7863827c (patch)
tree23b608397f1ccb73a34d5fa7cc8d6377554f952f /src/core/snapshot.c
parentdc8ee9a30e2df2568f2b37e3fb61e4b0bb601b13 (diff)
parent1434ae6fd49f8377b0ddbd4c675736e0d3226ea6 (diff)
downloadsystemd-af04dc70741e58c16a3b2c003ef9779d7863827c.tar.gz
systemd 208
Diffstat (limited to 'src/core/snapshot.c')
-rw-r--r--src/core/snapshot.c34
1 files changed, 19 insertions, 15 deletions
diff --git a/src/core/snapshot.c b/src/core/snapshot.c
index a63eccd8de..d11239dff3 100644
--- a/src/core/snapshot.c
+++ b/src/core/snapshot.c
@@ -40,6 +40,7 @@ static void snapshot_init(Unit *u) {
UNIT(s)->ignore_on_isolate = true;
UNIT(s)->ignore_on_snapshot = true;
+ UNIT(s)->allow_isolate = true;
}
static void snapshot_set_state(Snapshot *s, SnapshotState state) {
@@ -66,7 +67,7 @@ static int snapshot_load(Unit *u) {
/* Make sure that only snapshots created via snapshot_create()
* can be loaded */
- if (!s->by_snapshot_create && UNIT(s)->manager->n_reloading <= 0)
+ if (!u->transient && UNIT(s)->manager->n_reloading <= 0)
return -ENOENT;
u->load_state = UNIT_LOADED;
@@ -151,21 +152,24 @@ static int snapshot_deserialize_item(Unit *u, const char *key, const char *value
if (streq(key, "state")) {
SnapshotState state;
- if ((state = snapshot_state_from_string(value)) < 0)
+ state = snapshot_state_from_string(value);
+ if (state < 0)
log_debug("Failed to parse state value %s", value);
else
s->deserialized_state = state;
} else if (streq(key, "cleanup")) {
- if ((r = parse_boolean(value)) < 0)
+ r = parse_boolean(value);
+ if (r < 0)
log_debug("Failed to parse cleanup value %s", value);
else
s->cleanup = r;
} else if (streq(key, "wants")) {
- if ((r = unit_add_two_dependencies_by_name(u, UNIT_AFTER, UNIT_WANTS, value, NULL, true)) < 0)
+ r = unit_add_two_dependencies_by_name(u, UNIT_AFTER, UNIT_WANTS, value, NULL, true);
+ if (r < 0)
return r;
} else
log_debug("Unknown serialization key '%s'", key);
@@ -186,9 +190,9 @@ _pure_ static const char *snapshot_sub_state_to_string(Unit *u) {
}
int snapshot_create(Manager *m, const char *name, bool cleanup, DBusError *e, Snapshot **_s) {
- Iterator i;
+ _cleanup_free_ char *n = NULL;
Unit *other, *u = NULL;
- char *n = NULL;
+ Iterator i;
int r;
const char *k;
@@ -217,28 +221,28 @@ int snapshot_create(Manager *m, const char *name, bool cleanup, DBusError *e, Sn
if (asprintf(&n, "snapshot-%u.snapshot", ++ m->n_snapshots) < 0)
return -ENOMEM;
- if (!manager_get_unit(m, n))
+ if (!manager_get_unit(m, n)) {
+ name = n;
break;
+ }
free(n);
+ n = NULL;
}
-
- name = n;
}
r = manager_load_unit_prepare(m, name, NULL, e, &u);
- free(n);
-
if (r < 0)
goto fail;
- SNAPSHOT(u)->by_snapshot_create = true;
+ u->transient = true;
manager_dispatch_load_queue(m);
assert(u->load_state == UNIT_LOADED);
HASHMAP_FOREACH_KEY(other, k, m->units, i) {
- if (other->ignore_on_snapshot)
+ if (other->ignore_on_snapshot ||
+ other->transient)
continue;
if (k != other->id)
@@ -251,12 +255,12 @@ int snapshot_create(Manager *m, const char *name, bool cleanup, DBusError *e, Sn
if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
continue;
- if ((r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_WANTS, other, true)) < 0)
+ r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_WANTS, other, true);
+ if (r < 0)
goto fail;
}
SNAPSHOT(u)->cleanup = cleanup;
- u->allow_isolate = true;
*_s = SNAPSHOT(u);
return 0;