diff options
Diffstat (limited to 'src/shared')
-rw-r--r-- | src/shared/path-lookup.c | 82 | ||||
-rw-r--r-- | src/shared/path-lookup.h | 6 |
2 files changed, 81 insertions, 7 deletions
diff --git a/src/shared/path-lookup.c b/src/shared/path-lookup.c index ec3f5b53f4..5766053cef 100644 --- a/src/shared/path-lookup.c +++ b/src/shared/path-lookup.c @@ -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); diff --git a/src/shared/path-lookup.h b/src/shared/path-lookup.h index 1e3bce21a4..64c8035c2b 100644 --- a/src/shared/path-lookup.h +++ b/src/shared/path-lookup.h @@ -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; |