]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core: add configuration directories to LookupPaths
authorLennart Poettering <lennart@poettering.net>
Wed, 24 Feb 2016 16:18:42 +0000 (17:18 +0100)
committerLennart Poettering <lennart@poettering.net>
Tue, 12 Apr 2016 11:43:30 +0000 (13:43 +0200)
Let's add a seperate fields for the directories where we place runtime and
persistent configuration, so that we can use this in install.c (to be added in
a later commit), and we store path information in the same place everywhere.

src/shared/path-lookup.c
src/shared/path-lookup.h

index ec3f5b53f4151332e2d39423be647834587188cd..5766053cefd50bfeab2a21bc0690bc17598b0e9f 100644 (file)
@@ -106,6 +106,8 @@ static int user_data_home_dir(char **dir, const char *suffix) {
 }
 
 static char** user_dirs(
+                const char *persistent_config,
+                const char *runtime_config,
                 const char *generator,
                 const char *generator_early,
                 const char *generator_late) {
@@ -116,8 +118,6 @@ static char** user_dirs(
                 NULL
         };
 
-        const char * const runtime_unit_path = "/run/systemd/user";
-
         const char * const data_unit_paths[] = {
                 "/usr/local/lib/systemd/user",
                 "/usr/local/share/systemd/user",
@@ -183,6 +183,9 @@ static char** user_dirs(
                 if (strv_extend_strv_concat(&res, config_dirs, "/systemd/user") < 0)
                         return NULL;
 
+        if (strv_extend(&res, persistent_config) < 0)
+                return NULL;
+
         if (strv_extend_strv(&res, (char**) config_unit_paths, false) < 0)
                 return NULL;
 
@@ -190,7 +193,7 @@ static char** user_dirs(
                 if (strv_extend(&res, runtime_dir) < 0)
                         return NULL;
 
-        if (strv_extend(&res, runtime_unit_path) < 0)
+        if (strv_extend(&res, runtime_config) < 0)
                 return NULL;
 
         if (generator)
@@ -282,6 +285,48 @@ static int acquire_generator_dirs(
         return 0;
 }
 
+static int acquire_config_dirs(ManagerRunningAs running_as, bool personal, char **persistent, char **runtime) {
+        _cleanup_free_ char *a = NULL, *b = NULL;
+        int r;
+
+        assert(persistent);
+        assert(runtime);
+
+        if (running_as == MANAGER_SYSTEM) {
+                a = strdup(SYSTEM_CONFIG_UNIT_PATH);
+                b = strdup("/run/systemd/system");
+        } else if (personal) {
+                assert(running_as == MANAGER_USER);
+
+                r = user_config_home(&a);
+                if (r < 0)
+                        return r;
+
+                r = user_runtime_dir(runtime);
+                if (r < 0)
+                        return r;
+
+                *persistent = a;
+                a = NULL;
+
+                return 0;
+        } else {
+                assert(running_as == MANAGER_USER);
+
+                a = strdup(USER_CONFIG_UNIT_PATH);
+                b = strdup("/run/systemd/user");
+        }
+
+        if (!a || !b)
+                return -ENOMEM;
+
+        *persistent = a;
+        *runtime = b;
+        a = b = NULL;
+
+        return 0;
+}
+
 static int patch_root_prefix(char **p, const char *root_dir) {
         char *c;
 
@@ -309,7 +354,8 @@ int lookup_paths_init(
                 bool personal,
                 const char *root_dir) {
 
-        _cleanup_free_ char *generator = NULL, *generator_early = NULL, *generator_late = NULL;
+        _cleanup_free_ char *generator = NULL, *generator_early = NULL, *generator_late = NULL,
+                *persistent_config = NULL, *runtime_config = NULL;
         bool append = false; /* Add items from SYSTEMD_UNIT_PATH before normal directories */
         char **l = NULL;
         const char *e;
@@ -319,6 +365,10 @@ int lookup_paths_init(
         assert(running_as >= 0);
         assert(running_as < _MANAGER_RUNNING_AS_MAX);
 
+        r = acquire_config_dirs(running_as, personal, &persistent_config, &runtime_config);
+        if (r < 0)
+                return r;
+
         r = acquire_generator_dirs(running_as, &generator, &generator_early, &generator_late);
         if (r < 0)
                 return r;
@@ -357,15 +407,17 @@ int lookup_paths_init(
 
                 if (running_as == MANAGER_USER) {
                         if (personal)
-                                add = user_dirs(generator, generator_early, generator_late);
+                                add = user_dirs(persistent_config, runtime_config,
+                                                generator, generator_early, generator_late);
                         else
                                 add = strv_new(
                                         /* If you modify this you also want to modify
                                          * systemduserunitpath= in systemd.pc.in, and
                                          * the arrays in user_dirs() above! */
                                         generator_early,
-                                        USER_CONFIG_UNIT_PATH,
+                                        persistent_config,
                                         "/etc/systemd/user",
+                                        runtime_config,
                                         "/run/systemd/user",
                                         generator,
                                         "/usr/local/lib/systemd/user",
@@ -380,8 +432,9 @@ int lookup_paths_init(
                                 /* If you modify this you also want to modify
                                  * systemdsystemunitpath= in systemd.pc.in! */
                                 generator_early,
-                                SYSTEM_CONFIG_UNIT_PATH,
+                                persistent_config,
                                 "/etc/systemd/system",
+                                runtime_config,
                                 "/run/systemd/system",
                                 generator,
                                 "/usr/local/lib/systemd/system",
@@ -406,6 +459,13 @@ int lookup_paths_init(
                 }
         }
 
+        r = patch_root_prefix(&persistent_config, root_dir);
+        if (r < 0)
+                return r;
+        r = patch_root_prefix(&runtime_config, root_dir);
+        if (r < 0)
+                return r;
+
         r = patch_root_prefix(&generator, root_dir);
         if (r < 0)
                 return r;
@@ -435,6 +495,10 @@ int lookup_paths_init(
         p->search_path = l;
         l = NULL;
 
+        p->persistent_config = persistent_config;
+        p->runtime_config = runtime_config;
+        persistent_config = runtime_config = NULL;
+
         p->generator = generator;
         p->generator_early = generator_early;
         p->generator_late = generator_late;
@@ -448,6 +512,10 @@ void lookup_paths_free(LookupPaths *p) {
                 return;
 
         p->search_path = strv_free(p->search_path);
+
+        p->persistent_config = mfree(p->persistent_config);
+        p->runtime_config = mfree(p->runtime_config);
+
         p->generator = mfree(p->generator);
         p->generator_early = mfree(p->generator_early);
         p->generator_late = mfree(p->generator_late);
index 1e3bce21a4cdc5ba855d8d5ece26265feb48bce6..64c8035c2bfebfdaae4ca38bcdacdafd86a885f8 100644 (file)
@@ -29,6 +29,12 @@ typedef enum ManagerRunningAs ManagerRunningAs;
 
 struct LookupPaths {
         char **search_path;
+
+        /* Where we shall create or remove our installation symlinks, aka "configuration". */
+        char *persistent_config;
+        char *runtime_config;
+
+        /* Where to place generated unit files */
         char *generator;
         char *generator_early;
         char *generator_late;