-/*-*- Mode: C; c-basic-offset: 8 -*-*/
+/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
/***
This file is part of systemd.
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(type < _JOB_TYPE_MAX);
assert(unit);
- if (type != JOB_STOP &&
- unit->meta.load_state != UNIT_LOADED) {
- dbus_set_error(e, BUS_ERROR_LOAD_FAILED, "Unit %s failed to load. See logs for details.", unit->meta.id);
+ if (unit->meta.load_state != UNIT_LOADED && unit->meta.load_state != UNIT_FAILED) {
+ dbus_set_error(e, BUS_ERROR_LOAD_FAILED, "Unit %s is not loaded properly.", unit->meta.id);
+ return -EINVAL;
+ }
+
+ if (type != JOB_STOP && unit->meta.load_state == UNIT_FAILED) {
+ dbus_set_error(e, BUS_ERROR_LOAD_FAILED, "Unit %s failed to load: %s. You might find more information in the logs.",
+ unit->meta.id,
+ strerror(-unit->meta.load_error));
return -EINVAL;
}
if (n >= 0)
return -EIO;
- if (errno == EAGAIN)
+ if (errno == EAGAIN || errno == EINTR)
break;
return -errno;
if (m->audit_fd < 0)
return;
+ /* Don't generate audit events if the service was already
+ * started and we're just deserializing */
+ if (m->n_deserializing > 0)
+ return;
+
if (!(p = unit_name_to_prefix_and_instance(u->meta.id))) {
log_error("Failed to allocate unit name for audit message: %s", strerror(ENOMEM));
return;
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 --;