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 /src/shared/path-lookup.c | |
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.
Diffstat (limited to 'src/shared/path-lookup.c')
-rw-r--r-- | src/shared/path-lookup.c | 98 |
1 files changed, 53 insertions, 45 deletions
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)) |