search_and_fopen_* and conf_files_list function accept root parameter, but they are not using it.
This leads to an issue with systemd-tmpfiles --root. The files and dirs are created in the correct location, but on the base of configuration from the normal root. --- src/shared/conf-files.c | 14 +++++++++++--- src/shared/util.c | 29 +++++++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/shared/conf-files.c b/src/shared/conf-files.c index 5201782..892b170 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; - dir = opendir(dirpath); + if (root) { + _cleanup_free_ char *p = NULL; + p = strjoin(root, "/", dirpath, NULL); + if (!p) + return -ENOMEM; + dir = opendir(p); + } else + dir = opendir(dirpath); + if (!dir) { if (errno == ENOENT) return 0; @@ -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/util.c b/src/shared/util.c index 91cbf20..daf09ab 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -5702,6 +5702,15 @@ static int search_and_fopen_internal(const char *path, const char *mode, const c if (!p) return -ENOMEM; + if (root) { + char *q = NULL; + q = strjoin(root, "/", p, NULL); + if (!q) + return -ENOMEM; + free(p); + p = q; + } + f = fopen(p, mode); if (f) { *_f = f; @@ -5724,8 +5733,16 @@ int search_and_fopen(const char *path, const char *mode, const char *root, const if (path_is_absolute(path)) { FILE *f; + if (root) { + _cleanup_free_ char *p = NULL; + p = strjoin(root, "/", path, NULL); + if (!p) + return -ENOMEM; + + f = fopen(p, mode); + } else + f = fopen(path, mode); - f = fopen(path, mode); if (f) { *_f = f; return 0; @@ -5747,7 +5764,15 @@ int search_and_fopen_nulstr(const char *path, const char *mode, const char *root if (path_is_absolute(path)) { FILE *f; - f = fopen(path, mode); + if (root) { + _cleanup_free_ char *p = NULL; + p = strjoin(root, "/", path, NULL); + if (!p) + return -ENOMEM; + + f = fopen(p, mode); + } else + f = fopen(path, mode); if (f) { *_f = f; return 0; -- 1.8.3.1 _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel