X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fmain.c;h=ed64dd167b924de9b639299f36e1a40d57898ffa;hb=b1e90ec515408aec2702522f6f68c4920b56375b;hp=14e21d634b920a6c2b136dbf2e7936b496e9720c;hpb=89fffa2735ea975b3716ee47820d194bd86cce5f;p=elogind.git diff --git a/src/core/main.c b/src/core/main.c index 14e21d634..ed64dd167 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -303,7 +303,8 @@ static int parse_proc_cmdline_word(const char *word) { } else if (startswith(word, "systemd.dump_core=")) { int r; - if ((r = parse_boolean(word + 18)) < 0) + r = parse_boolean(word + 18); + if (r < 0) log_warning("Failed to parse dump core switch %s. Ignoring.", word + 18); else arg_dump_core = r; @@ -311,7 +312,8 @@ static int parse_proc_cmdline_word(const char *word) { } else if (startswith(word, "systemd.crash_shell=")) { int r; - if ((r = parse_boolean(word + 20)) < 0) + r = parse_boolean(word + 20); + if (r < 0) log_warning("Failed to parse crash shell switch %s. Ignoring.", word + 20); else arg_crash_shell = r; @@ -319,7 +321,8 @@ static int parse_proc_cmdline_word(const char *word) { } else if (startswith(word, "systemd.confirm_spawn=")) { int r; - if ((r = parse_boolean(word + 22)) < 0) + r = parse_boolean(word + 22); + if (r < 0) log_warning("Failed to parse confirm spawn switch %s. Ignoring.", word + 22); else arg_confirm_spawn = r; @@ -341,23 +344,21 @@ static int parse_proc_cmdline_word(const char *word) { } else if (startswith(word, "systemd.default_standard_output=")) { int r; - if ((r = exec_output_from_string(word + 32)) < 0) + r = exec_output_from_string(word + 32); + if (r < 0) log_warning("Failed to parse default standard output switch %s. Ignoring.", word + 32); else arg_default_std_output = r; } else if (startswith(word, "systemd.default_standard_error=")) { int r; - if ((r = exec_output_from_string(word + 31)) < 0) + r = exec_output_from_string(word + 31); + if (r < 0) log_warning("Failed to parse default standard error switch %s. Ignoring.", word + 31); else arg_default_std_error = r; } else if (startswith(word, "systemd.setenv=")) { - _cleanup_free_ char *cenv = NULL; - - cenv = strdup(word + 15); - if (!cenv) - return -ENOMEM; + const char *cenv = word + 15; if (env_assignment_is_valid(cenv)) { char **env; @@ -366,7 +367,8 @@ static int parse_proc_cmdline_word(const char *word) { if (env) arg_default_environment = env; else - log_warning("Setting environment variable '%s' failed, ignoring: %m", cenv); + log_warning("Setting environment variable '%s' failed, ignoring: %s", + cenv, strerror(ENOMEM)); } else log_warning("Environment variable name '%s' is not valid. Ignoring.", cenv); @@ -694,35 +696,6 @@ static int parse_config_file(void) { return 0; } -static int parse_proc_cmdline(void) { - _cleanup_free_ char *line = NULL; - char *w, *state; - size_t l; - int r; - - r = proc_cmdline(&line); - if (r < 0) - log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r)); - if (r <= 0) - return 0; - - FOREACH_WORD_QUOTED(w, l, line, state) { - _cleanup_free_ char *word; - - word = strndup(w, l); - if (!word) - return log_oom(); - - r = parse_proc_cmdline_word(word); - if (r < 0) { - log_error("Failed on cmdline argument %s: %s", word, strerror(-r)); - return r; - } - } - - return 0; -} - static int parse_argv(int argc, char *argv[]) { enum { @@ -766,7 +739,7 @@ static int parse_argv(int argc, char *argv[]) { { "switched-root", no_argument, NULL, ARG_SWITCHED_ROOT }, { "default-standard-output", required_argument, NULL, ARG_DEFAULT_STD_OUTPUT, }, { "default-standard-error", required_argument, NULL, ARG_DEFAULT_STD_ERROR, }, - { NULL, 0, NULL, 0 } + {} }; int c, r; @@ -782,7 +755,8 @@ static int parse_argv(int argc, char *argv[]) { switch (c) { case ARG_LOG_LEVEL: - if ((r = log_set_max_level_from_string(optarg)) < 0) { + r = log_set_max_level_from_string(optarg); + if (r < 0) { log_error("Failed to parse log level %s.", optarg); return r; } @@ -790,8 +764,8 @@ static int parse_argv(int argc, char *argv[]) { break; case ARG_LOG_TARGET: - - if ((r = log_set_target_from_string(optarg)) < 0) { + r = log_set_target_from_string(optarg); + if (r < 0) { log_error("Failed to parse log target %s.", optarg); return r; } @@ -801,7 +775,8 @@ static int parse_argv(int argc, char *argv[]) { case ARG_LOG_COLOR: if (optarg) { - if ((r = log_show_color_from_string(optarg)) < 0) { + r = log_show_color_from_string(optarg); + if (r < 0) { log_error("Failed to parse log color setting %s.", optarg); return r; } @@ -811,9 +786,9 @@ static int parse_argv(int argc, char *argv[]) { break; case ARG_LOG_LOCATION: - if (optarg) { - if ((r = log_show_location_from_string(optarg)) < 0) { + r = log_show_location_from_string(optarg); + if (r < 0) { log_error("Failed to parse log location setting %s.", optarg); return r; } @@ -823,8 +798,8 @@ static int parse_argv(int argc, char *argv[]) { break; case ARG_DEFAULT_STD_OUTPUT: - - if ((r = exec_output_from_string(optarg)) < 0) { + r = exec_output_from_string(optarg); + if (r < 0) { log_error("Failed to parse default standard output setting %s.", optarg); return r; } else @@ -832,8 +807,8 @@ static int parse_argv(int argc, char *argv[]) { break; case ARG_DEFAULT_STD_ERROR: - - if ((r = exec_output_from_string(optarg)) < 0) { + r = exec_output_from_string(optarg); + if (r < 0) { log_error("Failed to parse default standard error output setting %s.", optarg); return r; } else @@ -842,7 +817,8 @@ static int parse_argv(int argc, char *argv[]) { case ARG_UNIT: - if ((r = set_default_unit(optarg)) < 0) { + r = set_default_unit(optarg); + if (r < 0) { log_error("Failed to set default unit %s: %s", optarg, strerror(-r)); return r; } @@ -1408,7 +1384,7 @@ int main(int argc, char *argv[]) { goto finish; if (arg_running_as == SYSTEMD_SYSTEM) - if (parse_proc_cmdline() < 0) + if (parse_proc_cmdline(parse_proc_cmdline_word) < 0) goto finish; log_parse_environment(); @@ -1905,14 +1881,42 @@ finish: #endif if (shutdown_verb) { - const char * command_line[] = { + char log_level[DECIMAL_STR_MAX(int) + 1]; + const char* command_line[9] = { SYSTEMD_SHUTDOWN_BINARY_PATH, shutdown_verb, - NULL + "--log-level", log_level, + "--log-target", }; + unsigned pos = 5; + assert(command_line[pos] == NULL); + _cleanup_strv_free_ char **env_block = NULL; env_block = strv_copy(environ); + snprintf(log_level, sizeof(log_level), "%d", log_get_max_level()); + + switch (log_get_target()) { + case LOG_TARGET_KMSG: + case LOG_TARGET_JOURNAL_OR_KMSG: + case LOG_TARGET_SYSLOG_OR_KMSG: + command_line[pos++] = "kmsg"; + break; + + case LOG_TARGET_CONSOLE: + default: + command_line[pos++] = "console"; + break; + }; + + if (log_get_show_color()) + command_line[pos++] = "--log-color"; + + if (log_get_show_location()) + command_line[pos++] = "--log-location"; + + assert(pos + 1 < ELEMENTSOF(command_line)); + if (arm_reboot_watchdog && arg_shutdown_watchdog > 0) { char *e; @@ -1935,7 +1939,8 @@ finish: cg_uninstall_release_agent(SYSTEMD_CGROUP_CONTROLLER); execve(SYSTEMD_SHUTDOWN_BINARY_PATH, (char **) command_line, env_block); - log_error("Failed to execute shutdown binary, freezing: %m"); + log_error("Failed to execute shutdown binary, %s: %m", + getpid() == 1 ? "freezing" : "quitting"); } if (getpid() == 1)