]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
analyze: make cat-config work with relabel-extra.d 13353/head
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 6 Aug 2019 20:07:17 +0000 (22:07 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Mon, 19 Aug 2019 08:20:01 +0000 (10:20 +0200)
src/shared/pretty-print.c

index 96e74a758f09229301e42d807a9c896a25138432..5772918c374b21ae825d69d03910006b74d51d45 100644 (file)
@@ -213,13 +213,17 @@ void print_separator(void) {
                 fputs("\n\n", stdout);
 }
 
-static int guess_type(const char **name, bool *is_usr, bool *is_collection, const char **extension) {
+static int guess_type(const char **name, char ***prefixes, bool *is_collection, const char **extension) {
         /* Try to figure out if name is like tmpfiles.d/ or systemd/system-presets/,
          * i.e. a collection of directories without a main config file. */
 
         _cleanup_free_ char *n = NULL;
-        bool usr = false, coll = false;
+        bool usr = false, run = false, coll = false;
         const char *ext = ".conf";
+        /* This is static so that the array doesn't get deallocated when we exit the function */
+        static const char* const std_prefixes[] = { CONF_PATHS(""), NULL };
+        static const char* const usr_prefixes[] = { CONF_PATHS_USR(""), NULL };
+        static const char* const run_prefixes[] = { "/run/", NULL };
 
         if (path_equal(*name, "environment.d"))
                 /* Special case: we need to include /etc/environment in the search path, even
@@ -252,6 +256,11 @@ static int guess_type(const char **name, bool *is_usr, bool *is_collection, cons
                 ext = ".list";
         }
 
+        if (path_equal(n, "systemd/relabel-extra.d")) {
+                coll = run = true;
+                ext = ".relabel";
+        }
+
         if (PATH_IN_SET(n, "systemd/system-preset", "systemd/user-preset")) {
                 coll = true;
                 ext = ".preset";
@@ -260,7 +269,7 @@ static int guess_type(const char **name, bool *is_usr, bool *is_collection, cons
         if (path_equal(n, "systemd/user-preset"))
                 usr = true;
 
-        *is_usr = usr;
+        *prefixes = (char**) (usr ? usr_prefixes : run ? run_prefixes : std_prefixes);
         *is_collection = coll;
         *extension = ext;
         return 0;
@@ -269,19 +278,19 @@ static int guess_type(const char **name, bool *is_usr, bool *is_collection, cons
 int conf_files_cat(const char *root, const char *name) {
         _cleanup_strv_free_ char **dirs = NULL, **files = NULL;
         _cleanup_free_ char *path = NULL;
-        char **dir;
-        bool is_usr, is_collection;
+        char **prefixes, **prefix;
+        bool is_collection;
         const char *extension;
         char **t;
         int r;
 
-        r = guess_type(&name, &is_usr, &is_collection, &extension);
+        r = guess_type(&name, &prefixes, &is_collection, &extension);
         if (r < 0)
                 return r;
 
-        STRV_FOREACH(dir, is_usr ? CONF_PATHS_USR_STRV("") : CONF_PATHS_STRV("")) {
-                assert(endswith(*dir, "/"));
-                r = strv_extendf(&dirs, "%s%s%s", *dir, name,
+        STRV_FOREACH(prefix, prefixes) {
+                assert(endswith(*prefix, "/"));
+                r = strv_extendf(&dirs, "%s%s%s", *prefix, name,
                                  is_collection ? "" : ".d");
                 if (r < 0)
                         return log_error_errno(r, "Failed to build directory list: %m");