summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--man/systemd.unit.xml6
-rw-r--r--src/core/unit.c5
-rw-r--r--src/shared/path-lookup.c98
3 files changed, 58 insertions, 51 deletions
diff --git a/man/systemd.unit.xml b/man/systemd.unit.xml
index 86a8cbb330..dd3a4a7cd5 100644
--- a/man/systemd.unit.xml
+++ b/man/systemd.unit.xml
@@ -275,8 +275,10 @@
(<option>--user</option>) and the variable
<varname>$SYSTEMD_UNIT_PATH</varname> is set, this
contents of this variable overrides the unit load
- path.
- </para>
+ path. If <varname>$SYSTEMD_UNIT_PATH</varname> ends
+ with an empty component (<literal>:</literal>), the
+ usual unit load path will be appended to the contents
+ of the variable.</para>
<table>
<title>
diff --git a/src/core/unit.c b/src/core/unit.c
index 0e4ebfde9b..b68796a941 100644
--- a/src/core/unit.c
+++ b/src/core/unit.c
@@ -2165,11 +2165,8 @@ int unit_add_two_dependencies_by_name_inverse(Unit *u, UnitDependency d, UnitDep
}
int set_unit_path(const char *p) {
- _cleanup_free_ char *c = NULL;
-
/* This is mostly for debug purposes */
- c = path_make_absolute_cwd(p);
- if (setenv("SYSTEMD_UNIT_PATH", c, 0) < 0)
+ if (setenv("SYSTEMD_UNIT_PATH", p, 0) < 0)
return -errno;
return 0;
diff --git a/src/shared/path-lookup.c b/src/shared/path-lookup.c
index 46cfc12d7d..7a715b7133 100644
--- a/src/shared/path-lookup.c
+++ b/src/shared/path-lookup.c
@@ -187,6 +187,7 @@ int lookup_paths_init(
const char *generator_late) {
const char *e;
+ bool append = false; /* Add items from SYSTEMD_UNIT_PATH before normal directories */
assert(p);
@@ -194,69 +195,76 @@ int lookup_paths_init(
* vars */
e = getenv("SYSTEMD_UNIT_PATH");
if (e) {
+ if (endswith(e, ":")) {
+ e = strndupa(e, strlen(e) - 1);
+ append = true;
+ }
+
+ /* FIXME: empty components in other places should be
+ * rejected. */
+
p->unit_path = path_split_and_make_absolute(e);
if (!p->unit_path)
return -ENOMEM;
} else
p->unit_path = NULL;
- if (strv_isempty(p->unit_path)) {
- /* Nothing is set, so let's figure something out. */
- strv_free(p->unit_path);
+ if (!p->unit_path || append) {
+ /* Let's figure something out. */
+
+ char **unit_path;
+ int r;
/* For the user units we include share/ in the search
- * path in order to comply with the XDG basedir
- * spec. For the system stuff we avoid such
- * nonsense. OTOH we include /lib in the search path
- * for the system stuff but avoid it for user
- * stuff. */
+ * path in order to comply with the XDG basedir spec.
+ * For the system stuff we avoid such nonsense. OTOH
+ * we include /lib in the search path for the system
+ * stuff but avoid it for user stuff. */
if (running_as == SYSTEMD_USER) {
-
if (personal)
- p->unit_path = user_dirs(generator, generator_early, generator_late);
+ unit_path = user_dirs(generator, generator_early, generator_late);
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! */
- STRV_IFNOTNULL(generator_early),
- USER_CONFIG_UNIT_PATH,
- "/etc/systemd/user",
- "/run/systemd/user",
- STRV_IFNOTNULL(generator),
- "/usr/local/lib/systemd/user",
- "/usr/local/share/systemd/user",
- USER_DATA_UNIT_PATH,
- "/usr/lib/systemd/user",
- "/usr/share/systemd/user",
- STRV_IFNOTNULL(generator_late),
- NULL);
-
- if (!p->unit_path)
- return -ENOMEM;
-
- } else {
- p->unit_path = strv_new(
+ unit_path = strv_new(
/* If you modify this you also want to modify
- * systemdsystemunitpath= in systemd.pc.in! */
+ * systemduserunitpath= in systemd.pc.in, and
+ * the arrays in user_dirs() above! */
STRV_IFNOTNULL(generator_early),
- SYSTEM_CONFIG_UNIT_PATH,
- "/etc/systemd/system",
- "/run/systemd/system",
+ USER_CONFIG_UNIT_PATH,
+ "/etc/systemd/user",
+ "/run/systemd/user",
STRV_IFNOTNULL(generator),
- "/usr/local/lib/systemd/system",
- SYSTEM_DATA_UNIT_PATH,
- "/usr/lib/systemd/system",
-#ifdef HAVE_SPLIT_USR
- "/lib/systemd/system",
-#endif
+ "/usr/local/lib/systemd/user",
+ "/usr/local/share/systemd/user",
+ USER_DATA_UNIT_PATH,
+ "/usr/lib/systemd/user",
+ "/usr/share/systemd/user",
STRV_IFNOTNULL(generator_late),
NULL);
+ } else
+ unit_path = strv_new(
+ /* If you modify this you also want to modify
+ * systemdsystemunitpath= in systemd.pc.in! */
+ STRV_IFNOTNULL(generator_early),
+ SYSTEM_CONFIG_UNIT_PATH,
+ "/etc/systemd/system",
+ "/run/systemd/system",
+ STRV_IFNOTNULL(generator),
+ "/usr/local/lib/systemd/system",
+ SYSTEM_DATA_UNIT_PATH,
+ "/usr/lib/systemd/system",
+#ifdef HAVE_SPLIT_USR
+ "/lib/systemd/system",
+#endif
+ STRV_IFNOTNULL(generator_late),
+ NULL);
- if (!p->unit_path)
- return -ENOMEM;
- }
+ if (!unit_path)
+ return -ENOMEM;
+
+ r = strv_extend_strv(&p->unit_path, unit_path);
+ if (r < 0)
+ return r;
}
if (!path_strv_resolve_uniq(p->unit_path, root_dir))