2010-06-15 14:45:15 +02:00
|
|
|
/***
|
|
|
|
This file is part of systemd.
|
|
|
|
|
|
|
|
Copyright 2010 Lennart Poettering
|
|
|
|
|
|
|
|
systemd is free software; you can redistribute it and/or modify it
|
2012-04-12 00:20:58 +02:00
|
|
|
under the terms of the GNU Lesser General Public License as published by
|
|
|
|
the Free Software Foundation; either version 2.1 of the License, or
|
2010-06-15 14:45:15 +02:00
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
systemd is distributed in the hope that it will be useful, but
|
|
|
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
2012-04-12 00:20:58 +02:00
|
|
|
Lesser General Public License for more details.
|
2010-06-15 14:45:15 +02:00
|
|
|
|
2012-04-12 00:20:58 +02:00
|
|
|
You should have received a copy of the GNU Lesser General Public License
|
2010-06-15 14:45:15 +02:00
|
|
|
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
***/
|
|
|
|
|
2015-11-16 22:09:36 +01:00
|
|
|
#include <errno.h>
|
2010-06-15 14:45:15 +02:00
|
|
|
#include <stdio.h>
|
2015-11-16 22:09:36 +01:00
|
|
|
#include <stdlib.h>
|
2012-09-18 17:11:12 +02:00
|
|
|
#include <string.h>
|
2010-06-15 14:45:15 +02:00
|
|
|
|
2015-10-27 03:01:06 +01:00
|
|
|
#include "alloc-util.h"
|
2015-03-15 02:46:59 +01:00
|
|
|
#include "install.h"
|
2015-12-03 21:13:37 +01:00
|
|
|
#include "log.h"
|
|
|
|
#include "macro.h"
|
2015-10-24 22:58:24 +02:00
|
|
|
#include "path-lookup.h"
|
2015-11-16 22:09:36 +01:00
|
|
|
#include "path-util.h"
|
|
|
|
#include "string-util.h"
|
|
|
|
#include "strv.h"
|
|
|
|
#include "util.h"
|
2010-06-15 14:45:15 +02:00
|
|
|
|
2010-11-15 22:12:41 +01:00
|
|
|
int user_config_home(char **config_home) {
|
2010-06-16 01:58:50 +02:00
|
|
|
const char *e;
|
2013-02-27 18:50:41 +01:00
|
|
|
char *r;
|
2010-06-16 01:58:50 +02:00
|
|
|
|
2012-05-23 03:43:29 +02:00
|
|
|
e = getenv("XDG_CONFIG_HOME");
|
|
|
|
if (e) {
|
2013-02-27 18:50:41 +01:00
|
|
|
r = strappend(e, "/systemd/user");
|
|
|
|
if (!r)
|
2010-06-16 01:58:50 +02:00
|
|
|
return -ENOMEM;
|
|
|
|
|
2013-02-27 18:50:41 +01:00
|
|
|
*config_home = r;
|
2010-06-16 01:58:50 +02:00
|
|
|
return 1;
|
|
|
|
} else {
|
|
|
|
const char *home;
|
|
|
|
|
2012-05-23 03:43:29 +02:00
|
|
|
home = getenv("HOME");
|
|
|
|
if (home) {
|
2013-02-27 18:50:41 +01:00
|
|
|
r = strappend(home, "/.config/systemd/user");
|
|
|
|
if (!r)
|
2010-06-16 01:58:50 +02:00
|
|
|
return -ENOMEM;
|
|
|
|
|
2013-02-27 18:50:41 +01:00
|
|
|
*config_home = r;
|
2010-06-16 01:58:50 +02:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2014-10-02 14:01:00 +02:00
|
|
|
int user_runtime_dir(char **runtime_dir) {
|
2014-09-28 23:54:25 +02:00
|
|
|
const char *e;
|
|
|
|
char *r;
|
|
|
|
|
|
|
|
e = getenv("XDG_RUNTIME_DIR");
|
|
|
|
if (e) {
|
|
|
|
r = strappend(e, "/systemd/user");
|
|
|
|
if (!r)
|
|
|
|
return -ENOMEM;
|
|
|
|
|
2014-10-02 14:01:00 +02:00
|
|
|
*runtime_dir = r;
|
2014-09-28 23:54:25 +02:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
Implement masking and overriding of generators
Sometimes it is necessary to stop a generator from running. Either
because of a bug, or for testing, or some other reason. The only way
to do that would be to rename or chmod the generator binary, which is
inconvenient and does not survive upgrades. Allow masking and
overriding generators similarly to units and other configuration
files.
For the systemd instance, masking would be more common, rather than
overriding generators. For the user instances, it may also be useful
for users to have generators in $XDG_CONFIG_HOME to augment or
override system-wide generators.
Directories are searched according to the usual scheme (/usr/lib,
/usr/local/lib, /run, /etc), and files with the same name in higher
priority directories override files with the same name in lower
priority directories. Empty files and links to /dev/null mask a given
name.
https://bugs.freedesktop.org/show_bug.cgi?id=87230
2015-01-09 02:47:25 +01:00
|
|
|
static int user_data_home_dir(char **dir, const char *suffix) {
|
|
|
|
const char *e;
|
|
|
|
char *res;
|
|
|
|
|
|
|
|
/* We don't treat /etc/xdg/systemd here as the spec
|
|
|
|
* suggests because we assume that that is a link to
|
|
|
|
* /etc/systemd/ anyway. */
|
|
|
|
|
|
|
|
e = getenv("XDG_DATA_HOME");
|
|
|
|
if (e)
|
|
|
|
res = strappend(e, suffix);
|
|
|
|
else {
|
|
|
|
const char *home;
|
|
|
|
|
|
|
|
home = getenv("HOME");
|
|
|
|
if (home)
|
|
|
|
res = strjoin(home, "/.local/share", suffix, NULL);
|
|
|
|
else
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
if (!res)
|
|
|
|
return -ENOMEM;
|
|
|
|
|
|
|
|
*dir = res;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-05-23 03:43:29 +02:00
|
|
|
static char** user_dirs(
|
|
|
|
const char *generator,
|
|
|
|
const char *generator_early,
|
|
|
|
const char *generator_late) {
|
|
|
|
|
2011-07-22 04:19:29 +02:00
|
|
|
const char * const config_unit_paths[] = {
|
|
|
|
USER_CONFIG_UNIT_PATH,
|
2011-07-23 00:47:50 +02:00
|
|
|
"/etc/systemd/user",
|
|
|
|
NULL
|
2011-07-22 04:19:29 +02:00
|
|
|
};
|
|
|
|
|
2014-09-28 23:54:25 +02:00
|
|
|
const char * const runtime_unit_path = "/run/systemd/user";
|
|
|
|
|
2011-07-22 04:19:29 +02:00
|
|
|
const char * const data_unit_paths[] = {
|
|
|
|
"/usr/local/lib/systemd/user",
|
|
|
|
"/usr/local/share/systemd/user",
|
|
|
|
USER_DATA_UNIT_PATH,
|
|
|
|
"/usr/lib/systemd/user",
|
2011-07-23 00:47:50 +02:00
|
|
|
"/usr/share/systemd/user",
|
|
|
|
NULL
|
2011-07-22 04:19:29 +02:00
|
|
|
};
|
|
|
|
|
Implement masking and overriding of generators
Sometimes it is necessary to stop a generator from running. Either
because of a bug, or for testing, or some other reason. The only way
to do that would be to rename or chmod the generator binary, which is
inconvenient and does not survive upgrades. Allow masking and
overriding generators similarly to units and other configuration
files.
For the systemd instance, masking would be more common, rather than
overriding generators. For the user instances, it may also be useful
for users to have generators in $XDG_CONFIG_HOME to augment or
override system-wide generators.
Directories are searched according to the usual scheme (/usr/lib,
/usr/local/lib, /run, /etc), and files with the same name in higher
priority directories override files with the same name in lower
priority directories. Empty files and links to /dev/null mask a given
name.
https://bugs.freedesktop.org/show_bug.cgi?id=87230
2015-01-09 02:47:25 +01:00
|
|
|
const char *e;
|
2014-10-02 14:01:00 +02:00
|
|
|
_cleanup_free_ char *config_home = NULL, *runtime_dir = NULL, *data_home = NULL;
|
2014-01-04 02:35:27 +01:00
|
|
|
_cleanup_strv_free_ char **config_dirs = NULL, **data_dirs = NULL;
|
Implement masking and overriding of generators
Sometimes it is necessary to stop a generator from running. Either
because of a bug, or for testing, or some other reason. The only way
to do that would be to rename or chmod the generator binary, which is
inconvenient and does not survive upgrades. Allow masking and
overriding generators similarly to units and other configuration
files.
For the systemd instance, masking would be more common, rather than
overriding generators. For the user instances, it may also be useful
for users to have generators in $XDG_CONFIG_HOME to augment or
override system-wide generators.
Directories are searched according to the usual scheme (/usr/lib,
/usr/local/lib, /run, /etc), and files with the same name in higher
priority directories override files with the same name in lower
priority directories. Empty files and links to /dev/null mask a given
name.
https://bugs.freedesktop.org/show_bug.cgi?id=87230
2015-01-09 02:47:25 +01:00
|
|
|
_cleanup_free_ char **res = NULL;
|
|
|
|
char **tmp;
|
|
|
|
int r;
|
2010-06-15 14:45:15 +02:00
|
|
|
|
|
|
|
/* Implement the mechanisms defined in
|
|
|
|
*
|
|
|
|
* http://standards.freedesktop.org/basedir-spec/basedir-spec-0.6.html
|
|
|
|
*
|
|
|
|
* We look in both the config and the data dirs because we
|
|
|
|
* want to encourage that distributors ship their unit files
|
|
|
|
* as data, and allow overriding as configuration.
|
|
|
|
*/
|
|
|
|
|
2010-11-15 22:12:41 +01:00
|
|
|
if (user_config_home(&config_home) < 0)
|
Implement masking and overriding of generators
Sometimes it is necessary to stop a generator from running. Either
because of a bug, or for testing, or some other reason. The only way
to do that would be to rename or chmod the generator binary, which is
inconvenient and does not survive upgrades. Allow masking and
overriding generators similarly to units and other configuration
files.
For the systemd instance, masking would be more common, rather than
overriding generators. For the user instances, it may also be useful
for users to have generators in $XDG_CONFIG_HOME to augment or
override system-wide generators.
Directories are searched according to the usual scheme (/usr/lib,
/usr/local/lib, /run, /etc), and files with the same name in higher
priority directories override files with the same name in lower
priority directories. Empty files and links to /dev/null mask a given
name.
https://bugs.freedesktop.org/show_bug.cgi?id=87230
2015-01-09 02:47:25 +01:00
|
|
|
return NULL;
|
2010-06-15 14:45:15 +02:00
|
|
|
|
2014-10-02 14:01:00 +02:00
|
|
|
if (user_runtime_dir(&runtime_dir) < 0)
|
Implement masking and overriding of generators
Sometimes it is necessary to stop a generator from running. Either
because of a bug, or for testing, or some other reason. The only way
to do that would be to rename or chmod the generator binary, which is
inconvenient and does not survive upgrades. Allow masking and
overriding generators similarly to units and other configuration
files.
For the systemd instance, masking would be more common, rather than
overriding generators. For the user instances, it may also be useful
for users to have generators in $XDG_CONFIG_HOME to augment or
override system-wide generators.
Directories are searched according to the usual scheme (/usr/lib,
/usr/local/lib, /run, /etc), and files with the same name in higher
priority directories override files with the same name in lower
priority directories. Empty files and links to /dev/null mask a given
name.
https://bugs.freedesktop.org/show_bug.cgi?id=87230
2015-01-09 02:47:25 +01:00
|
|
|
return NULL;
|
2010-06-15 14:45:15 +02:00
|
|
|
|
2012-05-23 03:43:29 +02:00
|
|
|
e = getenv("XDG_CONFIG_DIRS");
|
|
|
|
if (e) {
|
|
|
|
config_dirs = strv_split(e, ":");
|
|
|
|
if (!config_dirs)
|
Implement masking and overriding of generators
Sometimes it is necessary to stop a generator from running. Either
because of a bug, or for testing, or some other reason. The only way
to do that would be to rename or chmod the generator binary, which is
inconvenient and does not survive upgrades. Allow masking and
overriding generators similarly to units and other configuration
files.
For the systemd instance, masking would be more common, rather than
overriding generators. For the user instances, it may also be useful
for users to have generators in $XDG_CONFIG_HOME to augment or
override system-wide generators.
Directories are searched according to the usual scheme (/usr/lib,
/usr/local/lib, /run, /etc), and files with the same name in higher
priority directories override files with the same name in lower
priority directories. Empty files and links to /dev/null mask a given
name.
https://bugs.freedesktop.org/show_bug.cgi?id=87230
2015-01-09 02:47:25 +01:00
|
|
|
return NULL;
|
2012-05-23 03:43:29 +02:00
|
|
|
}
|
2010-06-15 14:45:15 +02:00
|
|
|
|
Implement masking and overriding of generators
Sometimes it is necessary to stop a generator from running. Either
because of a bug, or for testing, or some other reason. The only way
to do that would be to rename or chmod the generator binary, which is
inconvenient and does not survive upgrades. Allow masking and
overriding generators similarly to units and other configuration
files.
For the systemd instance, masking would be more common, rather than
overriding generators. For the user instances, it may also be useful
for users to have generators in $XDG_CONFIG_HOME to augment or
override system-wide generators.
Directories are searched according to the usual scheme (/usr/lib,
/usr/local/lib, /run, /etc), and files with the same name in higher
priority directories override files with the same name in lower
priority directories. Empty files and links to /dev/null mask a given
name.
https://bugs.freedesktop.org/show_bug.cgi?id=87230
2015-01-09 02:47:25 +01:00
|
|
|
r = user_data_home_dir(&data_home, "/systemd/user");
|
|
|
|
if (r < 0)
|
|
|
|
return NULL;
|
2010-06-15 14:45:15 +02:00
|
|
|
|
2012-05-23 03:43:29 +02:00
|
|
|
e = getenv("XDG_DATA_DIRS");
|
|
|
|
if (e)
|
2010-06-15 14:45:15 +02:00
|
|
|
data_dirs = strv_split(e, ":");
|
|
|
|
else
|
2011-04-04 19:02:32 +02:00
|
|
|
data_dirs = strv_new("/usr/local/share",
|
|
|
|
"/usr/share",
|
|
|
|
NULL);
|
2010-06-15 14:45:15 +02:00
|
|
|
if (!data_dirs)
|
Implement masking and overriding of generators
Sometimes it is necessary to stop a generator from running. Either
because of a bug, or for testing, or some other reason. The only way
to do that would be to rename or chmod the generator binary, which is
inconvenient and does not survive upgrades. Allow masking and
overriding generators similarly to units and other configuration
files.
For the systemd instance, masking would be more common, rather than
overriding generators. For the user instances, it may also be useful
for users to have generators in $XDG_CONFIG_HOME to augment or
override system-wide generators.
Directories are searched according to the usual scheme (/usr/lib,
/usr/local/lib, /run, /etc), and files with the same name in higher
priority directories override files with the same name in lower
priority directories. Empty files and links to /dev/null mask a given
name.
https://bugs.freedesktop.org/show_bug.cgi?id=87230
2015-01-09 02:47:25 +01:00
|
|
|
return NULL;
|
2010-06-15 14:45:15 +02:00
|
|
|
|
|
|
|
/* Now merge everything we found. */
|
2014-01-04 02:35:27 +01:00
|
|
|
if (generator_early)
|
Implement masking and overriding of generators
Sometimes it is necessary to stop a generator from running. Either
because of a bug, or for testing, or some other reason. The only way
to do that would be to rename or chmod the generator binary, which is
inconvenient and does not survive upgrades. Allow masking and
overriding generators similarly to units and other configuration
files.
For the systemd instance, masking would be more common, rather than
overriding generators. For the user instances, it may also be useful
for users to have generators in $XDG_CONFIG_HOME to augment or
override system-wide generators.
Directories are searched according to the usual scheme (/usr/lib,
/usr/local/lib, /run, /etc), and files with the same name in higher
priority directories override files with the same name in lower
priority directories. Empty files and links to /dev/null mask a given
name.
https://bugs.freedesktop.org/show_bug.cgi?id=87230
2015-01-09 02:47:25 +01:00
|
|
|
if (strv_extend(&res, generator_early) < 0)
|
|
|
|
return NULL;
|
2012-05-23 03:43:29 +02:00
|
|
|
|
2014-01-04 02:35:27 +01:00
|
|
|
if (config_home)
|
Implement masking and overriding of generators
Sometimes it is necessary to stop a generator from running. Either
because of a bug, or for testing, or some other reason. The only way
to do that would be to rename or chmod the generator binary, which is
inconvenient and does not survive upgrades. Allow masking and
overriding generators similarly to units and other configuration
files.
For the systemd instance, masking would be more common, rather than
overriding generators. For the user instances, it may also be useful
for users to have generators in $XDG_CONFIG_HOME to augment or
override system-wide generators.
Directories are searched according to the usual scheme (/usr/lib,
/usr/local/lib, /run, /etc), and files with the same name in higher
priority directories override files with the same name in lower
priority directories. Empty files and links to /dev/null mask a given
name.
https://bugs.freedesktop.org/show_bug.cgi?id=87230
2015-01-09 02:47:25 +01:00
|
|
|
if (strv_extend(&res, config_home) < 0)
|
|
|
|
return NULL;
|
2010-06-15 14:45:15 +02:00
|
|
|
|
2014-10-02 14:11:21 +02:00
|
|
|
if (!strv_isempty(config_dirs))
|
Implement masking and overriding of generators
Sometimes it is necessary to stop a generator from running. Either
because of a bug, or for testing, or some other reason. The only way
to do that would be to rename or chmod the generator binary, which is
inconvenient and does not survive upgrades. Allow masking and
overriding generators similarly to units and other configuration
files.
For the systemd instance, masking would be more common, rather than
overriding generators. For the user instances, it may also be useful
for users to have generators in $XDG_CONFIG_HOME to augment or
override system-wide generators.
Directories are searched according to the usual scheme (/usr/lib,
/usr/local/lib, /run, /etc), and files with the same name in higher
priority directories override files with the same name in lower
priority directories. Empty files and links to /dev/null mask a given
name.
https://bugs.freedesktop.org/show_bug.cgi?id=87230
2015-01-09 02:47:25 +01:00
|
|
|
if (strv_extend_strv_concat(&res, config_dirs, "/systemd/user") < 0)
|
|
|
|
return NULL;
|
2014-09-28 23:54:25 +02:00
|
|
|
|
2015-10-07 11:26:10 +02:00
|
|
|
if (strv_extend_strv(&res, (char**) config_unit_paths, false) < 0)
|
Implement masking and overriding of generators
Sometimes it is necessary to stop a generator from running. Either
because of a bug, or for testing, or some other reason. The only way
to do that would be to rename or chmod the generator binary, which is
inconvenient and does not survive upgrades. Allow masking and
overriding generators similarly to units and other configuration
files.
For the systemd instance, masking would be more common, rather than
overriding generators. For the user instances, it may also be useful
for users to have generators in $XDG_CONFIG_HOME to augment or
override system-wide generators.
Directories are searched according to the usual scheme (/usr/lib,
/usr/local/lib, /run, /etc), and files with the same name in higher
priority directories override files with the same name in lower
priority directories. Empty files and links to /dev/null mask a given
name.
https://bugs.freedesktop.org/show_bug.cgi?id=87230
2015-01-09 02:47:25 +01:00
|
|
|
return NULL;
|
2014-09-28 23:54:25 +02:00
|
|
|
|
2014-10-02 14:11:21 +02:00
|
|
|
if (runtime_dir)
|
Implement masking and overriding of generators
Sometimes it is necessary to stop a generator from running. Either
because of a bug, or for testing, or some other reason. The only way
to do that would be to rename or chmod the generator binary, which is
inconvenient and does not survive upgrades. Allow masking and
overriding generators similarly to units and other configuration
files.
For the systemd instance, masking would be more common, rather than
overriding generators. For the user instances, it may also be useful
for users to have generators in $XDG_CONFIG_HOME to augment or
override system-wide generators.
Directories are searched according to the usual scheme (/usr/lib,
/usr/local/lib, /run, /etc), and files with the same name in higher
priority directories override files with the same name in lower
priority directories. Empty files and links to /dev/null mask a given
name.
https://bugs.freedesktop.org/show_bug.cgi?id=87230
2015-01-09 02:47:25 +01:00
|
|
|
if (strv_extend(&res, runtime_dir) < 0)
|
|
|
|
return NULL;
|
2010-06-15 14:45:15 +02:00
|
|
|
|
Implement masking and overriding of generators
Sometimes it is necessary to stop a generator from running. Either
because of a bug, or for testing, or some other reason. The only way
to do that would be to rename or chmod the generator binary, which is
inconvenient and does not survive upgrades. Allow masking and
overriding generators similarly to units and other configuration
files.
For the systemd instance, masking would be more common, rather than
overriding generators. For the user instances, it may also be useful
for users to have generators in $XDG_CONFIG_HOME to augment or
override system-wide generators.
Directories are searched according to the usual scheme (/usr/lib,
/usr/local/lib, /run, /etc), and files with the same name in higher
priority directories override files with the same name in lower
priority directories. Empty files and links to /dev/null mask a given
name.
https://bugs.freedesktop.org/show_bug.cgi?id=87230
2015-01-09 02:47:25 +01:00
|
|
|
if (strv_extend(&res, runtime_unit_path) < 0)
|
|
|
|
return NULL;
|
2010-06-15 14:45:15 +02:00
|
|
|
|
2014-01-04 02:35:27 +01:00
|
|
|
if (generator)
|
Implement masking and overriding of generators
Sometimes it is necessary to stop a generator from running. Either
because of a bug, or for testing, or some other reason. The only way
to do that would be to rename or chmod the generator binary, which is
inconvenient and does not survive upgrades. Allow masking and
overriding generators similarly to units and other configuration
files.
For the systemd instance, masking would be more common, rather than
overriding generators. For the user instances, it may also be useful
for users to have generators in $XDG_CONFIG_HOME to augment or
override system-wide generators.
Directories are searched according to the usual scheme (/usr/lib,
/usr/local/lib, /run, /etc), and files with the same name in higher
priority directories override files with the same name in lower
priority directories. Empty files and links to /dev/null mask a given
name.
https://bugs.freedesktop.org/show_bug.cgi?id=87230
2015-01-09 02:47:25 +01:00
|
|
|
if (strv_extend(&res, generator) < 0)
|
|
|
|
return NULL;
|
2012-05-23 03:43:29 +02:00
|
|
|
|
2014-01-04 02:35:27 +01:00
|
|
|
if (data_home)
|
Implement masking and overriding of generators
Sometimes it is necessary to stop a generator from running. Either
because of a bug, or for testing, or some other reason. The only way
to do that would be to rename or chmod the generator binary, which is
inconvenient and does not survive upgrades. Allow masking and
overriding generators similarly to units and other configuration
files.
For the systemd instance, masking would be more common, rather than
overriding generators. For the user instances, it may also be useful
for users to have generators in $XDG_CONFIG_HOME to augment or
override system-wide generators.
Directories are searched according to the usual scheme (/usr/lib,
/usr/local/lib, /run, /etc), and files with the same name in higher
priority directories override files with the same name in lower
priority directories. Empty files and links to /dev/null mask a given
name.
https://bugs.freedesktop.org/show_bug.cgi?id=87230
2015-01-09 02:47:25 +01:00
|
|
|
if (strv_extend(&res, data_home) < 0)
|
|
|
|
return NULL;
|
2010-06-15 14:45:15 +02:00
|
|
|
|
2014-01-04 02:35:27 +01:00
|
|
|
if (!strv_isempty(data_dirs))
|
Implement masking and overriding of generators
Sometimes it is necessary to stop a generator from running. Either
because of a bug, or for testing, or some other reason. The only way
to do that would be to rename or chmod the generator binary, which is
inconvenient and does not survive upgrades. Allow masking and
overriding generators similarly to units and other configuration
files.
For the systemd instance, masking would be more common, rather than
overriding generators. For the user instances, it may also be useful
for users to have generators in $XDG_CONFIG_HOME to augment or
override system-wide generators.
Directories are searched according to the usual scheme (/usr/lib,
/usr/local/lib, /run, /etc), and files with the same name in higher
priority directories override files with the same name in lower
priority directories. Empty files and links to /dev/null mask a given
name.
https://bugs.freedesktop.org/show_bug.cgi?id=87230
2015-01-09 02:47:25 +01:00
|
|
|
if (strv_extend_strv_concat(&res, data_dirs, "/systemd/user") < 0)
|
|
|
|
return NULL;
|
2010-06-15 14:45:15 +02:00
|
|
|
|
2015-10-07 11:26:10 +02:00
|
|
|
if (strv_extend_strv(&res, (char**) data_unit_paths, false) < 0)
|
Implement masking and overriding of generators
Sometimes it is necessary to stop a generator from running. Either
because of a bug, or for testing, or some other reason. The only way
to do that would be to rename or chmod the generator binary, which is
inconvenient and does not survive upgrades. Allow masking and
overriding generators similarly to units and other configuration
files.
For the systemd instance, masking would be more common, rather than
overriding generators. For the user instances, it may also be useful
for users to have generators in $XDG_CONFIG_HOME to augment or
override system-wide generators.
Directories are searched according to the usual scheme (/usr/lib,
/usr/local/lib, /run, /etc), and files with the same name in higher
priority directories override files with the same name in lower
priority directories. Empty files and links to /dev/null mask a given
name.
https://bugs.freedesktop.org/show_bug.cgi?id=87230
2015-01-09 02:47:25 +01:00
|
|
|
return NULL;
|
2010-06-15 14:45:15 +02:00
|
|
|
|
2014-01-04 02:35:27 +01:00
|
|
|
if (generator_late)
|
Implement masking and overriding of generators
Sometimes it is necessary to stop a generator from running. Either
because of a bug, or for testing, or some other reason. The only way
to do that would be to rename or chmod the generator binary, which is
inconvenient and does not survive upgrades. Allow masking and
overriding generators similarly to units and other configuration
files.
For the systemd instance, masking would be more common, rather than
overriding generators. For the user instances, it may also be useful
for users to have generators in $XDG_CONFIG_HOME to augment or
override system-wide generators.
Directories are searched according to the usual scheme (/usr/lib,
/usr/local/lib, /run, /etc), and files with the same name in higher
priority directories override files with the same name in lower
priority directories. Empty files and links to /dev/null mask a given
name.
https://bugs.freedesktop.org/show_bug.cgi?id=87230
2015-01-09 02:47:25 +01:00
|
|
|
if (strv_extend(&res, generator_late) < 0)
|
|
|
|
return NULL;
|
2012-05-23 03:43:29 +02:00
|
|
|
|
2015-10-22 19:28:31 +02:00
|
|
|
if (path_strv_make_absolute_cwd(res) < 0)
|
Implement masking and overriding of generators
Sometimes it is necessary to stop a generator from running. Either
because of a bug, or for testing, or some other reason. The only way
to do that would be to rename or chmod the generator binary, which is
inconvenient and does not survive upgrades. Allow masking and
overriding generators similarly to units and other configuration
files.
For the systemd instance, masking would be more common, rather than
overriding generators. For the user instances, it may also be useful
for users to have generators in $XDG_CONFIG_HOME to augment or
override system-wide generators.
Directories are searched according to the usual scheme (/usr/lib,
/usr/local/lib, /run, /etc), and files with the same name in higher
priority directories override files with the same name in lower
priority directories. Empty files and links to /dev/null mask a given
name.
https://bugs.freedesktop.org/show_bug.cgi?id=87230
2015-01-09 02:47:25 +01:00
|
|
|
return NULL;
|
2010-06-15 14:45:15 +02:00
|
|
|
|
Implement masking and overriding of generators
Sometimes it is necessary to stop a generator from running. Either
because of a bug, or for testing, or some other reason. The only way
to do that would be to rename or chmod the generator binary, which is
inconvenient and does not survive upgrades. Allow masking and
overriding generators similarly to units and other configuration
files.
For the systemd instance, masking would be more common, rather than
overriding generators. For the user instances, it may also be useful
for users to have generators in $XDG_CONFIG_HOME to augment or
override system-wide generators.
Directories are searched according to the usual scheme (/usr/lib,
/usr/local/lib, /run, /etc), and files with the same name in higher
priority directories override files with the same name in lower
priority directories. Empty files and links to /dev/null mask a given
name.
https://bugs.freedesktop.org/show_bug.cgi?id=87230
2015-01-09 02:47:25 +01:00
|
|
|
tmp = res;
|
|
|
|
res = NULL;
|
|
|
|
return tmp;
|
|
|
|
}
|
2010-06-15 14:45:15 +02:00
|
|
|
|
2015-05-11 22:51:49 +02:00
|
|
|
char **generator_paths(ManagerRunningAs running_as) {
|
|
|
|
if (running_as == MANAGER_USER)
|
2015-01-09 05:34:21 +01:00
|
|
|
return strv_new("/run/systemd/user-generators",
|
|
|
|
"/etc/systemd/user-generators",
|
Implement masking and overriding of generators
Sometimes it is necessary to stop a generator from running. Either
because of a bug, or for testing, or some other reason. The only way
to do that would be to rename or chmod the generator binary, which is
inconvenient and does not survive upgrades. Allow masking and
overriding generators similarly to units and other configuration
files.
For the systemd instance, masking would be more common, rather than
overriding generators. For the user instances, it may also be useful
for users to have generators in $XDG_CONFIG_HOME to augment or
override system-wide generators.
Directories are searched according to the usual scheme (/usr/lib,
/usr/local/lib, /run, /etc), and files with the same name in higher
priority directories override files with the same name in lower
priority directories. Empty files and links to /dev/null mask a given
name.
https://bugs.freedesktop.org/show_bug.cgi?id=87230
2015-01-09 02:47:25 +01:00
|
|
|
"/usr/local/lib/systemd/user-generators",
|
|
|
|
USER_GENERATOR_PATH,
|
|
|
|
NULL);
|
|
|
|
else
|
2015-01-09 05:34:21 +01:00
|
|
|
return strv_new("/run/systemd/system-generators",
|
|
|
|
"/etc/systemd/system-generators",
|
Implement masking and overriding of generators
Sometimes it is necessary to stop a generator from running. Either
because of a bug, or for testing, or some other reason. The only way
to do that would be to rename or chmod the generator binary, which is
inconvenient and does not survive upgrades. Allow masking and
overriding generators similarly to units and other configuration
files.
For the systemd instance, masking would be more common, rather than
overriding generators. For the user instances, it may also be useful
for users to have generators in $XDG_CONFIG_HOME to augment or
override system-wide generators.
Directories are searched according to the usual scheme (/usr/lib,
/usr/local/lib, /run, /etc), and files with the same name in higher
priority directories override files with the same name in lower
priority directories. Empty files and links to /dev/null mask a given
name.
https://bugs.freedesktop.org/show_bug.cgi?id=87230
2015-01-09 02:47:25 +01:00
|
|
|
"/usr/local/lib/systemd/system-generators",
|
|
|
|
SYSTEM_GENERATOR_PATH,
|
|
|
|
NULL);
|
2010-06-15 14:45:15 +02:00
|
|
|
}
|
|
|
|
|
2012-05-23 03:43:29 +02:00
|
|
|
int lookup_paths_init(
|
|
|
|
LookupPaths *p,
|
2015-05-11 22:51:49 +02:00
|
|
|
ManagerRunningAs running_as,
|
2012-05-23 03:43:29 +02:00
|
|
|
bool personal,
|
2014-04-24 07:44:10 +02:00
|
|
|
const char *root_dir,
|
2012-05-23 03:43:29 +02:00
|
|
|
const char *generator,
|
|
|
|
const char *generator_early,
|
|
|
|
const char *generator_late) {
|
|
|
|
|
2010-06-15 14:45:15 +02:00
|
|
|
const char *e;
|
2014-07-20 23:56:57 +02:00
|
|
|
bool append = false; /* Add items from SYSTEMD_UNIT_PATH before normal directories */
|
2015-10-22 19:28:31 +02:00
|
|
|
int r;
|
2010-06-15 14:45:15 +02:00
|
|
|
|
|
|
|
assert(p);
|
|
|
|
|
|
|
|
/* First priority is whatever has been passed to us via env
|
|
|
|
* vars */
|
2012-05-23 03:43:29 +02:00
|
|
|
e = getenv("SYSTEMD_UNIT_PATH");
|
|
|
|
if (e) {
|
2014-07-20 23:56:57 +02:00
|
|
|
if (endswith(e, ":")) {
|
|
|
|
e = strndupa(e, strlen(e) - 1);
|
|
|
|
append = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* FIXME: empty components in other places should be
|
|
|
|
* rejected. */
|
|
|
|
|
2015-10-22 19:28:31 +02:00
|
|
|
r = path_split_and_make_absolute(e, &p->unit_path);
|
|
|
|
if (r < 0)
|
|
|
|
return r;
|
2012-05-23 03:43:29 +02:00
|
|
|
} else
|
|
|
|
p->unit_path = NULL;
|
2010-06-15 14:45:15 +02:00
|
|
|
|
2014-07-20 23:56:57 +02:00
|
|
|
if (!p->unit_path || append) {
|
|
|
|
/* Let's figure something out. */
|
|
|
|
|
2014-07-22 03:11:54 +02:00
|
|
|
_cleanup_strv_free_ char **unit_path;
|
2010-06-15 14:45:15 +02:00
|
|
|
|
2012-05-23 03:43:29 +02:00
|
|
|
/* For the user units we include share/ in the search
|
2014-07-20 23:56:57 +02:00
|
|
|
* 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. */
|
2012-05-23 03:43:29 +02:00
|
|
|
|
2015-05-11 22:51:49 +02:00
|
|
|
if (running_as == MANAGER_USER) {
|
2011-07-22 04:17:38 +02:00
|
|
|
if (personal)
|
2014-07-20 23:56:57 +02:00
|
|
|
unit_path = user_dirs(generator, generator_early, generator_late);
|
2011-07-22 04:17:38 +02:00
|
|
|
else
|
2014-07-20 23:56:57 +02:00
|
|
|
unit_path = strv_new(
|
2012-05-23 03:43:29 +02:00
|
|
|
/* If you modify this you also want to modify
|
2014-07-20 23:56:57 +02:00
|
|
|
* systemduserunitpath= in systemd.pc.in, and
|
|
|
|
* the arrays in user_dirs() above! */
|
2012-05-23 03:43:29 +02:00
|
|
|
STRV_IFNOTNULL(generator_early),
|
2014-07-20 23:56:57 +02:00
|
|
|
USER_CONFIG_UNIT_PATH,
|
|
|
|
"/etc/systemd/user",
|
|
|
|
"/run/systemd/user",
|
2012-05-23 03:43:29 +02:00
|
|
|
STRV_IFNOTNULL(generator),
|
2014-07-20 23:56:57 +02:00
|
|
|
"/usr/local/lib/systemd/user",
|
|
|
|
"/usr/local/share/systemd/user",
|
|
|
|
USER_DATA_UNIT_PATH,
|
|
|
|
"/usr/lib/systemd/user",
|
|
|
|
"/usr/share/systemd/user",
|
2012-05-23 03:43:29 +02:00
|
|
|
STRV_IFNOTNULL(generator_late),
|
|
|
|
NULL);
|
2014-07-20 23:56:57 +02:00
|
|
|
} 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);
|
2012-05-23 03:43:29 +02:00
|
|
|
|
2014-07-20 23:56:57 +02:00
|
|
|
if (!unit_path)
|
|
|
|
return -ENOMEM;
|
|
|
|
|
2015-10-07 11:26:10 +02:00
|
|
|
r = strv_extend_strv(&p->unit_path, unit_path, false);
|
2014-07-20 23:56:57 +02:00
|
|
|
if (r < 0)
|
|
|
|
return r;
|
2010-06-15 14:45:15 +02:00
|
|
|
}
|
|
|
|
|
2014-06-20 04:07:02 +02:00
|
|
|
if (!path_strv_resolve_uniq(p->unit_path, root_dir))
|
2012-05-23 03:43:29 +02:00
|
|
|
return -ENOMEM;
|
2010-09-21 05:23:12 +02:00
|
|
|
|
|
|
|
if (!strv_isempty(p->unit_path)) {
|
2013-04-18 09:11:22 +02:00
|
|
|
_cleanup_free_ char *t = strv_join(p->unit_path, "\n\t");
|
2012-05-23 03:43:29 +02:00
|
|
|
if (!t)
|
2010-09-21 05:23:12 +02:00
|
|
|
return -ENOMEM;
|
2013-03-01 14:07:20 +01:00
|
|
|
log_debug("Looking for unit files in (higher priority first):\n\t%s", t);
|
2010-09-21 05:23:12 +02:00
|
|
|
} else {
|
2013-03-01 14:07:20 +01:00
|
|
|
log_debug("Ignoring unit files.");
|
2015-09-09 23:05:10 +02:00
|
|
|
p->unit_path = strv_free(p->unit_path);
|
2010-09-21 05:23:12 +02:00
|
|
|
}
|
|
|
|
|
2010-06-15 14:45:15 +02:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void lookup_paths_free(LookupPaths *p) {
|
|
|
|
assert(p);
|
|
|
|
|
2015-09-09 23:05:10 +02:00
|
|
|
p->unit_path = strv_free(p->unit_path);
|
2010-06-15 14:45:15 +02:00
|
|
|
}
|
2014-12-19 15:08:07 +01:00
|
|
|
|
|
|
|
int lookup_paths_init_from_scope(LookupPaths *paths,
|
|
|
|
UnitFileScope scope,
|
|
|
|
const char *root_dir) {
|
|
|
|
assert(paths);
|
|
|
|
assert(scope >= 0);
|
|
|
|
assert(scope < _UNIT_FILE_SCOPE_MAX);
|
|
|
|
|
|
|
|
zero(*paths);
|
|
|
|
|
|
|
|
return lookup_paths_init(paths,
|
2015-05-11 22:51:49 +02:00
|
|
|
scope == UNIT_FILE_SYSTEM ? MANAGER_SYSTEM : MANAGER_USER,
|
2014-12-19 15:08:07 +01:00
|
|
|
scope == UNIT_FILE_USER,
|
|
|
|
root_dir,
|
|
|
|
NULL, NULL, NULL);
|
|
|
|
}
|