static bool arg_crash_shell = false;
static int arg_crash_chvt = -1;
static bool arg_confirm_spawn = false;
-static ShowStatus arg_show_status = SHOW_STATUS_UNSET;
+static ShowStatus arg_show_status = _SHOW_STATUS_UNSET;
static bool arg_switched_root = false;
static char ***arg_join_controllers = NULL;
static ExecOutput arg_default_std_output = EXEC_OUTPUT_JOURNAL;
} 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;
} 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;
} 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;
} 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;
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);
}
} else if (streq(word, "quiet")) {
- if (arg_show_status == SHOW_STATUS_UNSET)
+ if (arg_show_status == _SHOW_STATUS_UNSET)
arg_show_status = SHOW_STATUS_AUTO;
} else if (streq(word, "debug")) {
/* Log to kmsg, the journal socket will fill up before the
{ "Manager", "RuntimeWatchdogSec", config_parse_sec, 0, &arg_runtime_watchdog },
{ "Manager", "ShutdownWatchdogSec", config_parse_sec, 0, &arg_shutdown_watchdog },
{ "Manager", "CapabilityBoundingSet", config_parse_bounding_set, 0, &arg_capability_bounding_set_drop },
+#ifdef HAVE_SECCOMP
{ "Manager", "SystemCallArchitectures", config_parse_syscall_archs, 0, &arg_syscall_archs },
+#endif
{ "Manager", "TimerSlackNSec", config_parse_nsec, 0, &arg_timer_slack_nsec },
{ "Manager", "DefaultStandardOutput", config_parse_output, 0, &arg_default_std_output },
{ "Manager", "DefaultStandardError", config_parse_output, 0, &arg_default_std_error },
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 {
{ "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;
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;
}
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;
}
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;
}
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;
}
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
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
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;
}
}
}
+ r = seccomp_attr_set(seccomp, SCMP_FLTATR_CTL_NNP, 0);
+ if (r < 0) {
+ log_error("Failed to unset NO_NEW_PRIVS: %s", strerror(-r));
+ goto finish;
+ }
+
r = seccomp_load(seccomp);
if (r < 0)
log_error("Failed to add install architecture seccomp: %s", strerror(-r));
#endif
}
+static int status_welcome(void) {
+ _cleanup_free_ char *pretty_name = NULL, *ansi_color = NULL;
+ int r;
+
+ r = parse_env_file("/etc/os-release", NEWLINE,
+ "PRETTY_NAME", &pretty_name,
+ "ANSI_COLOR", &ansi_color,
+ NULL);
+
+ if (r < 0 && r != -ENOENT)
+ log_warning("Failed to read /etc/os-release: %s", strerror(-r));
+
+ return status_printf(NULL, false, false,
+ "\nWelcome to \x1B[%sm%s\x1B[0m!\n",
+ isempty(ansi_color) ? "1" : ansi_color,
+ isempty(pretty_name) ? "Linux" : pretty_name);
+}
+
int main(int argc, char *argv[]) {
Manager *m = NULL;
int r, retval = EXIT_FAILURE;
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();
/* Open the logging devices, if possible and necessary */
log_open();
+ if (arg_show_status == _SHOW_STATUS_UNSET)
+ arg_show_status = SHOW_STATUS_YES;
+
/* Make sure we leave a core dump without panicing the
* kernel. */
if (getpid() == 1) {
m->security_finish_timestamp = security_finish_timestamp;
manager_set_default_rlimits(m, arg_default_rlimit);
-
- if (arg_default_environment)
- manager_environment_add(m, NULL, arg_default_environment);
-
- if (arg_show_status == SHOW_STATUS_UNSET)
- arg_show_status = SHOW_STATUS_YES;
+ manager_environment_add(m, NULL, arg_default_environment);
manager_set_show_status(m, arg_show_status);
/* Remember whether we should queue the default job */
#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;
_cleanup_strv_free_ char **env_block = NULL;
+
+ assert(command_line[pos] == 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;
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)