1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2024-10-27 18:55:09 +03:00

path-lookup: make SYSTEMD_UNIT_PATH more flexible

It can now contain more than one directory, and can be used
to only prepend, not totally override, the normal load path.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2014-07-20 17:56:57 -04:00
parent 8328d8c633
commit cf7d80a5fe
3 changed files with 58 additions and 51 deletions

View File

@ -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>

View File

@ -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;

View File

@ -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,29 +195,37 @@ 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(
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! */
@ -232,12 +241,8 @@ int lookup_paths_init(
"/usr/share/systemd/user",
STRV_IFNOTNULL(generator_late),
NULL);
if (!p->unit_path)
return -ENOMEM;
} else {
p->unit_path = strv_new(
} else
unit_path = strv_new(
/* If you modify this you also want to modify
* systemdsystemunitpath= in systemd.pc.in! */
STRV_IFNOTNULL(generator_early),
@ -254,9 +259,12 @@ int lookup_paths_init(
STRV_IFNOTNULL(generator_late),
NULL);
if (!p->unit_path)
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))