X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fpath-lookup.c;h=5f5ad8c9f59c3b2079f0f793e241797650c369ea;hp=922e722e17be40b4743c5c306027caf84cb71a7f;hb=a5afffa151b9969bfb138c409c6092ce12fba340;hpb=b925e72633bf98438f56a140520e07ec8c959e46 diff --git a/src/path-lookup.c b/src/path-lookup.c index 922e722e1..5f5ad8c9f 100644 --- a/src/path-lookup.c +++ b/src/path-lookup.c @@ -53,6 +53,22 @@ int user_config_home(char **config_home) { } static char** user_dirs(void) { + const char * const config_unit_paths[] = { + "/run/systemd/user", + USER_CONFIG_UNIT_PATH, + "/etc/systemd/user", + NULL + }; + + const char * const data_unit_paths[] = { + "/usr/local/lib/systemd/user", + "/usr/local/share/systemd/user", + USER_DATA_UNIT_PATH, + "/usr/lib/systemd/user", + "/usr/share/systemd/user", + NULL + }; + const char *home, *e; char *config_home = NULL, *data_home = NULL; char **config_dirs = NULL, **data_dirs = NULL; @@ -102,7 +118,9 @@ static char** user_dirs(void) { if ((e = getenv("XDG_DATA_DIRS"))) data_dirs = strv_split(e, ":"); else - data_dirs = strv_new("/usr/local/share", "/usr/share", NULL); + data_dirs = strv_new("/usr/local/share", + "/usr/share", + NULL); if (!data_dirs) goto fail; @@ -115,12 +133,14 @@ static char** user_dirs(void) { r = t; } - if (!(t = strv_merge_concat(r, config_dirs, "/systemd/user"))) - goto finish; - strv_free(r); - r = t; + if (!strv_isempty(config_dirs)) { + if (!(t = strv_merge_concat(r, config_dirs, "/systemd/user"))) + goto finish; + strv_free(r); + r = t; + } - if (!(t = strv_append(r, USER_CONFIG_UNIT_PATH))) + if (!(t = strv_merge(r, (char**) config_unit_paths))) goto fail; strv_free(r); r = t; @@ -132,12 +152,14 @@ static char** user_dirs(void) { r = t; } - if (!(t = strv_merge_concat(r, data_dirs, "/systemd/user"))) - goto fail; - strv_free(r); - r = t; + if (!strv_isempty(data_dirs)) { + if (!(t = strv_merge_concat(r, data_dirs, "/systemd/user"))) + goto fail; + strv_free(r); + r = t; + } - if (!(t = strv_append(r, USER_DATA_UNIT_PATH))) + if (!(t = strv_merge(r, (char**) data_unit_paths))) goto fail; strv_free(r); r = t; @@ -159,7 +181,7 @@ fail: goto finish; } -int lookup_paths_init(LookupPaths *p, ManagerRunningAs running_as) { +int lookup_paths_init(LookupPaths *p, ManagerRunningAs running_as, bool personal) { const char *e; char *t; @@ -177,19 +199,38 @@ int lookup_paths_init(LookupPaths *p, ManagerRunningAs running_as) { strv_free(p->unit_path); if (running_as == MANAGER_USER) { - if (!(p->unit_path = user_dirs())) + + if (personal) + p->unit_path = user_dirs(); + else + p->unit_path = strv_new( + /* If you modify this you also want to modify + * systemduserunitpath= in systemd.pc.in, and + * the arrays in user_dirs() above! */ + "/run/systemd/user", + USER_CONFIG_UNIT_PATH, + "/etc/systemd/user", + "/usr/local/lib/systemd/user", + "/usr/local/share/systemd/user", + USER_DATA_UNIT_PATH, + "/usr/lib/systemd/user", + "/usr/share/systemd/user", + NULL); + + if (!p->unit_path) return -ENOMEM; + } else if (!(p->unit_path = strv_new( /* If you modify this you also want to modify * systemdsystemunitpath= in systemd.pc.in! */ - "/dev/.run/systemd/system", + "/run/systemd/system", SYSTEM_CONFIG_UNIT_PATH, "/etc/systemd/system", - "/usr/local/share/systemd/system", - "/usr/share/systemd/system", - "/lib/systemd/system", + "/usr/local/lib/systemd/system", + "/usr/lib/systemd/system", SYSTEM_DATA_UNIT_PATH, + "/lib/systemd/system", NULL))) return -ENOMEM; } @@ -199,6 +240,7 @@ int lookup_paths_init(LookupPaths *p, ManagerRunningAs running_as) { return -ENOMEM; strv_uniq(p->unit_path); + strv_path_remove_empty(p->unit_path); if (!strv_isempty(p->unit_path)) { @@ -253,6 +295,9 @@ int lookup_paths_init(LookupPaths *p, ManagerRunningAs running_as) { strv_uniq(p->sysvinit_path); strv_uniq(p->sysvrcnd_path); + strv_path_remove_empty(p->sysvinit_path); + strv_path_remove_empty(p->sysvrcnd_path); + if (!strv_isempty(p->sysvinit_path)) { if (!(t = strv_join(p->sysvinit_path, "\n\t")))