mirror of
https://github.com/systemd/systemd.git
synced 2025-03-31 14:50:15 +03:00
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:
parent
a69b4fb0f8
commit
4943d14306
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user