diff options
Diffstat (limited to 'src/systemctl/systemctl.c')
-rw-r--r-- | src/systemctl/systemctl.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index f8e10a4710..a7b8e54a9c 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -72,6 +72,7 @@ #include "process-util.h" #include "terminal-util.h" #include "hostname-util.h" +#include "signal-util.h" static char **arg_types = NULL; static char **arg_states = NULL; @@ -5098,7 +5099,7 @@ static int import_environment(sd_bus *bus, char **args) { static int enable_sysv_units(const char *verb, char **args) { int r = 0; -#if defined(HAVE_SYSV_COMPAT) && defined(HAVE_CHKCONFIG) +#if defined(HAVE_SYSV_COMPAT) unsigned f = 0; _cleanup_lookup_paths_free_ LookupPaths paths = {}; @@ -5123,7 +5124,7 @@ static int enable_sysv_units(const char *verb, char **args) { _cleanup_free_ char *p = NULL, *q = NULL, *l = NULL; bool found_native = false, found_sysv; unsigned c = 1; - const char *argv[6] = { "/sbin/chkconfig", NULL, NULL, NULL, NULL }; + const char *argv[6] = { ROOTLIBEXECDIR "/systemd-sysv-install", NULL, NULL, NULL, NULL }; char **k; int j; pid_t pid; @@ -5149,7 +5150,10 @@ static int enable_sysv_units(const char *verb, char **args) { break; } - if (found_native) + /* If we have both a native unit and a SysV script, + * enable/disable them both (below); for is-enabled, prefer the + * native unit */ + if (found_native && streq(verb, "is-enabled")) continue; p = path_join(arg_root, SYSTEM_SYSVINIT_PATH, name); @@ -5161,15 +5165,16 @@ static int enable_sysv_units(const char *verb, char **args) { if (!found_sysv) continue; - log_info("%s is not a native service, redirecting to /sbin/chkconfig.", name); + if (found_native) + log_info("Synchronizing state of %s with SysV init with %s...", name, argv[0]); + else + log_info("%s is not a native service, redirecting to systemd-sysv-install", name); if (!isempty(arg_root)) argv[c++] = q = strappend("--root=", arg_root); + argv[c++] = verb; argv[c++] = basename(p); - argv[c++] = - streq(verb, "enable") ? "on" : - streq(verb, "disable") ? "off" : "--level=5"; argv[c] = NULL; l = strv_join((char**)argv, " "); @@ -5185,6 +5190,7 @@ static int enable_sysv_units(const char *verb, char **args) { /* Child */ execv(argv[0], (char**) argv); + log_error("Failed to execute %s: %m", argv[0]); _exit(EXIT_FAILURE); } @@ -5210,6 +5216,9 @@ static int enable_sysv_units(const char *verb, char **args) { } else return -EPROTO; + if (found_native) + continue; + /* Remove this entry, so that we don't try enabling it as native unit */ assert(f > 0); f--; |