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=2590eb3abfc8aeed823c8f34ec3fe6bb2abc152c;hb=a5afffa151b9969bfb138c409c6092ce12fba340;hpb=bf9a6e8bfc2a03e549e35e72218ed9ad2574a6e2 diff --git a/src/path-lookup.c b/src/path-lookup.c index 2590eb3ab..5f5ad8c9f 100644 --- a/src/path-lookup.c +++ b/src/path-lookup.c @@ -1,4 +1,4 @@ -/*-*- Mode: C; c-basic-offset: 8 -*-*/ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ /*** This file is part of systemd. @@ -30,11 +30,11 @@ #include "path-lookup.h" -int session_config_home(char **config_home) { +int user_config_home(char **config_home) { const char *e; if ((e = getenv("XDG_CONFIG_HOME"))) { - if (asprintf(config_home, "%s/systemd/session", e) < 0) + if (asprintf(config_home, "%s/systemd/user", e) < 0) return -ENOMEM; return 1; @@ -42,7 +42,7 @@ int session_config_home(char **config_home) { const char *home; if ((home = getenv("HOME"))) { - if (asprintf(config_home, "%s/.config/systemd/session", home) < 0) + if (asprintf(config_home, "%s/.config/systemd/user", home) < 0) return -ENOMEM; return 1; @@ -52,7 +52,23 @@ int session_config_home(char **config_home) { return 0; } -static char** session_dirs(void) { +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; @@ -67,7 +83,7 @@ static char** session_dirs(void) { * as data, and allow overriding as configuration. */ - if (session_config_home(&config_home) < 0) + if (user_config_home(&config_home) < 0) goto fail; home = getenv("HOME"); @@ -81,11 +97,11 @@ static char** session_dirs(void) { * /etc/systemd/ anyway. */ if ((e = getenv("XDG_DATA_HOME"))) { - if (asprintf(&data_home, "%s/systemd/session", e) < 0) + if (asprintf(&data_home, "%s/systemd/user", e) < 0) goto fail; } else if (home) { - if (asprintf(&data_home, "%s/.local/share/systemd/session", home) < 0) + if (asprintf(&data_home, "%s/.local/share/systemd/user", home) < 0) goto fail; /* There is really no need for two unit dirs in $HOME, @@ -96,13 +112,15 @@ static char** session_dirs(void) { * one. */ mkdir_parents(data_home, 0777); - (void) symlink("../../../.config/systemd/session", data_home); + (void) symlink("../../../.config/systemd/user", data_home); } 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** session_dirs(void) { r = t; } - if (!(t = strv_merge_concat(r, config_dirs, "/systemd/session"))) - 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, SESSION_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** session_dirs(void) { r = t; } - if (!(t = strv_merge_concat(r, data_dirs, "/systemd/session"))) - 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, SESSION_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; @@ -176,20 +198,64 @@ int lookup_paths_init(LookupPaths *p, ManagerRunningAs running_as) { /* Nothing is set, so let's figure something out. */ strv_free(p->unit_path); - if (running_as == MANAGER_SESSION) { - if (!(p->unit_path = session_dirs())) + if (running_as == MANAGER_USER) { + + 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( - SYSTEM_CONFIG_UNIT_PATH, /* /etc/systemd/system/ */ - "/usr/local/share/systemd/system", - "/usr/share/systemd/system", - SYSTEM_DATA_UNIT_PATH, /* /lib/systemd/system/ */ + /* If you modify this you also want to modify + * systemdsystemunitpath= in systemd.pc.in! */ + "/run/systemd/system", + SYSTEM_CONFIG_UNIT_PATH, + "/etc/systemd/system", + "/usr/local/lib/systemd/system", + "/usr/lib/systemd/system", + SYSTEM_DATA_UNIT_PATH, + "/lib/systemd/system", NULL))) return -ENOMEM; } + if (p->unit_path) + if (!strv_path_canonicalize(p->unit_path)) + return -ENOMEM; + + strv_uniq(p->unit_path); + strv_path_remove_empty(p->unit_path); + + if (!strv_isempty(p->unit_path)) { + + if (!(t = strv_join(p->unit_path, "\n\t"))) + return -ENOMEM; + log_debug("Looking for unit files in:\n\t%s", t); + free(t); + } else { + log_debug("Ignoring unit files."); + strv_free(p->unit_path); + p->unit_path = NULL; + } + if (running_as == MANAGER_SYSTEM) { +#ifdef HAVE_SYSV_COMPAT /* /etc/init.d/ compatibility does not matter to users */ if ((e = getenv("SYSTEMD_SYSVINIT_PATH"))) @@ -217,60 +283,49 @@ int lookup_paths_init(LookupPaths *p, ManagerRunningAs running_as) { NULL))) return -ENOMEM; } - } - - if (p->unit_path) - if (!strv_path_canonicalize(p->unit_path)) - return -ENOMEM; - if (p->sysvinit_path) - if (!strv_path_canonicalize(p->sysvinit_path)) - return -ENOMEM; + if (p->sysvinit_path) + if (!strv_path_canonicalize(p->sysvinit_path)) + return -ENOMEM; - if (p->sysvrcnd_path) - if (!strv_path_canonicalize(p->sysvrcnd_path)) - return -ENOMEM; + if (p->sysvrcnd_path) + if (!strv_path_canonicalize(p->sysvrcnd_path)) + return -ENOMEM; - strv_uniq(p->unit_path); - strv_uniq(p->sysvinit_path); - strv_uniq(p->sysvrcnd_path); + strv_uniq(p->sysvinit_path); + strv_uniq(p->sysvrcnd_path); - if (!strv_isempty(p->unit_path)) { - - if (!(t = strv_join(p->unit_path, "\n\t"))) - return -ENOMEM; - log_debug("Looking for unit files in:\n\t%s", t); - free(t); - } else { - log_debug("Ignoring unit files."); - strv_free(p->unit_path); - p->unit_path = NULL; - } + strv_path_remove_empty(p->sysvinit_path); + strv_path_remove_empty(p->sysvrcnd_path); - if (!strv_isempty(p->sysvinit_path)) { + if (!strv_isempty(p->sysvinit_path)) { - if (!(t = strv_join(p->sysvinit_path, "\n\t"))) - return -ENOMEM; + if (!(t = strv_join(p->sysvinit_path, "\n\t"))) + return -ENOMEM; - log_debug("Looking for SysV init scripts in:\n\t%s", t); - free(t); - } else { - log_debug("Ignoring SysV init scripts."); - strv_free(p->sysvinit_path); - p->sysvinit_path = NULL; - } + log_debug("Looking for SysV init scripts in:\n\t%s", t); + free(t); + } else { + log_debug("Ignoring SysV init scripts."); + strv_free(p->sysvinit_path); + p->sysvinit_path = NULL; + } - if (!strv_isempty(p->sysvrcnd_path)) { + if (!strv_isempty(p->sysvrcnd_path)) { - if (!(t = strv_join(p->sysvrcnd_path, "\n\t"))) - return -ENOMEM; + if (!(t = strv_join(p->sysvrcnd_path, "\n\t"))) + return -ENOMEM; - log_debug("Looking for SysV rcN.d links in:\n\t%s", t); - free(t); - } else { - log_debug("Ignoring SysV rcN.d links."); - strv_free(p->sysvrcnd_path); - p->sysvrcnd_path = NULL; + log_debug("Looking for SysV rcN.d links in:\n\t%s", t); + free(t); + } else { + log_debug("Ignoring SysV rcN.d links."); + strv_free(p->sysvrcnd_path); + p->sysvrcnd_path = NULL; + } +#else + log_debug("Disabled SysV init scripts and rcN.d links support"); +#endif } return 0; @@ -280,8 +335,11 @@ void lookup_paths_free(LookupPaths *p) { assert(p); strv_free(p->unit_path); + p->unit_path = NULL; + +#ifdef HAVE_SYSV_COMPAT strv_free(p->sysvinit_path); strv_free(p->sysvrcnd_path); - - p->unit_path = p->sysvinit_path = p->sysvrcnd_path = NULL; + p->sysvinit_path = p->sysvrcnd_path = NULL; +#endif }