X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fcore%2Fload-dropin.c;h=546e560b852c82c4bb27ff59aba793ba6ea3098d;hp=942ad027e9c21c67f986eba9039812cf144a4817;hb=2f20a8ebdb5aed3146f366360762d8963efe8d82;hpb=ae7a7182da31371555fceb2aed609e40a64b900a diff --git a/src/core/load-dropin.c b/src/core/load-dropin.c index 942ad027e..546e560b8 100644 --- a/src/core/load-dropin.c +++ b/src/core/load-dropin.c @@ -31,7 +31,12 @@ #include "load-fragment.h" #include "conf-files.h" -static int iterate_dir(Unit *u, const char *path, UnitDependency dependency, char ***strv) { +static int iterate_dir( + Unit *u, + const char *path, + UnitDependency dependency, + char ***strv) { + _cleanup_closedir_ DIR *d = NULL; int r; @@ -58,12 +63,13 @@ static int iterate_dir(Unit *u, const char *path, UnitDependency dependency, cha 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) { + errno = 0; + de = readdir(d); + if (!de && errno != 0) { + k = errno; log_error("Failed to read directory %s: %s", path, strerror(k)); return -k; } @@ -86,9 +92,16 @@ static int iterate_dir(Unit *u, const char *path, UnitDependency dependency, cha return 0; } -static int process_dir(Unit *u, const char *unit_path, const char *name, const char *suffix, UnitDependency dependency, char ***strv) { +static int process_dir( + Unit *u, + const char *unit_path, + const char *name, + const char *suffix, + UnitDependency dependency, + char ***strv) { + + _cleanup_free_ char *path = NULL; int r; - char *path; assert(u); assert(unit_path); @@ -97,51 +110,41 @@ static int process_dir(Unit *u, const char *unit_path, const char *name, const c path = strjoin(unit_path, "/", name, suffix, NULL); if (!path) - return -ENOMEM; + return log_oom(); - if (u->manager->unit_path_cache && - !set_get(u->manager->unit_path_cache, path)) - r = 0; - else + if (!u->manager->unit_path_cache || set_get(u->manager->unit_path_cache, path)) { r = iterate_dir(u, path, dependency, strv); - free(path); - - if (r < 0) - return r; + if (r < 0) + return r; + } if (u->instance) { - char *template; + _cleanup_free_ char *template = NULL, *p = NULL; /* 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; + return log_oom(); - if (u->manager->unit_path_cache && - !set_get(u->manager->unit_path_cache, path)) - r = 0; - else - r = iterate_dir(u, path, dependency, strv); - free(path); + p = strjoin(unit_path, "/", template, suffix, NULL); + if (!p) + return log_oom(); - if (r < 0) - return r; + if (!u->manager->unit_path_cache || set_get(u->manager->unit_path_cache, p)) { + r = iterate_dir(u, p, dependency, strv); + if (r < 0) + return r; + } } return 0; } char **unit_find_dropin_paths(Unit *u) { - Iterator i; - char *t; _cleanup_strv_free_ char **strv = NULL; char **configs = NULL; + Iterator i; + char *t; int r; assert(u); @@ -157,14 +160,14 @@ char **unit_find_dropin_paths(Unit *u) { } } - if (!strv_isempty(strv)) { - r = conf_files_list_strv(&configs, ".conf", NULL, (const char**) strv); - if (r < 0) { - log_error("Failed to get list of configuration files: %s", strerror(-r)); - strv_free(configs); - return NULL; - } + if (strv_isempty(strv)) + return NULL; + r = conf_files_list_strv(&configs, ".conf", NULL, (const char**) strv); + if (r < 0) { + log_error("Failed to get list of configuration files: %s", strerror(-r)); + strv_free(configs); + return NULL; } return configs; @@ -173,7 +176,6 @@ char **unit_find_dropin_paths(Unit *u) { int unit_load_dropin(Unit *u) { Iterator i; char *t, **f; - _cleanup_strv_free_ char **strv = NULL; int r; assert(u); @@ -199,7 +201,9 @@ int unit_load_dropin(Unit *u) { return 0; STRV_FOREACH(f, u->dropin_paths) { - r = config_parse(*f, NULL, UNIT_VTABLE(u)->sections, config_item_perf_lookup, (void*) load_fragment_gperf_lookup, false, u); + r = config_parse(u->id, *f, NULL, + UNIT_VTABLE(u)->sections, config_item_perf_lookup, + (void*) load_fragment_gperf_lookup, false, false, u); if (r < 0) return r; }