diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2014-07-20 17:56:57 -0400 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2014-07-20 19:48:16 -0400 |
commit | cf7d80a5fe549d4db11800015e02220dccec3096 (patch) | |
tree | 05b65bec6fc7fa21ec3cf64f8b0a7816cfd51829 | |
parent | 8328d8c63332319965fd288634a9a709e9b96425 (diff) |
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.
-rw-r--r-- | man/systemd.unit.xml | 6 | ||||
-rw-r--r-- | src/core/unit.c | 5 | ||||
-rw-r--r-- | src/shared/path-lookup.c | 98 |
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)) |