systemctl: don't confuse sysv code with generated units

The SysV compat code checks whether there's a native unit file before looking
for a SysV init script. Since the newest rework generated units will show up in
the unit path, and hence the checks ended up assuming that there always was a
native unit file for each init script: the generated one.

With this change the generated unit file directory is suppressed from the
search path when this check is done, to avoid the confusion.
This commit is contained in:
Lennart Poettering 2016-04-07 18:48:01 +02:00
parent a69b4fb0f8
commit 4943d14306
7 changed files with 34 additions and 26 deletions

View file

@ -1097,7 +1097,7 @@ int manager_startup(Manager *m, FILE *serialization, FDSet *fds) {
assert(m);
r = lookup_paths_init(&m->lookup_paths, m->unit_file_scope, NULL);
r = lookup_paths_init(&m->lookup_paths, m->unit_file_scope, 0, NULL);
if (r < 0)
return r;
@ -2524,7 +2524,7 @@ int manager_reload(Manager *m) {
lookup_paths_flush_generator(&m->lookup_paths);
lookup_paths_free(&m->lookup_paths);
q = lookup_paths_init(&m->lookup_paths, m->unit_file_scope, NULL);
q = lookup_paths_init(&m->lookup_paths, m->unit_file_scope, 0, NULL);
if (q < 0 && r >= 0)
r = q;

View file

@ -1507,7 +1507,7 @@ int unit_file_mask(
assert(scope >= 0);
assert(scope < _UNIT_FILE_SCOPE_MAX);
r = lookup_paths_init(&paths, scope, root_dir);
r = lookup_paths_init(&paths, scope, 0, root_dir);
if (r < 0)
return r;
@ -1554,7 +1554,7 @@ int unit_file_unmask(
assert(scope >= 0);
assert(scope < _UNIT_FILE_SCOPE_MAX);
r = lookup_paths_init(&paths, scope, root_dir);
r = lookup_paths_init(&paths, scope, 0, root_dir);
if (r < 0)
return r;
@ -1636,7 +1636,7 @@ int unit_file_link(
assert(scope >= 0);
assert(scope < _UNIT_FILE_SCOPE_MAX);
r = lookup_paths_init(&paths, scope, root_dir);
r = lookup_paths_init(&paths, scope, 0, root_dir);
if (r < 0)
return r;
@ -1727,7 +1727,7 @@ int unit_file_add_dependency(
if (!unit_name_is_valid(target, UNIT_NAME_ANY))
return -EINVAL;
r = lookup_paths_init(&paths, scope, root_dir);
r = lookup_paths_init(&paths, scope, 0, root_dir);
if (r < 0)
return r;
@ -1791,7 +1791,7 @@ int unit_file_enable(
assert(scope >= 0);
assert(scope < _UNIT_FILE_SCOPE_MAX);
r = lookup_paths_init(&paths, scope, root_dir);
r = lookup_paths_init(&paths, scope, 0, root_dir);
if (r < 0)
return r;
@ -1834,7 +1834,7 @@ int unit_file_disable(
assert(scope >= 0);
assert(scope < _UNIT_FILE_SCOPE_MAX);
r = lookup_paths_init(&paths, scope, root_dir);
r = lookup_paths_init(&paths, scope, 0, root_dir);
if (r < 0)
return r;
@ -1907,7 +1907,7 @@ int unit_file_set_default(
if (streq(name, SPECIAL_DEFAULT_TARGET))
return -EINVAL;
r = lookup_paths_init(&paths, scope, root_dir);
r = lookup_paths_init(&paths, scope, 0, root_dir);
if (r < 0)
return r;
@ -1939,7 +1939,7 @@ int unit_file_get_default(
assert(scope < _UNIT_FILE_SCOPE_MAX);
assert(name);
r = lookup_paths_init(&paths, scope, root_dir);
r = lookup_paths_init(&paths, scope, 0, root_dir);
if (r < 0)
return r;
@ -2045,7 +2045,7 @@ int unit_file_get_state(
assert(scope < _UNIT_FILE_SCOPE_MAX);
assert(name);
r = lookup_paths_init(&paths, scope, root_dir);
r = lookup_paths_init(&paths, scope, 0, root_dir);
if (r < 0)
return r;
@ -2255,7 +2255,7 @@ int unit_file_preset(
assert(scope < _UNIT_FILE_SCOPE_MAX);
assert(mode < _UNIT_FILE_PRESET_MAX);
r = lookup_paths_init(&paths, scope, root_dir);
r = lookup_paths_init(&paths, scope, 0, root_dir);
if (r < 0)
return r;
@ -2292,7 +2292,7 @@ int unit_file_preset_all(
assert(scope < _UNIT_FILE_SCOPE_MAX);
assert(mode < _UNIT_FILE_PRESET_MAX);
r = lookup_paths_init(&paths, scope, root_dir);
r = lookup_paths_init(&paths, scope, 0, root_dir);
if (r < 0)
return r;
@ -2361,7 +2361,7 @@ int unit_file_get_list(
assert(scope < _UNIT_FILE_SCOPE_MAX);
assert(h);
r = lookup_paths_init(&paths, scope, root_dir);
r = lookup_paths_init(&paths, scope, 0, root_dir);
if (r < 0)
return r;

View file

@ -441,6 +441,7 @@ static int patch_root_prefix_strv(char **l, const char *root_dir) {
int lookup_paths_init(
LookupPaths *p,
UnitFileScope scope,
LookupPathsFlags flags,
const char *root_dir) {
_cleanup_free_ char
@ -477,9 +478,11 @@ int lookup_paths_init(
if (r < 0 && r != -ENXIO)
return r;
r = acquire_generator_dirs(scope, &generator, &generator_early, &generator_late);
if (r < 0 && r != -EOPNOTSUPP && r != -ENXIO)
return r;
if ((flags & LOOKUP_PATHS_EXCLUDE_GENERATED) == 0) {
r = acquire_generator_dirs(scope, &generator, &generator_early, &generator_late);
if (r < 0 && r != -EOPNOTSUPP && r != -ENXIO)
return r;
}
r = acquire_transient_dir(scope, &transient);
if (r < 0 && r != -EOPNOTSUPP && r != -ENXIO)
@ -751,6 +754,9 @@ int lookup_paths_mkdir_generator(LookupPaths *p) {
assert(p);
if (!p->generator || !p->generator_early || !p->generator_late)
return -EINVAL;
r = mkdir_p_label(p->generator, 0755);
q = mkdir_p_label(p->generator_early, 0755);
@ -771,10 +777,8 @@ void lookup_paths_trim_generator(LookupPaths *p) {
if (p->generator)
(void) rmdir(p->generator);
if (p->generator_early)
(void) rmdir(p->generator_early);
if (p->generator_late)
(void) rmdir(p->generator_late);
}

View file

@ -26,6 +26,10 @@ typedef struct LookupPaths LookupPaths;
#include "install.h"
#include "macro.h"
typedef enum LookupPathsFlags {
LOOKUP_PATHS_EXCLUDE_GENERATED = 1,
} LookupPathsFlags;
struct LookupPaths {
/* Where we look for unit files. This includes the individual special paths below, but also any vendor
* supplied, static unit file paths. */
@ -58,7 +62,7 @@ struct LookupPaths {
char *root_dir;
};
int lookup_paths_init(LookupPaths *p, UnitFileScope scope, const char *root_dir);
int lookup_paths_init(LookupPaths *p, UnitFileScope scope, LookupPathsFlags flags, const char *root_dir);
int lookup_paths_reduce(LookupPaths *p);

View file

@ -4810,7 +4810,7 @@ static int cat(int argc, char *argv[], void *userdata) {
return -EINVAL;
}
r = lookup_paths_init(&lp, arg_scope, arg_root);
r = lookup_paths_init(&lp, arg_scope, 0, arg_root);
if (r < 0)
return log_error_errno(r, "Failed to determine unit paths: %m");
@ -5240,7 +5240,7 @@ static int enable_sysv_units(const char *verb, char **args) {
"is-enabled"))
return 0;
r = lookup_paths_init(&paths, arg_scope, arg_root);
r = lookup_paths_init(&paths, arg_scope, LOOKUP_PATHS_EXCLUDE_GENERATED, arg_root);
if (r < 0)
return r;
@ -6073,7 +6073,7 @@ static int find_paths_to_edit(sd_bus *bus, char **names, char ***paths) {
assert(names);
assert(paths);
r = lookup_paths_init(&lp, arg_scope, arg_root);
r = lookup_paths_init(&lp, arg_scope, 0, arg_root);
if (r < 0)
return r;

View file

@ -1004,7 +1004,7 @@ int main(int argc, char *argv[]) {
umask(0022);
r = lookup_paths_init(&lp, UNIT_FILE_SYSTEM, NULL);
r = lookup_paths_init(&lp, UNIT_FILE_SYSTEM, LOOKUP_PATHS_EXCLUDE_GENERATED, NULL);
if (r < 0) {
log_error_errno(r, "Failed to find lookup paths: %m");
goto finish;

View file

@ -36,13 +36,13 @@ static void test_paths(UnitFileScope scope) {
assert_se(mkdtemp(template));
assert_se(unsetenv("SYSTEMD_UNIT_PATH") == 0);
assert_se(lookup_paths_init(&lp_without_env, scope, NULL) >= 0);
assert_se(lookup_paths_init(&lp_without_env, scope, 0, NULL) >= 0);
assert_se(!strv_isempty(lp_without_env.search_path));
assert_se(lookup_paths_reduce(&lp_without_env) >= 0);
systemd_unit_path = strjoina(template, "/systemd-unit-path");
assert_se(setenv("SYSTEMD_UNIT_PATH", systemd_unit_path, 1) == 0);
assert_se(lookup_paths_init(&lp_with_env, scope, NULL) == 0);
assert_se(lookup_paths_init(&lp_with_env, scope, 0, NULL) == 0);
assert_se(strv_length(lp_with_env.search_path) == 1);
assert_se(streq(lp_with_env.search_path[0], systemd_unit_path));
assert_se(lookup_paths_reduce(&lp_with_env) >= 0);