#include <sys/signalfd.h>
#include <sys/wait.h>
#include <unistd.h>
-#include <utmpx.h>
#include <sys/poll.h>
#include <sys/reboot.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
+
+#ifdef HAVE_AUDIT
#include <libaudit.h>
+#endif
#include "manager.h"
#include "hashmap.h"
#include "ratelimit.h"
#include "cgroup.h"
#include "mount-setup.h"
-#include "utmp-wtmp.h"
#include "unit-name.h"
#include "dbus-unit.h"
#include "dbus-job.h"
if ((r = bus_init(m)) < 0)
goto fail;
+#ifdef HAVE_AUDIT
if ((m->audit_fd = audit_open()) < 0)
log_error("Failed to connect to audit log: %m");
+#endif
*_m = m;
return 0;
d = j;
else
d = k;
- }
+ } else
+ d = j;
} else if (!j->matters_to_anchor)
d = j;
t = j->type;
LIST_FOREACH(transaction, k, j->transaction_next) {
- if ((r = job_type_merge(&t, k->type)) >= 0)
+ if (job_type_merge(&t, k->type) >= 0)
continue;
/* OK, we could not merge all jobs for this
static Job* transaction_add_one_job(Manager *m, JobType type, Unit *unit, bool override, bool *is_new) {
Job *j, *f;
- int r;
assert(m);
assert(unit);
LIST_PREPEND(Job, transaction, f, j);
- if ((r = hashmap_replace(m->transaction_jobs, unit, f)) < 0) {
+ if (hashmap_replace(m->transaction_jobs, unit, f) < 0) {
job_free(j);
return NULL;
}
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;
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];
/* Start marker */
if (!fgets(name, sizeof(name), f)) {
if (feof(f))
- break;
+ r = 0;
+ else
+ r = -errno;
- r = -errno;
goto finish;
}
goto finish;
}
+finish:
if (ferror(f)) {
r = -EIO;
goto finish;
}
- r = 0;
-
-finish:
assert(m->n_deserializing > 0);
m->n_deserializing --;