From d46de8a1a249e179687361dcaeba27e1c586253a Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 28 Jan 2010 02:44:47 +0100 Subject: [PATCH] rework config file load logic --- automount.c | 2 +- load-fragment.c | 12 +++++++----- main.c | 6 +++--- mount.c | 2 +- service.c | 15 ++++++++------- socket.c | 5 ++++- target.c | 16 +++++++++++++++- timer.c | 17 ++++++++++++++++- unit.c | 6 ++++-- 9 files changed, 59 insertions(+), 22 deletions(-) diff --git a/automount.c b/automount.c index 7b397c9b9..eb9c3d3c1 100644 --- a/automount.c +++ b/automount.c @@ -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 */ diff --git a/load-fragment.c b/load-fragment.c index 2757506ab..9273fc8b8 100644 --- a/load-fragment.c +++ b/load-fragment.c @@ -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; diff --git a/main.c b/main.c index 624a73e17..2486f0629 100644 --- a/main.c +++ b/main.c @@ -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"); diff --git a/mount.c b/mount.c index f4a6d6f24..7a1ec087e 100644 --- a/mount.c +++ b/mount.c @@ -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 */ diff --git a/service.c b/service.c index 1cbfb3dce..70299dd06 100644 --- a/service.c +++ b/service.c @@ -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); diff --git a/socket.c b/socket.c index 7bcd11273..926a0fb64 100644 --- a/socket.c +++ b/socket.c @@ -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; diff --git a/target.c b/target.c index 748dfeef1..03f092e35 100644 --- a/target.c +++ b/target.c @@ -1,5 +1,7 @@ /*-*- Mode: C; c-basic-offset: 8 -*-*/ +#include + #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, diff --git a/timer.c b/timer.c index 29346204f..c3ebba0d1 100644 --- a/timer.c +++ b/timer.c @@ -1,5 +1,7 @@ /*-*- Mode: C; c-basic-offset: 8 -*-*/ +#include + #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 diff --git a/unit.c b/unit.c index 88615319d..407612092 100644 --- a/unit.c +++ b/unit.c @@ -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) { -- 2.30.2