X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fload-dropin.c;h=8be190040e22666e0ae5cb3ac614036b55f92ee0;hb=821d4b6e068b2afaad94d43db22171c34a30400e;hp=8e10d8fb4c2164031597439daff8626068956095;hpb=8afbb8e1180dce3cb33a14fc3ec5afcf501104e6;p=elogind.git diff --git a/src/core/load-dropin.c b/src/core/load-dropin.c index 8e10d8fb4..8be190040 100644 --- a/src/core/load-dropin.c +++ b/src/core/load-dropin.c @@ -29,122 +29,29 @@ #include "unit-name.h" #include "conf-parser.h" #include "load-fragment.h" - -static int load_dropin_config_file(Unit *u, const char *path) { - assert(u); - assert(path); - - if (!endswith(path, ".conf")) - return 0; - - return config_parse(path, NULL, UNIT_VTABLE(u)->sections, config_item_perf_lookup, (void*) load_fragment_gperf_lookup, false, u); -} - -static int iterate_dir(Unit *u, const char *path, UnitDependency dependency) { - _cleanup_closedir_ DIR *d = NULL; - int r; - - assert(u); - assert(path); - - d = opendir(path); - if (!d) { - if (errno == ENOENT) - return 0; - - return -errno; - } - - for (;;) { - struct dirent *de; - union dirent_storage buf; - _cleanup_free_ char *f = NULL; - int k; - - k = readdir_r(d, &buf.de, &de); - if (k != 0) { - log_error("Failed to read directory %s: %s", path, strerror(k)); - return -k; - } - - if (!de) - break; - - if (ignore_file(de->d_name)) - continue; - - f = strjoin(path, "/", de->d_name, NULL); - if (!f) - return log_oom(); - - if (dependency >= 0) { - r = unit_add_dependency_by_name(u, dependency, de->d_name, f, true); - if (r < 0) - log_error("Cannot add dependency %s to %s, ignoring: %s", de->d_name, u->id, strerror(-r)); - } else { - r = load_dropin_config_file(u, f); - if (r < 0) - log_error("Cannot load drop-in configuration file %s for %s, ignoring: %s", f, u->id, strerror(-r)); - } - } - - return 0; -} - -static int process_dir(Unit *u, const char *unit_path, const char *name, const char *suffix, UnitDependency dependency) { +#include "conf-files.h" + +static int add_dependency_consumer( + UnitDependency dependency, + const char *entry, + const char* filepath, + void *arg) { + Unit *u = arg; int r; - char *path; assert(u); - assert(unit_path); - assert(name); - assert(suffix); - - path = strjoin(unit_path, "/", name, suffix, NULL); - if (!path) - return -ENOMEM; - - if (u->manager->unit_path_cache && - !set_get(u->manager->unit_path_cache, path)) - r = 0; - else - r = iterate_dir(u, path, dependency); - free(path); + r = unit_add_dependency_by_name(u, dependency, entry, filepath, true); if (r < 0) - return r; - - if (u->instance) { - char *template; - /* Also try the template dir */ - - template = unit_name_template(name); - if (!template) - return -ENOMEM; - - path = strjoin(unit_path, "/", template, suffix, NULL); - free(template); - - if (!path) - return -ENOMEM; - - if (u->manager->unit_path_cache && - !set_get(u->manager->unit_path_cache, path)) - r = 0; - else - r = iterate_dir(u, path, dependency); - free(path); - - if (r < 0) - return r; - } + log_error_errno(r, "Cannot add dependency %s to %s, ignoring: %m", entry, u->id); return 0; } int unit_load_dropin(Unit *u) { Iterator i; - char *t; + char *t, **f; + int r; assert(u); @@ -154,22 +61,25 @@ int unit_load_dropin(Unit *u) { char **p; STRV_FOREACH(p, u->manager->lookup_paths.unit_path) { - int r; - - r = process_dir(u, *p, t, ".wants", UNIT_WANTS); - if (r < 0) - return r; + unit_file_process_dir(u->manager->unit_path_cache, *p, t, ".wants", UNIT_WANTS, + add_dependency_consumer, u, NULL); + unit_file_process_dir(u->manager->unit_path_cache, *p, t, ".requires", UNIT_REQUIRES, + add_dependency_consumer, u, NULL); + } + } - r = process_dir(u, *p, t, ".requires", UNIT_REQUIRES); - if (r < 0) - return r; + r = unit_find_dropin_paths(u, &u->dropin_paths); + if (r <= 0) + return 0; - /* This loads the drop-in config snippets */ - r = process_dir(u, *p, t, ".d", _UNIT_TYPE_INVALID); - if (r < 0) - return r; - } + STRV_FOREACH(f, u->dropin_paths) { + config_parse(u->id, *f, NULL, + UNIT_VTABLE(u)->sections, + config_item_perf_lookup, load_fragment_gperf_lookup, + false, false, false, u); } + u->dropin_mtime = now(CLOCK_REALTIME); + return 0; }