path-lookup.c revision 667a1cd645c9402921dedff08a86bb35cddbcbf9
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering/***
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering This file is part of systemd.
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering Copyright 2010 Lennart Poettering
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering systemd is free software; you can redistribute it and/or modify it
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering under the terms of the GNU Lesser General Public License as published by
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering the Free Software Foundation; either version 2.1 of the License, or
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering (at your option) any later version.
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering systemd is distributed in the hope that it will be useful, but
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering Lesser General Public License for more details.
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering You should have received a copy of the GNU Lesser General Public License
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering***/
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering
11c3a36649e5e5e77db499c92f3cdcbd619efd3aThomas Hindoe Paaboel Andersen#include <assert.h>
11c3a36649e5e5e77db499c92f3cdcbd619efd3aThomas Hindoe Paaboel Andersen#include <stdlib.h>
11c3a36649e5e5e77db499c92f3cdcbd619efd3aThomas Hindoe Paaboel Andersen#include <stdio.h>
11c3a36649e5e5e77db499c92f3cdcbd619efd3aThomas Hindoe Paaboel Andersen#include <string.h>
b5efdb8af40ea759a1ea584c1bc44ecc81dd00ceLennart Poettering#include <unistd.h>
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering#include <errno.h>
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering#include "util.h"
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering#include "mkdir.h"
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering#include "strv.h"
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering#include "path-util.h"
c573dcfeb1abd390cd4c4288056df97752ef18f0Evgeny Vereshchagin#include "path-lookup.h"
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poetteringstatic const char* const systemd_running_as_table[_SYSTEMD_RUNNING_AS_MAX] = {
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering [SYSTEMD_SYSTEM] = "system",
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering [SYSTEMD_USER] = "user"
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering};
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart PoetteringDEFINE_STRING_TABLE_LOOKUP(systemd_running_as, SystemdRunningAs);
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poetteringint user_config_home(char **config_home) {
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering const char *e;
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering char *r;
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering e = getenv("XDG_CONFIG_HOME");
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering if (e) {
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering r = strappend(e, "/systemd/user");
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering if (!r)
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering return -ENOMEM;
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering *config_home = r;
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering return 1;
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering } else {
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering const char *home;
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering home = getenv("HOME");
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering if (home) {
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering r = strappend(home, "/.config/systemd/user");
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering if (!r)
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering return -ENOMEM;
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering *config_home = r;
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering return 1;
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering }
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering }
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering return 0;
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering}
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poetteringstatic char** user_dirs(
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering const char *generator,
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering const char *generator_early,
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering const char *generator_late) {
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering const char * const config_unit_paths[] = {
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering USER_CONFIG_UNIT_PATH,
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering "/etc/systemd/user",
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering "/run/systemd/user",
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering NULL
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering };
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering const char * const data_unit_paths[] = {
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering "/usr/local/lib/systemd/user",
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering "/usr/local/share/systemd/user",
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering USER_DATA_UNIT_PATH,
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering "/usr/lib/systemd/user",
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering "/usr/share/systemd/user",
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering NULL
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering };
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering const char *home, *e;
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering _cleanup_free_ char *config_home = NULL, *data_home = NULL;
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering _cleanup_strv_free_ char **config_dirs = NULL, **data_dirs = NULL;
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering char **r = NULL;
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering /* Implement the mechanisms defined in
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering *
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering * http://standards.freedesktop.org/basedir-spec/basedir-spec-0.6.html
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering *
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering * We look in both the config and the data dirs because we
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering * want to encourage that distributors ship their unit files
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering * as data, and allow overriding as configuration.
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering */
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering if (user_config_home(&config_home) < 0)
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering goto fail;
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering home = getenv("HOME");
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering e = getenv("XDG_CONFIG_DIRS");
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering if (e) {
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering config_dirs = strv_split(e, ":");
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering if (!config_dirs)
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering goto fail;
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering }
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering /* We don't treat /etc/xdg/systemd here as the spec
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering * suggests because we assume that that is a link to
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering * /etc/systemd/ anyway. */
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering e = getenv("XDG_DATA_HOME");
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering if (e) {
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering if (asprintf(&data_home, "%s/systemd/user", e) < 0)
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering goto fail;
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering } else if (home) {
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering if (asprintf(&data_home, "%s/.local/share/systemd/user", home) < 0)
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering goto fail;
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering }
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering e = getenv("XDG_DATA_DIRS");
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering if (e)
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering data_dirs = strv_split(e, ":");
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering else
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering data_dirs = strv_new("/usr/local/share",
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering "/usr/share",
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering NULL);
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering if (!data_dirs)
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering goto fail;
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering /* Now merge everything we found. */
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering if (generator_early)
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering if (strv_extend(&r, generator_early) < 0)
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering goto fail;
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering if (config_home)
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering if (strv_extend(&r, config_home) < 0)
934ae16baf543af03f3f521277d14524ca772d17Lennart Poettering goto fail;
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering
c573dcfeb1abd390cd4c4288056df97752ef18f0Evgeny Vereshchagin if (!strv_isempty(config_dirs))
c573dcfeb1abd390cd4c4288056df97752ef18f0Evgeny Vereshchagin if (strv_extend_strv_concat(&r, config_dirs, "/systemd/user") < 0)
c573dcfeb1abd390cd4c4288056df97752ef18f0Evgeny Vereshchagin goto fail;
c573dcfeb1abd390cd4c4288056df97752ef18f0Evgeny Vereshchagin
c573dcfeb1abd390cd4c4288056df97752ef18f0Evgeny Vereshchagin if (strv_extend_strv(&r, (char**) config_unit_paths) < 0)
c573dcfeb1abd390cd4c4288056df97752ef18f0Evgeny Vereshchagin goto fail;
c573dcfeb1abd390cd4c4288056df97752ef18f0Evgeny Vereshchagin
c573dcfeb1abd390cd4c4288056df97752ef18f0Evgeny Vereshchagin if (generator)
c573dcfeb1abd390cd4c4288056df97752ef18f0Evgeny Vereshchagin if (strv_extend(&r, generator) < 0)
c573dcfeb1abd390cd4c4288056df97752ef18f0Evgeny Vereshchagin goto fail;
c573dcfeb1abd390cd4c4288056df97752ef18f0Evgeny Vereshchagin
c573dcfeb1abd390cd4c4288056df97752ef18f0Evgeny Vereshchagin if (data_home)
c573dcfeb1abd390cd4c4288056df97752ef18f0Evgeny Vereshchagin if (strv_extend(&r, data_home) < 0)
c573dcfeb1abd390cd4c4288056df97752ef18f0Evgeny Vereshchagin goto fail;
c573dcfeb1abd390cd4c4288056df97752ef18f0Evgeny Vereshchagin
c573dcfeb1abd390cd4c4288056df97752ef18f0Evgeny Vereshchagin if (!strv_isempty(data_dirs))
c573dcfeb1abd390cd4c4288056df97752ef18f0Evgeny Vereshchagin if (strv_extend_strv_concat(&r, data_dirs, "/systemd/user") < 0)
c573dcfeb1abd390cd4c4288056df97752ef18f0Evgeny Vereshchagin goto fail;
c573dcfeb1abd390cd4c4288056df97752ef18f0Evgeny Vereshchagin
c573dcfeb1abd390cd4c4288056df97752ef18f0Evgeny Vereshchagin if (strv_extend_strv(&r, (char**) data_unit_paths) < 0)
c573dcfeb1abd390cd4c4288056df97752ef18f0Evgeny Vereshchagin goto fail;
c573dcfeb1abd390cd4c4288056df97752ef18f0Evgeny Vereshchagin
c573dcfeb1abd390cd4c4288056df97752ef18f0Evgeny Vereshchagin if (generator_late)
c573dcfeb1abd390cd4c4288056df97752ef18f0Evgeny Vereshchagin if (strv_extend(&r, generator_late) < 0)
c573dcfeb1abd390cd4c4288056df97752ef18f0Evgeny Vereshchagin goto fail;
c573dcfeb1abd390cd4c4288056df97752ef18f0Evgeny Vereshchagin
c573dcfeb1abd390cd4c4288056df97752ef18f0Evgeny Vereshchagin if (!path_strv_make_absolute_cwd(r))
c573dcfeb1abd390cd4c4288056df97752ef18f0Evgeny Vereshchagin goto fail;
return r;
fail:
strv_free(r);
return NULL;
}
int lookup_paths_init(
LookupPaths *p,
SystemdRunningAs running_as,
bool personal,
const char *root_dir,
const char *generator,
const char *generator_early,
const char *generator_late) {
const char *e;
assert(p);
/* First priority is whatever has been passed to us via env
* vars */
e = getenv("SYSTEMD_UNIT_PATH");
if (e) {
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);
/* 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. */
if (running_as == SYSTEMD_USER) {
if (personal)
p->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(
/* 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 (!path_strv_resolve_uniq(p->unit_path, root_dir))
return -ENOMEM;
if (!strv_isempty(p->unit_path)) {
_cleanup_free_ char *t = strv_join(p->unit_path, "\n\t");
if (!t)
return -ENOMEM;
log_debug("Looking for unit files in (higher priority first):\n\t%s", t);
} else {
log_debug("Ignoring unit files.");
strv_free(p->unit_path);
p->unit_path = NULL;
}
if (running_as == SYSTEMD_SYSTEM) {
#ifdef HAVE_SYSV_COMPAT
/* /etc/init.d/ compatibility does not matter to users */
e = getenv("SYSTEMD_SYSVINIT_PATH");
if (e) {
p->sysvinit_path = path_split_and_make_absolute(e);
if (!p->sysvinit_path)
return -ENOMEM;
} else
p->sysvinit_path = NULL;
if (strv_isempty(p->sysvinit_path)) {
strv_free(p->sysvinit_path);
p->sysvinit_path = strv_new(
SYSTEM_SYSVINIT_PATH, /* /etc/init.d/ */
NULL);
if (!p->sysvinit_path)
return -ENOMEM;
}
e = getenv("SYSTEMD_SYSVRCND_PATH");
if (e) {
p->sysvrcnd_path = path_split_and_make_absolute(e);
if (!p->sysvrcnd_path)
return -ENOMEM;
} else
p->sysvrcnd_path = NULL;
if (strv_isempty(p->sysvrcnd_path)) {
strv_free(p->sysvrcnd_path);
p->sysvrcnd_path = strv_new(
SYSTEM_SYSVRCND_PATH, /* /etc/rcN.d/ */
NULL);
if (!p->sysvrcnd_path)
return -ENOMEM;
}
if (!path_strv_resolve_uniq(p->sysvinit_path, root_dir))
return -ENOMEM;
if (!path_strv_resolve_uniq(p->sysvrcnd_path, root_dir))
return -ENOMEM;
if (!strv_isempty(p->sysvinit_path)) {
_cleanup_free_ char *t = strv_join(p->sysvinit_path, "\n\t");
if (!t)
return -ENOMEM;
log_debug("Looking for SysV init scripts in:\n\t%s", t);
} else {
log_debug("Ignoring SysV init scripts.");
strv_free(p->sysvinit_path);
p->sysvinit_path = NULL;
}
if (!strv_isempty(p->sysvrcnd_path)) {
_cleanup_free_ char *t =
strv_join(p->sysvrcnd_path, "\n\t");
if (!t)
return -ENOMEM;
log_debug("Looking for SysV rcN.d links in:\n\t%s", t);
} else {
log_debug("Ignoring SysV rcN.d links.");
strv_free(p->sysvrcnd_path);
p->sysvrcnd_path = NULL;
}
#else
log_debug("SysV init scripts and rcN.d links support disabled");
#endif
}
return 0;
}
void lookup_paths_free(LookupPaths *p) {
assert(p);
strv_free(p->unit_path);
p->unit_path = NULL;
#ifdef HAVE_SYSV_COMPAT
strv_free(p->sysvinit_path);
strv_free(p->sysvrcnd_path);
p->sysvinit_path = p->sysvrcnd_path = NULL;
#endif
}