X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Fconf-files.c;h=5bbd2388d3d03084663b118becac7d7d77094958;hb=f74e605fc06c1c23e968dc4c26045eb746791706;hp=34b86293d3a246b9703a36eab41f8f020de4ff38;hpb=7d5e9c0f60cddf01ec803012cbdc02d2f55b78c1;p=elogind.git diff --git a/src/shared/conf-files.c b/src/shared/conf-files.c index 34b86293d..5bbd2388d 100644 --- a/src/shared/conf-files.c +++ b/src/shared/conf-files.c @@ -37,11 +37,14 @@ #include "hashmap.h" #include "conf-files.h" -static int files_add(Hashmap *h, const char *path, const char *suffix) { - DIR *dir; - int r = 0; +static int files_add(Hashmap *h, const char *root, const char *path, const char *suffix) { + _cleanup_closedir_ DIR *dir; + _cleanup_free_ char *dirpath = NULL; - dir = opendir(path); + if (asprintf(&dirpath, "%s%s", root ? root : "", path) < 0) + return -ENOMEM; + + dir = opendir(dirpath); if (!dir) { if (errno == ENOENT) return 0; @@ -51,14 +54,12 @@ static int files_add(Hashmap *h, const char *path, const char *suffix) { for (;;) { struct dirent *de; union dirent_storage buf; - int k; char *p; + int err; - k = readdir_r(dir, &buf.de, &de); - if (k != 0) { - r = -k; - goto finish; - } + err = readdir_r(dir, &buf.de, &de); + if (err != 0) + return err; if (!de) break; @@ -66,10 +67,8 @@ static int files_add(Hashmap *h, const char *path, const char *suffix) { if (!dirent_is_file_with_suffix(de, suffix)) continue; - if (asprintf(&p, "%s/%s", path, de->d_name) < 0) { - r = -ENOMEM; - goto finish; - } + if (asprintf(&p, "%s/%s", dirpath, de->d_name) < 0) + return -ENOMEM; if (hashmap_put(h, path_get_file_name(p), p) <= 0) { log_debug("Skip overridden file: %s.", p); @@ -77,9 +76,7 @@ static int files_add(Hashmap *h, const char *path, const char *suffix) { } } -finish: - closedir(dir); - return r; + return 0; } static int base_cmp(const void *a, const void *b) { @@ -90,7 +87,7 @@ static int base_cmp(const void *a, const void *b) { return strcmp(path_get_file_name(s1), path_get_file_name(s2)); } -int conf_files_list_strv(char ***strv, const char *suffix, const char **dirs) { +int conf_files_list_strv(char ***strv, const char *suffix, const char *root, const char **dirs) { Hashmap *fh = NULL; char **files = NULL; const char **p; @@ -105,7 +102,7 @@ int conf_files_list_strv(char ***strv, const char *suffix, const char **dirs) { } STRV_FOREACH(p, dirs) { - r = files_add(fh, *p, suffix); + r = files_add(fh, root, *p, suffix); if (r < 0) log_warning("Failed to search for files in %s: %s", *p, strerror(-r)); @@ -126,7 +123,7 @@ finish: return r; } -int conf_files_list(char ***strv, const char *suffix, const char *dir, ...) { +int conf_files_list(char ***strv, const char *suffix, const char *root, const char *dir, ...) { char **dirs = NULL; va_list ap; int r; @@ -145,7 +142,7 @@ int conf_files_list(char ***strv, const char *suffix, const char *dir, ...) { } strv_uniq(dirs); - r = conf_files_list_strv(strv, suffix, (const char **)dirs); + r = conf_files_list_strv(strv, suffix, root, (const char **)dirs); finish: strv_free(dirs);