From 10f8e83cbb10c73b980c9b3b895ac044e600ba0c Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 11 Aug 2010 20:19:27 +0200 Subject: manager: serialize/deserialize startup time, too --- src/manager.c | 44 +++++++++++++++++++++++++++++++++++++++----- src/unit.c | 1 + 2 files changed, 40 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/manager.c b/src/manager.c index a5b0ce002d..18b014004f 100644 --- a/src/manager.c +++ b/src/manager.c @@ -2351,6 +2351,10 @@ int manager_serialize(Manager *m, FILE *f, FDSet *fds) { assert(f); assert(fds); + fprintf(f, "startup-timestamp=%llu %llu\n\n", + (unsigned long long) m->startup_timestamp.realtime, + (unsigned long long) m->startup_timestamp.monotonic); + HASHMAP_FOREACH_KEY(u, t, m->units, i) { if (u->meta.id != t) continue; @@ -2382,6 +2386,37 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) { m->n_deserializing ++; + for (;;) { + char line[1024], *l; + + if (!fgets(line, sizeof(line), f)) { + if (feof(f)) + r = 0; + else + r = -errno; + + goto finish; + } + + char_array_0(line); + l = strstrip(line); + + if (l[0] == 0) + break; + + if (startswith(l, "startup-timestamp=")) { + unsigned long long a, b; + + if (sscanf(l+18, "%lli %llu", &a, &b) != 2) + log_debug("Failed to parse startup timestamp value %s", l+18); + else { + m->startup_timestamp.realtime = a; + m->startup_timestamp.monotonic = b; + } + } else + log_debug("Unknown serialization item '%s'", l); + } + for (;;) { Unit *u; char name[UNIT_NAME_MAX+2]; @@ -2389,9 +2424,10 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) { /* Start marker */ if (!fgets(name, sizeof(name), f)) { if (feof(f)) - break; + r = 0; + else + r = -errno; - r = -errno; goto finish; } @@ -2404,14 +2440,12 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) { goto finish; } +finish: if (ferror(f)) { r = -EIO; goto finish; } - r = 0; - -finish: assert(m->n_deserializing > 0); m->n_deserializing --; diff --git a/src/unit.c b/src/unit.c index 33e9cef865..59fc93a9ba 100644 --- a/src/unit.c +++ b/src/unit.c @@ -1983,6 +1983,7 @@ int unit_deserialize(Unit *u, FILE *f, FDSet *fds) { return -errno; } + char_array_0(line); l = strstrip(line); /* End marker */ -- cgit v1.2.3-54-g00ecf