Merge pull request #1744 from evverx/fix-debug-generator
debug-generator: respect kernel parameters for default unit setting
This commit is contained in:
commit
8ba576d0e6
|
@ -26,6 +26,7 @@
|
|||
#include "parse-util.h"
|
||||
#include "proc-cmdline.h"
|
||||
#include "process-util.h"
|
||||
#include "special.h"
|
||||
#include "string-util.h"
|
||||
#include "util.h"
|
||||
#include "virt.h"
|
||||
|
@ -143,3 +144,31 @@ int shall_restore_state(void) {
|
|||
|
||||
return parse_boolean(value);
|
||||
}
|
||||
|
||||
static const char * const rlmap[] = {
|
||||
"emergency", SPECIAL_EMERGENCY_TARGET,
|
||||
"-b", SPECIAL_EMERGENCY_TARGET,
|
||||
"rescue", SPECIAL_RESCUE_TARGET,
|
||||
"single", SPECIAL_RESCUE_TARGET,
|
||||
"-s", SPECIAL_RESCUE_TARGET,
|
||||
"s", SPECIAL_RESCUE_TARGET,
|
||||
"S", SPECIAL_RESCUE_TARGET,
|
||||
"1", SPECIAL_RESCUE_TARGET,
|
||||
"2", SPECIAL_MULTI_USER_TARGET,
|
||||
"3", SPECIAL_MULTI_USER_TARGET,
|
||||
"4", SPECIAL_MULTI_USER_TARGET,
|
||||
"5", SPECIAL_GRAPHICAL_TARGET,
|
||||
};
|
||||
|
||||
const char* runlevel_to_target(const char *word) {
|
||||
size_t i;
|
||||
|
||||
if (!word)
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < ELEMENTSOF(rlmap); i += 2)
|
||||
if (streq(word, rlmap[i]))
|
||||
return rlmap[i+1];
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -26,3 +26,4 @@ int parse_proc_cmdline(int (*parse_word)(const char *key, const char *value));
|
|||
int get_proc_cmdline_key(const char *parameter, char **value);
|
||||
|
||||
int shall_restore_state(void);
|
||||
const char* runlevel_to_target(const char *rl);
|
||||
|
|
|
@ -301,20 +301,6 @@ static int parse_crash_chvt(const char *value) {
|
|||
|
||||
static int parse_proc_cmdline_item(const char *key, const char *value) {
|
||||
|
||||
static const char * const rlmap[] = {
|
||||
"emergency", SPECIAL_EMERGENCY_TARGET,
|
||||
"-b", SPECIAL_EMERGENCY_TARGET,
|
||||
"rescue", SPECIAL_RESCUE_TARGET,
|
||||
"single", SPECIAL_RESCUE_TARGET,
|
||||
"-s", SPECIAL_RESCUE_TARGET,
|
||||
"s", SPECIAL_RESCUE_TARGET,
|
||||
"S", SPECIAL_RESCUE_TARGET,
|
||||
"1", SPECIAL_RESCUE_TARGET,
|
||||
"2", SPECIAL_MULTI_USER_TARGET,
|
||||
"3", SPECIAL_MULTI_USER_TARGET,
|
||||
"4", SPECIAL_MULTI_USER_TARGET,
|
||||
"5", SPECIAL_GRAPHICAL_TARGET,
|
||||
};
|
||||
int r;
|
||||
|
||||
assert(key);
|
||||
|
@ -415,12 +401,12 @@ static int parse_proc_cmdline_item(const char *key, const char *value) {
|
|||
log_set_target(LOG_TARGET_CONSOLE);
|
||||
|
||||
} else if (!in_initrd() && !value) {
|
||||
unsigned i;
|
||||
const char *target;
|
||||
|
||||
/* SysV compatibility */
|
||||
for (i = 0; i < ELEMENTSOF(rlmap); i += 2)
|
||||
if (streq(key, rlmap[i]))
|
||||
return free_and_strdup(&arg_default_unit, rlmap[i+1]);
|
||||
target = runlevel_to_target(key);
|
||||
if (target)
|
||||
return free_and_strdup(&arg_default_unit, target);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -23,11 +23,13 @@
|
|||
#include "mkdir.h"
|
||||
#include "parse-util.h"
|
||||
#include "proc-cmdline.h"
|
||||
#include "special.h"
|
||||
#include "string-util.h"
|
||||
#include "strv.h"
|
||||
#include "unit-name.h"
|
||||
#include "util.h"
|
||||
|
||||
static char *arg_default_unit = NULL;
|
||||
static const char *arg_dest = "/tmp";
|
||||
static char **arg_mask = NULL;
|
||||
static char **arg_wants = NULL;
|
||||
|
@ -80,6 +82,24 @@ static int parse_proc_cmdline_item(const char *key, const char *value) {
|
|||
arg_debug_shell = r;
|
||||
} else
|
||||
arg_debug_shell = true;
|
||||
} else if (streq(key, "systemd.unit")) {
|
||||
|
||||
if (!value)
|
||||
log_error("Missing argument for systemd.unit= kernel command line parameter.");
|
||||
else {
|
||||
r = free_and_strdup(&arg_default_unit, value);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to set default unit %s: %m", value);
|
||||
}
|
||||
} else if (!value) {
|
||||
const char *target;
|
||||
|
||||
target = runlevel_to_target(key);
|
||||
if (target) {
|
||||
r = free_and_strdup(&arg_default_unit, target);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to set default unit %s: %m", target);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -118,7 +138,7 @@ static int generate_wants_symlinks(void) {
|
|||
STRV_FOREACH(u, arg_wants) {
|
||||
_cleanup_free_ char *p = NULL, *f = NULL;
|
||||
|
||||
p = strjoin(arg_dest, "/default.target.wants/", *u, NULL);
|
||||
p = strjoin(arg_dest, "/", arg_default_unit, ".wants/", *u, NULL);
|
||||
if (!p)
|
||||
return log_oom();
|
||||
|
||||
|
@ -154,6 +174,12 @@ int main(int argc, char *argv[]) {
|
|||
|
||||
umask(0022);
|
||||
|
||||
r = free_and_strdup(&arg_default_unit, SPECIAL_DEFAULT_TARGET);
|
||||
if (r < 0) {
|
||||
log_error_errno(r, "Failed to set default unit %s: %m", SPECIAL_DEFAULT_TARGET);
|
||||
goto finish;
|
||||
}
|
||||
|
||||
r = parse_proc_cmdline(parse_proc_cmdline_item);
|
||||
if (r < 0)
|
||||
log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m");
|
||||
|
|
|
@ -48,6 +48,7 @@
|
|||
#include "process-util.h"
|
||||
#include "rm-rf.h"
|
||||
#include "signal-util.h"
|
||||
#include "special.h"
|
||||
#include "stat-util.h"
|
||||
#include "string-util.h"
|
||||
#include "strv.h"
|
||||
|
@ -1638,6 +1639,12 @@ cleanup:
|
|||
assert_se(rmdir(t) >= 0);
|
||||
}
|
||||
|
||||
static void test_runlevel_to_target(void) {
|
||||
assert_se(streq_ptr(runlevel_to_target(NULL), NULL));
|
||||
assert_se(streq_ptr(runlevel_to_target("unknown-runlevel"), NULL));
|
||||
assert_se(streq_ptr(runlevel_to_target("3"), SPECIAL_MULTI_USER_TARGET));
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
log_parse_environment();
|
||||
log_open();
|
||||
|
@ -1718,6 +1725,7 @@ int main(int argc, char *argv[]) {
|
|||
test_tempfn();
|
||||
test_strcmp_ptr();
|
||||
test_fgetxattrat_fake();
|
||||
test_runlevel_to_target();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue