rework config file load logic

This commit is contained in:
Lennart Poettering 2010-01-28 02:44:47 +01:00
parent 98b5b2986f
commit d46de8a1a2
9 changed files with 59 additions and 22 deletions

View File

@ -17,7 +17,7 @@ static int automount_init(Unit *u) {
exec_context_init(&a->exec_context);
/* Load a .automount file */
if ((r = unit_load_fragment(u)) < 0 && errno != -ENOENT)
if ((r = unit_load_fragment(u)) < 0)
return r;
/* Load entry from /etc/fstab */

View File

@ -824,7 +824,7 @@ finish:
}
int unit_load_fragment(Unit *u) {
int r = -ENOENT;
int r = 0;
ExecContext *c;
assert(u);
@ -851,14 +851,16 @@ int unit_load_fragment(Unit *u) {
if (r >= 0 && c &&
(c->output == EXEC_KERNEL || c->output == EXEC_SYSLOG)) {
int k;
/* If syslog or kernel logging is requested, make sure
* our own logging daemon is run first. */
if ((r = unit_add_dependency(u, UNIT_AFTER, u->meta.manager->special_units[SPECIAL_LOGGER_SOCKET])) < 0)
return r;
if ((k = unit_add_dependency(u, UNIT_AFTER, u->meta.manager->special_units[SPECIAL_LOGGER_SOCKET])) < 0)
return k;
if ((r = unit_add_dependency(u, UNIT_REQUIRES, u->meta.manager->special_units[SPECIAL_LOGGER_SOCKET])) < 0)
return r;
if ((k = unit_add_dependency(u, UNIT_REQUIRES, u->meta.manager->special_units[SPECIAL_LOGGER_SOCKET])) < 0)
return k;
}
return r;

6
main.c
View File

@ -26,14 +26,14 @@ int main(int argc, char *argv[]) {
goto finish;
}
printf("→ By units:\n");
manager_dump_units(m, stdout, "\t");
if ((r = manager_add_job(m, JOB_START, target, JOB_REPLACE, false, &job)) < 0) {
log_error("Failed to start default target: %s", strerror(-r));
goto finish;
}
printf("→ By units:\n");
manager_dump_units(m, stdout, "\t");
printf("→ By jobs:\n");
manager_dump_jobs(m, stdout, "\t");

View File

@ -15,7 +15,7 @@ static int mount_init(Unit *u) {
assert(m);
/* Load a .mount file */
if ((r = unit_load_fragment(u)) < 0 && errno != -ENOENT)
if ((r = unit_load_fragment(u)) < 0)
return r;
/* Load entry from /etc/fstab */

View File

@ -101,17 +101,18 @@ static int service_init(Unit *u) {
s->state = SERVICE_DEAD;
/* Load a .service file */
r = unit_load_fragment(u);
/* Load a classic init script as a fallback */
if (r == -ENOENT)
r = service_load_sysv(s);
if (r < 0) {
if ((r = unit_load_fragment(u)) < 0) {
service_done(u);
return r;
}
/* Load a classic init script as a fallback, if we couldn*t find anything */
if (r == 0)
if ((r = service_load_sysv(s)) <= 0) {
service_done(u);
return r < 0 ? r : -ENOENT;
}
/* Load dropin directory data */
if ((r = unit_load_dropin(u)) < 0) {
service_done(u);

View File

@ -88,8 +88,11 @@ static int socket_init(Unit *u) {
s->timeout_usec = DEFAULT_TIMEOUT_USEC;
exec_context_init(&s->exec_context);
if ((r = unit_load_fragment_and_dropin(u)) < 0)
if ((r = unit_load_fragment_and_dropin(u)) <= 0) {
if (r == 0)
r = -ENOENT;
goto fail;
}
if (!(t = unit_name_change_suffix(unit_id(u), ".service"))) {
r = -ENOMEM;

View File

@ -1,5 +1,7 @@
/*-*- Mode: C; c-basic-offset: 8 -*-*/
#include <errno.h>
#include "unit.h"
#include "target.h"
#include "load-fragment.h"
@ -15,6 +17,18 @@ static const char* const state_string_table[_TARGET_STATE_MAX] = {
[TARGET_ACTIVE] = "active"
};
static int target_init(Unit *u) {
int r;
assert(u);
/* Make sure this config file actually exists */
if ((r = unit_load_fragment_and_dropin(u)) <= 0)
return r < 0 ? r : -ENOENT;
return 0;
}
static void target_dump(Unit *u, FILE *f, const char *prefix) {
Target *t = TARGET(u);
@ -67,7 +81,7 @@ static UnitActiveState target_active_state(Unit *u) {
const UnitVTable target_vtable = {
.suffix = ".target",
.init = unit_load_fragment_and_dropin,
.init = target_init,
.dump = target_dump,

17
timer.c
View File

@ -1,5 +1,7 @@
/*-*- Mode: C; c-basic-offset: 8 -*-*/
#include <errno.h>
#include "unit.h"
#include "timer.h"
@ -9,6 +11,19 @@ static void timer_done(Unit *u) {
assert(t);
}
static int timer_init(Unit *u) {
int r;
assert(u);
/* Make sure this config file actually exists */
if ((r = unit_load_fragment_and_dropin(u)) <= 0)
return r < 0 ? r : -ENOENT;
return 0;
}
static UnitActiveState timer_active_state(Unit *u) {
static const UnitActiveState table[_TIMER_STATE_MAX] = {
@ -23,7 +38,7 @@ static UnitActiveState timer_active_state(Unit *u) {
const UnitVTable timer_vtable = {
.suffix = ".timer",
.init = unit_load_fragment_and_dropin,
.init = timer_init,
.done = timer_done,
.active_state = timer_active_state

6
unit.c
View File

@ -372,7 +372,7 @@ void unit_dump(Unit *u, FILE *f, const char *prefix) {
/* Common implementation for multiple backends */
int unit_load_fragment_and_dropin(Unit *u) {
int r;
int r, ret;
assert(u);
@ -380,11 +380,13 @@ int unit_load_fragment_and_dropin(Unit *u) {
if ((r = unit_load_fragment(u)) < 0)
return r;
ret = r > 0;
/* Load drop-in directory data */
if ((r = unit_load_dropin(u)) < 0)
return r;
return 0;
return ret;
}
int unit_load(Unit *u) {