[systemd-devel] [PATCH] shared: fix searching for configs in alternate roots
Commit 12ed81d9 changed path_strv_canonicalize_absolute's behavior to return a directory list without the root prefix if one was given but did not update other users of the function to the new behavior. This broke the --root option in systemd-tmpfiles, a regression in v213. To better reflect that path_strv_canonicalize_absolute does not return fully resolved paths any more as canonicalize may imply it is now simply called path_strv_cleanup. --- src/shared/conf-files.c | 18 +- src/shared/path-lookup.c | 6 +++--- src/shared/path-util.c | 6 +++--- src/shared/path-util.h | 4 ++-- src/shared/util.c| 7 +-- 5 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/shared/conf-files.c b/src/shared/conf-files.c index 5201782..6f1dc7f 100644 --- a/src/shared/conf-files.c +++ b/src/shared/conf-files.c @@ -37,10 +37,18 @@ #include "hashmap.h" #include "conf-files.h" -static int files_add(Hashmap *h, const char *dirpath, const char *suffix) { +static int files_add(Hashmap *h, const char *dirpath, const char *suffix, const char *root) { _cleanup_closedir_ DIR *dir = NULL; +_cleanup_free_ char *fullpath = NULL; -dir = opendir(dirpath); +if (root) +fullpath = strappend(root, dirpath); +else +fullpath = strdup(dirpath); +if (!fullpath) +return -ENOMEM; + +dir = opendir(fullpath); if (!dir) { if (errno == ENOENT) return 0; @@ -63,7 +71,7 @@ static int files_add(Hashmap *h, const char *dirpath, const char *suffix) { if (!dirent_is_file_with_suffix(de, suffix)) continue; -p = strjoin(dirpath, "/", de->d_name, NULL); +p = strjoin(fullpath, "/", de->d_name, NULL); if (!p) return -ENOMEM; @@ -100,7 +108,7 @@ static int conf_files_list_strv_internal(char ***strv, const char *suffix, const assert(suffix); /* This alters the dirs string array */ -if (!path_strv_canonicalize_absolute_uniq(dirs, root)) +if (!path_strv_cleanup_uniq(dirs, root)) return -ENOMEM; fh = hashmap_new(string_hash_func, string_compare_func); @@ -108,7 +116,7 @@ static int conf_files_list_strv_internal(char ***strv, const char *suffix, const return -ENOMEM; STRV_FOREACH(p, dirs) { -r = files_add(fh, *p, suffix); +r = files_add(fh, *p, suffix, root); if (r == -ENOMEM) { hashmap_free_free(fh); return r; diff --git a/src/shared/path-lookup.c b/src/shared/path-lookup.c index e072fd6..1a497f9 100644 --- a/src/shared/path-lookup.c +++ b/src/shared/path-lookup.c @@ -284,7 +284,7 @@ int lookup_paths_init( } } -if (!path_strv_canonicalize_absolute_uniq(p->unit_path, root_dir)) +if (!path_strv_cleanup_uniq(p->unit_path, root_dir)) return -ENOMEM; if (!strv_isempty(p->unit_path)) { @@ -338,10 +338,10 @@ int lookup_paths_init( return -ENOMEM; } -if (!path_strv_canonicalize_absolute_uniq(p->sysvinit_path, root_dir)) +if (!path_strv_cleanup_uniq(p->sysvinit_path, root_dir)) return -ENOMEM; -if (!path_strv_canonicalize_absolute_uniq(p->sysvrcnd_path, root_dir)) +if (!path_strv_cleanup_uniq(p->sysvrcnd_path, root_dir)) return -ENOMEM; if (!strv_isempty(p->sysvinit_path)) { diff --git a/src/shared/path-util.c b/src/shared/path-util.c index 5863429..37490be 100644 --- a/src/shared/path-util.c +++ b/src/shared/path-util.c @@ -238,7 +238,7 @@ char **path_strv_make_absolute_cwd(char **l) { return l; } -char **path_strv_canonicalize_absolute(char **l, const char *prefix) { +char **path_strv_cleanup(char **l, const char *prefix) { char **s; unsigned k = 0; bool enomem = false; @@ -323,12 +323,12 @@ char **path_strv_canonicalize_absolute(char **l, const char *prefix) { return l; } -char **path_strv_canonicalize_absolute_uniq(char **l, const char *prefix) { +char **path_strv_cleanup_uniq(char **l, const char *prefix) { if (strv_isempty(l)) return l; -if (!path_strv_canonicalize_absolute(l, prefix)) +if (!path_strv_cleanup(l, prefix)) return NULL; return strv_uniq(l); diff --git a/src/shared/path-util.h b/src/shared/path-util.h index 6882d78..b523bcc 100644 --- a/src/shared/path-util.h +++ b/src/shared/path-util.h @@ -47,8 +47,8 @@ char* path_startswith(const char *path, const char *prefix) _pure_; bool path_equal(const char *a, const char *b) _pure_; char** path_strv_make_absolut
[systemd-devel] [PATCH] shared: fix searching for configs in alternate roots
Commit 12ed81d9 changed path_strv_canonicalize_absolute's behavior to return a directory list without the root prefix if one was given but did not update other users of the function to the new behavior. This broke the --root option in systemd-tmpfiles, a regression in v213. To better reflect that path_strv_canonicalize_absolute does not return fully resolved paths any more as canonicalize may imply it is now simply called path_strv_cleanup. --- Resending this patch since it didn't make it in for v314. :( src/shared/conf-files.c | 18 +- src/shared/path-lookup.c | 6 +++--- src/shared/path-util.c | 6 +++--- src/shared/path-util.h | 4 ++-- src/shared/util.c| 7 +-- 5 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/shared/conf-files.c b/src/shared/conf-files.c index 5201782..6f1dc7f 100644 --- a/src/shared/conf-files.c +++ b/src/shared/conf-files.c @@ -37,10 +37,18 @@ #include "hashmap.h" #include "conf-files.h" -static int files_add(Hashmap *h, const char *dirpath, const char *suffix) { +static int files_add(Hashmap *h, const char *dirpath, const char *suffix, const char *root) { _cleanup_closedir_ DIR *dir = NULL; +_cleanup_free_ char *fullpath = NULL; -dir = opendir(dirpath); +if (root) +fullpath = strappend(root, dirpath); +else +fullpath = strdup(dirpath); +if (!fullpath) +return -ENOMEM; + +dir = opendir(fullpath); if (!dir) { if (errno == ENOENT) return 0; @@ -63,7 +71,7 @@ static int files_add(Hashmap *h, const char *dirpath, const char *suffix) { if (!dirent_is_file_with_suffix(de, suffix)) continue; -p = strjoin(dirpath, "/", de->d_name, NULL); +p = strjoin(fullpath, "/", de->d_name, NULL); if (!p) return -ENOMEM; @@ -100,7 +108,7 @@ static int conf_files_list_strv_internal(char ***strv, const char *suffix, const assert(suffix); /* This alters the dirs string array */ -if (!path_strv_canonicalize_absolute_uniq(dirs, root)) +if (!path_strv_cleanup_uniq(dirs, root)) return -ENOMEM; fh = hashmap_new(string_hash_func, string_compare_func); @@ -108,7 +116,7 @@ static int conf_files_list_strv_internal(char ***strv, const char *suffix, const return -ENOMEM; STRV_FOREACH(p, dirs) { -r = files_add(fh, *p, suffix); +r = files_add(fh, *p, suffix, root); if (r == -ENOMEM) { hashmap_free_free(fh); return r; diff --git a/src/shared/path-lookup.c b/src/shared/path-lookup.c index e072fd6..1a497f9 100644 --- a/src/shared/path-lookup.c +++ b/src/shared/path-lookup.c @@ -284,7 +284,7 @@ int lookup_paths_init( } } -if (!path_strv_canonicalize_absolute_uniq(p->unit_path, root_dir)) +if (!path_strv_cleanup_uniq(p->unit_path, root_dir)) return -ENOMEM; if (!strv_isempty(p->unit_path)) { @@ -338,10 +338,10 @@ int lookup_paths_init( return -ENOMEM; } -if (!path_strv_canonicalize_absolute_uniq(p->sysvinit_path, root_dir)) +if (!path_strv_cleanup_uniq(p->sysvinit_path, root_dir)) return -ENOMEM; -if (!path_strv_canonicalize_absolute_uniq(p->sysvrcnd_path, root_dir)) +if (!path_strv_cleanup_uniq(p->sysvrcnd_path, root_dir)) return -ENOMEM; if (!strv_isempty(p->sysvinit_path)) { diff --git a/src/shared/path-util.c b/src/shared/path-util.c index 5863429..37490be 100644 --- a/src/shared/path-util.c +++ b/src/shared/path-util.c @@ -238,7 +238,7 @@ char **path_strv_make_absolute_cwd(char **l) { return l; } -char **path_strv_canonicalize_absolute(char **l, const char *prefix) { +char **path_strv_cleanup(char **l, const char *prefix) { char **s; unsigned k = 0; bool enomem = false; @@ -323,12 +323,12 @@ char **path_strv_canonicalize_absolute(char **l, const char *prefix) { return l; } -char **path_strv_canonicalize_absolute_uniq(char **l, const char *prefix) { +char **path_strv_cleanup_uniq(char **l, const char *prefix) { if (strv_isempty(l)) return l; -if (!path_strv_canonicalize_absolute(l, prefix)) +if (!path_strv_cleanup(l, prefix)) return NULL; return strv_uniq(l); diff --git a/src/shared/path-util.h b/src/shared/path-util.h index 6882d78..b523bcc 100644 --- a/src/shared/path-util.h +++ b/src/shared/path-util.h @@ -47,8 +47,8 @@ char* path_startswith(const char *path, const char *prefix) _pure_; bool path_equal(const c
Re: [systemd-devel] [PATCH] shared: fix searching for configs in alternate roots
On Wed, 11.06.14 15:14, Michael Marineau (michael.marin...@coreos.com) wrote: > Commit 12ed81d9 changed path_strv_canonicalize_absolute's behavior to > return a directory list without the root prefix if one was given but did > not update other users of the function to the new behavior. This broke > the --root option in systemd-tmpfiles, a regression in v213. > > To better reflect that path_strv_canonicalize_absolute does not return > fully resolved paths any more as canonicalize may imply it is now simply > called path_strv_cleanup. Could you split out the renaming into a separate patch, please? Looks good then. And for the other bits, I would prefer avoiding the unnecessary strdup(), and simply use strappenda3() (see my other mail, to Lukas). Lennart -- Lennart Poettering, Red Hat ___ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel