diff --git a/man/systemd-analyze.xml b/man/systemd-analyze.xml
index 70f87f47862..1c435318719 100644
--- a/man/systemd-analyze.xml
+++ b/man/systemd-analyze.xml
@@ -367,6 +367,13 @@ NAutoVTs=8
generators enabled will generally result in some warnings.
+
+
+
+ With cat-files, show config files underneath
+ the specified root path PATH.
+
+
diff --git a/src/analyze/analyze.c b/src/analyze/analyze.c
index 0b0925d18c2..19e6e83c6ff 100644
--- a/src/analyze/analyze.c
+++ b/src/analyze/analyze.c
@@ -72,6 +72,7 @@ static const char *arg_host = NULL;
static UnitFileScope arg_scope = UNIT_FILE_SYSTEM;
static bool arg_man = true;
static bool arg_generators = false;
+static const char *arg_root = NULL;
struct boot_times {
usec_t firmware_time;
@@ -1329,7 +1330,7 @@ static int cat_config(int argc, char *argv[], void *userdata) {
return -EINVAL;
}
- r = conf_files_cat(*arg);
+ r = conf_files_cat(arg_root, *arg);
if (r < 0)
return r;
}
@@ -1688,6 +1689,7 @@ static int parse_argv(int argc, char *argv[]) {
ARG_VERSION = 0x100,
ARG_ORDER,
ARG_REQUIRE,
+ ARG_ROOT,
ARG_SYSTEM,
ARG_USER,
ARG_GLOBAL,
@@ -1704,6 +1706,7 @@ static int parse_argv(int argc, char *argv[]) {
{ "version", no_argument, NULL, ARG_VERSION },
{ "order", no_argument, NULL, ARG_ORDER },
{ "require", no_argument, NULL, ARG_REQUIRE },
+ { "root", required_argument, NULL, ARG_ROOT },
{ "system", no_argument, NULL, ARG_SYSTEM },
{ "user", no_argument, NULL, ARG_USER },
{ "global", no_argument, NULL, ARG_GLOBAL },
@@ -1732,6 +1735,10 @@ static int parse_argv(int argc, char *argv[]) {
case ARG_VERSION:
return version();
+ case ARG_ROOT:
+ arg_root = optarg;
+ break;
+
case ARG_SYSTEM:
arg_scope = UNIT_FILE_SYSTEM;
break;
@@ -1825,6 +1832,11 @@ static int parse_argv(int argc, char *argv[]) {
return -EINVAL;
}
+ if (arg_root && !streq_ptr(argv[optind], "cat-config")) {
+ log_error("Option --root is only supported for cat-config right now.");
+ return -EINVAL;
+ }
+
return 1; /* work to do */
}
diff --git a/src/basic/conf-files.c b/src/basic/conf-files.c
index 29a85c018a8..00e46296683 100644
--- a/src/basic/conf-files.c
+++ b/src/basic/conf-files.c
@@ -294,8 +294,9 @@ int conf_files_list_with_replacement(
return 0;
}
-int conf_files_cat(const char *name) {
+int conf_files_cat(const char *root, const char *name) {
_cleanup_strv_free_ char **dirs = NULL, **files = NULL;
+ _cleanup_free_ char *path = NULL;
const char *dir;
char **t;
int r;
@@ -307,19 +308,21 @@ int conf_files_cat(const char *name) {
return log_error("Failed to build directory list: %m");
}
- r = conf_files_list_strv(&files, ".conf", NULL, 0, (const char* const*) dirs);
+ r = conf_files_list_strv(&files, ".conf", root, 0, (const char* const*) dirs);
if (r < 0)
return log_error_errno(r, "Failed to query file list: %m");
- name = strjoina("/etc/", name);
+ path = path_join(root, "/etc", name);
+ if (!path)
+ return log_oom();
if (DEBUG_LOGGING) {
log_debug("Looking for configuration in:");
- log_debug(" %s", name);
+ log_debug(" %s", path);
STRV_FOREACH(t, dirs)
log_debug(" %s/*.conf", *t);
}
/* show */
- return cat_files(name, files, CAT_FLAGS_MAIN_FILE_OPTIONAL);
+ return cat_files(path, files, CAT_FLAGS_MAIN_FILE_OPTIONAL);
}
diff --git a/src/basic/conf-files.h b/src/basic/conf-files.h
index 7eb8739ee13..2dd1b272caa 100644
--- a/src/basic/conf-files.h
+++ b/src/basic/conf-files.h
@@ -23,4 +23,4 @@ int conf_files_list_with_replacement(
const char *replacement,
char ***files,
char **replace_file);
-int conf_files_cat(const char *name);
+int conf_files_cat(const char *root, const char *name);