From 99f08d14a7e4210bdb97b8c9d0752ec318ecca30 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 15 Nov 2010 04:24:04 +0100 Subject: [PATCH] load-dropin: add support for .requires directories --- src/load-dropin.c | 95 ++++++++++++++++++++++++++++------------------- 1 file changed, 57 insertions(+), 38 deletions(-) diff --git a/src/load-dropin.c b/src/load-dropin.c index eef3e6af..d30865cb 100644 --- a/src/load-dropin.c +++ b/src/load-dropin.c @@ -28,11 +28,14 @@ #include "strv.h" #include "unit-name.h" -static int iterate_dir(Unit *u, const char *path) { +static int iterate_dir(Unit *u, const char *path, UnitDependency dependency) { DIR *d; struct dirent *de; int r; + assert(u); + assert(path); + if (!(d = opendir(path))) { if (errno == ENOENT) @@ -52,7 +55,7 @@ static int iterate_dir(Unit *u, const char *path) { goto finish; } - r = unit_add_dependency_by_name(u, UNIT_WANTS, de->d_name, f, true); + r = unit_add_dependency_by_name(u, dependency, de->d_name, f, true); free(f); if (r < 0) @@ -66,58 +69,74 @@ finish: return r; } -int unit_load_dropin(Unit *u) { - Iterator i; +static int process_dir(Unit *u, const char *unit_path, const char *name, const char *suffix, UnitDependency dependency) { int r; - char *t; + char *path; assert(u); + assert(unit_path); + assert(name); + assert(suffix); - /* Load dependencies from supplementary drop-in directories */ + if (asprintf(&path, "%s/%s%s", unit_path, name, suffix) < 0) + return -ENOMEM; - SET_FOREACH(t, u->meta.names, i) { - char *path; - char **p; + if (u->meta.manager->unit_path_cache && + !set_get(u->meta.manager->unit_path_cache, path)) + r = 0; + else + r = iterate_dir(u, path, dependency); + free(path); - STRV_FOREACH(p, u->meta.manager->lookup_paths.unit_path) { + if (r < 0) + return r; - if (asprintf(&path, "%s/%s.wants", *p, t) < 0) - return -ENOMEM; + if (u->meta.instance) { + char *template; + /* Also try the template dir */ - if (u->meta.manager->unit_path_cache && - !set_get(u->meta.manager->unit_path_cache, path)) - r = 0; - else - r = iterate_dir(u, path); - free(path); + if (!(template = unit_name_template(name))) + return -ENOMEM; - if (r < 0) - return r; + r = asprintf(&path, "%s/%s%s", unit_path, template, suffix); + free(template); - if (u->meta.instance) { - char *template; - /* Also try the template dir */ + if (r < 0) + return -ENOMEM; - if (!(template = unit_name_template(t))) - return -ENOMEM; + if (u->meta.manager->unit_path_cache && + !set_get(u->meta.manager->unit_path_cache, path)) + r = 0; + else + r = iterate_dir(u, path, dependency); + free(path); - r = asprintf(&path, "%s/%s.wants", *p, template); - free(template); + if (r < 0) + return r; + } - if (r < 0) - return -ENOMEM; + return 0; +} - if (u->meta.manager->unit_path_cache && - !set_get(u->meta.manager->unit_path_cache, path)) - r = 0; - else - r = iterate_dir(u, path); - free(path); +int unit_load_dropin(Unit *u) { + Iterator i; + char *t; + + assert(u); + + /* Load dependencies from supplementary drop-in directories */ - if (r < 0) - return r; - } + SET_FOREACH(t, u->meta.names, i) { + char **p; + + STRV_FOREACH(p, u->meta.manager->lookup_paths.unit_path) { + int r; + if ((r = process_dir(u, *p, t, ".wants", UNIT_WANTS)) < 0) + return r; + + if ((r = process_dir(u, *p, t, ".requires", UNIT_REQUIRES)) < 0) + return r; } } -- 2.39.5