mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-02-02 09:47:03 +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:
parent
8328d8c633
commit
cf7d80a5fe
@ -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>
|
||||
|
@ -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;
|
||||
|
@ -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))
|
||||
|
Loading…
x
Reference in New Issue
Block a user