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"
|
2016-02-25 00:16:51 +01:00
|
|
|
#include "stat-util.h"
|
2015-11-16 22:09:36 +01:00
|
|
|
#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;
|
2016-02-24 21:24:23 +01:00
|
|
|
return 1;
|
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
|
|
|
}
|
|
|
|
|
2012-05-23 03:43:29 +02:00
|
|
|
static char** user_dirs(
|
2016-02-24 17:18:42 +01:00
|
|
|
const char *persistent_config,
|
|
|
|
const char *runtime_config,
|
2012-05-23 03:43:29 +02:00
|
|
|
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
|
|
|
};
|
|
|
|
|
|
|
|
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
|
|
|
|
2016-02-24 17:18:42 +01:00
|
|
|
if (strv_extend(&res, persistent_config) < 0)
|
|
|
|
return NULL;
|
|
|
|
|
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
|
|
|
|
2016-02-24 17:18:42 +01:00
|
|
|
if (strv_extend(&res, runtime_config) < 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)
|
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
|
|
|
|
2016-02-24 21:24:23 +01:00
|
|
|
char **generator_paths(UnitFileScope scope) {
|
|
|
|
|
|
|
|
switch (scope) {
|
|
|
|
|
|
|
|
case UNIT_FILE_SYSTEM:
|
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);
|
2016-02-24 21:24:23 +01:00
|
|
|
|
|
|
|
case UNIT_FILE_GLOBAL:
|
|
|
|
case UNIT_FILE_USER:
|
|
|
|
return strv_new("/run/systemd/user-generators",
|
|
|
|
"/etc/systemd/user-generators",
|
|
|
|
"/usr/local/lib/systemd/user-generators",
|
|
|
|
USER_GENERATOR_PATH,
|
|
|
|
NULL);
|
|
|
|
|
|
|
|
default:
|
|
|
|
assert_not_reached("Hmm, unexpected scope.");
|
|
|
|
}
|
2010-06-15 14:45:15 +02:00
|
|
|
}
|
|
|
|
|
2016-02-24 15:31:33 +01:00
|
|
|
static int acquire_generator_dirs(
|
2016-02-24 21:24:23 +01:00
|
|
|
UnitFileScope scope,
|
2016-02-24 15:31:33 +01:00
|
|
|
char **generator,
|
|
|
|
char **generator_early,
|
|
|
|
char **generator_late) {
|
|
|
|
|
|
|
|
_cleanup_free_ char *x = NULL, *y = NULL, *z = NULL;
|
|
|
|
const char *prefix;
|
|
|
|
|
|
|
|
assert(generator);
|
|
|
|
assert(generator_early);
|
|
|
|
assert(generator_late);
|
|
|
|
|
2016-02-24 21:24:23 +01:00
|
|
|
switch (scope) {
|
|
|
|
|
|
|
|
case UNIT_FILE_SYSTEM:
|
2016-02-24 15:31:33 +01:00
|
|
|
prefix = "/run/systemd/";
|
2016-02-24 21:24:23 +01:00
|
|
|
break;
|
2016-02-24 15:31:33 +01:00
|
|
|
|
2016-02-24 21:24:23 +01:00
|
|
|
case UNIT_FILE_USER: {
|
|
|
|
const char *e;
|
2016-02-24 15:31:33 +01:00
|
|
|
|
|
|
|
e = getenv("XDG_RUNTIME_DIR");
|
|
|
|
if (!e)
|
2016-02-24 21:24:23 +01:00
|
|
|
return -ENXIO;
|
2016-02-24 15:31:33 +01:00
|
|
|
|
|
|
|
prefix = strjoina(e, "/systemd/", NULL);
|
2016-02-24 21:24:23 +01:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case UNIT_FILE_GLOBAL:
|
|
|
|
return -EOPNOTSUPP;
|
|
|
|
|
|
|
|
default:
|
|
|
|
assert_not_reached("Hmm, unexpected scope value.");
|
2016-02-24 15:31:33 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
x = strappend(prefix, "generator");
|
|
|
|
if (!x)
|
|
|
|
return -ENOMEM;
|
|
|
|
|
|
|
|
y = strappend(prefix, "generator.early");
|
|
|
|
if (!y)
|
|
|
|
return -ENOMEM;
|
|
|
|
|
|
|
|
z = strappend(prefix, "generator.late");
|
|
|
|
if (!z)
|
|
|
|
return -ENOMEM;
|
|
|
|
|
|
|
|
*generator = x;
|
|
|
|
*generator_early = y;
|
|
|
|
*generator_late = z;
|
|
|
|
|
|
|
|
x = y = z = NULL;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2016-02-24 21:24:23 +01:00
|
|
|
static int acquire_config_dirs(UnitFileScope scope, char **persistent, char **runtime) {
|
2016-02-24 17:18:42 +01:00
|
|
|
_cleanup_free_ char *a = NULL, *b = NULL;
|
|
|
|
int r;
|
|
|
|
|
|
|
|
assert(persistent);
|
|
|
|
assert(runtime);
|
|
|
|
|
2016-02-24 21:24:23 +01:00
|
|
|
switch (scope) {
|
|
|
|
|
|
|
|
case UNIT_FILE_SYSTEM:
|
2016-02-24 17:18:42 +01:00
|
|
|
a = strdup(SYSTEM_CONFIG_UNIT_PATH);
|
|
|
|
b = strdup("/run/systemd/system");
|
2016-02-24 21:24:23 +01:00
|
|
|
break;
|
|
|
|
|
|
|
|
case UNIT_FILE_GLOBAL:
|
|
|
|
a = strdup(USER_CONFIG_UNIT_PATH);
|
|
|
|
b = strdup("/run/systemd/user");
|
|
|
|
break;
|
2016-02-24 17:18:42 +01:00
|
|
|
|
2016-02-24 21:24:23 +01:00
|
|
|
case UNIT_FILE_USER:
|
2016-02-24 17:18:42 +01:00
|
|
|
r = user_config_home(&a);
|
|
|
|
if (r < 0)
|
|
|
|
return r;
|
|
|
|
|
|
|
|
r = user_runtime_dir(runtime);
|
|
|
|
if (r < 0)
|
|
|
|
return r;
|
|
|
|
|
|
|
|
*persistent = a;
|
|
|
|
a = NULL;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
2016-02-24 21:24:23 +01:00
|
|
|
default:
|
|
|
|
assert_not_reached("Hmm, unexpected scope value.");
|
2016-02-24 17:18:42 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!a || !b)
|
|
|
|
return -ENOMEM;
|
|
|
|
|
|
|
|
*persistent = a;
|
|
|
|
*runtime = b;
|
|
|
|
a = b = NULL;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2016-02-24 15:31:33 +01:00
|
|
|
static int patch_root_prefix(char **p, const char *root_dir) {
|
|
|
|
char *c;
|
|
|
|
|
|
|
|
assert(p);
|
|
|
|
|
|
|
|
if (!*p)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
c = prefix_root(root_dir, *p);
|
|
|
|
if (!c)
|
|
|
|
return -ENOMEM;
|
|
|
|
|
|
|
|
free(*p);
|
|
|
|
*p = c;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-05-23 03:43:29 +02:00
|
|
|
int lookup_paths_init(
|
|
|
|
LookupPaths *p,
|
2016-02-24 21:24:23 +01:00
|
|
|
UnitFileScope scope,
|
2016-02-24 15:31:33 +01:00
|
|
|
const char *root_dir) {
|
2012-05-23 03:43:29 +02:00
|
|
|
|
2016-02-25 00:16:51 +01:00
|
|
|
_cleanup_free_ char
|
|
|
|
*root = NULL,
|
|
|
|
*generator = NULL, *generator_early = NULL, *generator_late = NULL,
|
2016-02-24 17:18:42 +01:00
|
|
|
*persistent_config = NULL, *runtime_config = NULL;
|
2014-07-20 23:56:57 +02:00
|
|
|
bool append = false; /* Add items from SYSTEMD_UNIT_PATH before normal directories */
|
2016-02-24 15:31:33 +01:00
|
|
|
char **l = NULL;
|
|
|
|
const char *e;
|
2015-10-22 19:28:31 +02:00
|
|
|
int r;
|
2010-06-15 14:45:15 +02:00
|
|
|
|
|
|
|
assert(p);
|
2016-02-24 21:24:23 +01:00
|
|
|
assert(scope >= 0);
|
|
|
|
assert(scope < _UNIT_FILE_SCOPE_MAX);
|
2016-02-24 15:31:33 +01:00
|
|
|
|
2016-02-25 00:16:51 +01:00
|
|
|
if (!isempty(root_dir) && !path_equal(root_dir, "/")) {
|
|
|
|
if (scope == UNIT_FILE_USER)
|
|
|
|
return -EINVAL;
|
|
|
|
|
|
|
|
r = is_dir(root_dir, true);
|
|
|
|
if (r < 0)
|
|
|
|
return r;
|
|
|
|
if (r == 0)
|
|
|
|
return -ENOTDIR;
|
|
|
|
|
|
|
|
root = strdup(root_dir);
|
|
|
|
if (!root)
|
|
|
|
return -ENOMEM;
|
|
|
|
}
|
|
|
|
|
2016-02-24 21:24:23 +01:00
|
|
|
r = acquire_config_dirs(scope, &persistent_config, &runtime_config);
|
2016-02-24 17:18:42 +01:00
|
|
|
if (r < 0)
|
|
|
|
return r;
|
|
|
|
|
2016-02-24 21:24:23 +01:00
|
|
|
r = acquire_generator_dirs(scope, &generator, &generator_early, &generator_late);
|
|
|
|
if (r < 0 && r != -EOPNOTSUPP && r != -ENXIO)
|
2016-02-24 15:31:33 +01:00
|
|
|
return r;
|
2010-06-15 14:45:15 +02:00
|
|
|
|
|
|
|
/* 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) {
|
2016-02-24 15:31:33 +01:00
|
|
|
const char *k;
|
|
|
|
|
|
|
|
k = endswith(e, ":");
|
|
|
|
if (k) {
|
|
|
|
e = strndupa(e, k - e);
|
2014-07-20 23:56:57 +02:00
|
|
|
append = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* FIXME: empty components in other places should be
|
|
|
|
* rejected. */
|
|
|
|
|
2016-02-24 15:31:33 +01:00
|
|
|
r = path_split_and_make_absolute(e, &l);
|
2015-10-22 19:28:31 +02:00
|
|
|
if (r < 0)
|
|
|
|
return r;
|
2012-05-23 03:43:29 +02:00
|
|
|
} else
|
2016-02-24 15:31:33 +01:00
|
|
|
l = NULL;
|
2010-06-15 14:45:15 +02:00
|
|
|
|
2016-02-24 15:31:33 +01:00
|
|
|
if (!l || append) {
|
2014-07-20 23:56:57 +02:00
|
|
|
/* Let's figure something out. */
|
|
|
|
|
2016-02-24 15:31:33 +01:00
|
|
|
_cleanup_strv_free_ char **add = NULL;
|
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
|
|
|
|
2016-02-24 21:24:23 +01:00
|
|
|
switch (scope) {
|
|
|
|
|
|
|
|
case UNIT_FILE_SYSTEM:
|
|
|
|
add = strv_new(
|
|
|
|
/* If you modify this you also want to modify
|
|
|
|
* systemdsystemunitpath= in systemd.pc.in! */
|
|
|
|
STRV_IFNOTNULL(generator_early),
|
|
|
|
persistent_config,
|
2016-02-25 00:54:31 +01:00
|
|
|
SYSTEM_CONFIG_UNIT_PATH,
|
2016-02-24 21:24:23 +01:00
|
|
|
"/etc/systemd/system",
|
|
|
|
runtime_config,
|
|
|
|
"/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);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case UNIT_FILE_GLOBAL:
|
|
|
|
add = 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! */
|
2016-02-24 21:24:23 +01:00
|
|
|
STRV_IFNOTNULL(generator_early),
|
2016-02-24 17:18:42 +01:00
|
|
|
persistent_config,
|
2016-02-25 00:54:31 +01:00
|
|
|
USER_CONFIG_UNIT_PATH,
|
2014-07-20 23:56:57 +02:00
|
|
|
"/etc/systemd/user",
|
2016-02-24 17:18:42 +01:00
|
|
|
runtime_config,
|
2014-07-20 23:56:57 +02:00
|
|
|
"/run/systemd/user",
|
2016-02-24 21:24:23 +01: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",
|
2016-02-24 21:24:23 +01:00
|
|
|
STRV_IFNOTNULL(generator_late),
|
2012-05-23 03:43:29 +02:00
|
|
|
NULL);
|
2016-02-24 21:24:23 +01:00
|
|
|
break;
|
|
|
|
|
|
|
|
case UNIT_FILE_USER:
|
|
|
|
add = user_dirs(persistent_config, runtime_config,
|
|
|
|
generator, generator_early, generator_late);
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
assert_not_reached("Hmm, unexpected scope?");
|
|
|
|
}
|
2012-05-23 03:43:29 +02:00
|
|
|
|
2016-02-24 15:31:33 +01:00
|
|
|
if (!add)
|
2014-07-20 23:56:57 +02:00
|
|
|
return -ENOMEM;
|
|
|
|
|
2016-02-24 15:31:33 +01:00
|
|
|
if (l) {
|
|
|
|
r = strv_extend_strv(&l, add, false);
|
|
|
|
if (r < 0)
|
|
|
|
return r;
|
|
|
|
} else {
|
|
|
|
l = add;
|
|
|
|
add = NULL;
|
|
|
|
}
|
2010-06-15 14:45:15 +02:00
|
|
|
}
|
|
|
|
|
2016-02-25 00:16:51 +01:00
|
|
|
r = patch_root_prefix(&persistent_config, root);
|
2016-02-24 17:18:42 +01:00
|
|
|
if (r < 0)
|
|
|
|
return r;
|
2016-02-25 00:16:51 +01:00
|
|
|
r = patch_root_prefix(&runtime_config, root);
|
2016-02-24 17:18:42 +01:00
|
|
|
if (r < 0)
|
|
|
|
return r;
|
|
|
|
|
2016-02-25 00:16:51 +01:00
|
|
|
r = patch_root_prefix(&generator, root);
|
2016-02-24 15:31:33 +01:00
|
|
|
if (r < 0)
|
|
|
|
return r;
|
2016-02-25 00:16:51 +01:00
|
|
|
r = patch_root_prefix(&generator_early, root);
|
2016-02-24 15:31:33 +01:00
|
|
|
if (r < 0)
|
|
|
|
return r;
|
2016-02-25 00:16:51 +01:00
|
|
|
r = patch_root_prefix(&generator_late, root);
|
2016-02-24 15:31:33 +01:00
|
|
|
if (r < 0)
|
|
|
|
return r;
|
|
|
|
|
2016-02-25 00:16:51 +01:00
|
|
|
if (!path_strv_resolve_uniq(l, root))
|
2012-05-23 03:43:29 +02:00
|
|
|
return -ENOMEM;
|
2010-09-21 05:23:12 +02:00
|
|
|
|
2016-02-24 15:31:33 +01:00
|
|
|
if (strv_isempty(l)) {
|
|
|
|
log_debug("Ignoring unit files.");
|
|
|
|
l = strv_free(l);
|
|
|
|
} else {
|
|
|
|
_cleanup_free_ char *t;
|
|
|
|
|
|
|
|
t = strv_join(l, "\n\t");
|
2012-05-23 03:43:29 +02:00
|
|
|
if (!t)
|
2010-09-21 05:23:12 +02:00
|
|
|
return -ENOMEM;
|
2016-02-24 15:31:33 +01:00
|
|
|
|
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
|
|
|
}
|
|
|
|
|
2016-02-24 15:31:33 +01:00
|
|
|
p->search_path = l;
|
|
|
|
l = NULL;
|
|
|
|
|
2016-02-24 17:18:42 +01:00
|
|
|
p->persistent_config = persistent_config;
|
|
|
|
p->runtime_config = runtime_config;
|
|
|
|
persistent_config = runtime_config = NULL;
|
|
|
|
|
2016-02-24 15:31:33 +01:00
|
|
|
p->generator = generator;
|
|
|
|
p->generator_early = generator_early;
|
|
|
|
p->generator_late = generator_late;
|
|
|
|
generator = generator_early = generator_late = NULL;
|
2010-06-15 14:45:15 +02:00
|
|
|
|
2016-02-25 00:16:51 +01:00
|
|
|
p->root_dir = root;
|
|
|
|
root = NULL;
|
|
|
|
|
2010-06-15 14:45:15 +02:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void lookup_paths_free(LookupPaths *p) {
|
2016-02-24 15:31:33 +01:00
|
|
|
if (!p)
|
|
|
|
return;
|
2010-06-15 14:45:15 +02:00
|
|
|
|
2016-02-24 15:31:33 +01:00
|
|
|
p->search_path = strv_free(p->search_path);
|
2016-02-24 17:18:42 +01:00
|
|
|
|
|
|
|
p->persistent_config = mfree(p->persistent_config);
|
|
|
|
p->runtime_config = mfree(p->runtime_config);
|
|
|
|
|
2016-02-24 15:31:33 +01:00
|
|
|
p->generator = mfree(p->generator);
|
|
|
|
p->generator_early = mfree(p->generator_early);
|
|
|
|
p->generator_late = mfree(p->generator_late);
|
2016-02-25 00:16:51 +01:00
|
|
|
|
|
|
|
p->root_dir = mfree(p->root_dir);
|
2010-06-15 14:45:15 +02:00
|
|
|
}
|