main.c revision f7cd3d5fcb6f393f1ff1decafb12d51e0db8894a
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen This file is part of systemd.
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen Copyright 2010 Lennart Poettering
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen systemd is free software; you can redistribute it and/or modify it
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen under the terms of the GNU Lesser General Public License as published by
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen the Free Software Foundation; either version 2.1 of the License, or
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen (at your option) any later version.
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen systemd is distributed in the hope that it will be useful, but
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen WITHOUT ANY WARRANTY; without even the implied warranty of
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen Lesser General Public License for more details.
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen You should have received a copy of the GNU Lesser General Public License
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen along with systemd; If not, see <http://www.gnu.org/licenses/>.
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic ManagerRunningAs arg_running_as = _MANAGER_RUNNING_AS_INVALID;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic bool arg_dump_core = true;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic bool arg_crash_shell = false;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic bool arg_crash_reboot = false;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic bool arg_confirm_spawn = false;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic ShowStatus arg_show_status = _SHOW_STATUS_UNSET;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic bool arg_switched_root = false;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic char ***arg_join_controllers = NULL;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic ExecOutput arg_default_std_output = EXEC_OUTPUT_JOURNAL;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic ExecOutput arg_default_std_error = EXEC_OUTPUT_INHERIT;
da927ba997d68401563b927f92e6e40e021a8e5cMichal Schmidtstatic usec_t arg_default_restart_usec = DEFAULT_RESTART_USEC;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic usec_t arg_default_timeout_start_usec = DEFAULT_TIMEOUT_USEC;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic usec_t arg_default_timeout_stop_usec = DEFAULT_TIMEOUT_USEC;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic usec_t arg_default_start_limit_interval = DEFAULT_START_LIMIT_INTERVAL;
1c4baffc1895809bae9ac36b670af90a4cb9cd7dTom Gundersenstatic unsigned arg_default_start_limit_burst = DEFAULT_START_LIMIT_BURST;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic usec_t arg_shutdown_watchdog = 10 * USEC_PER_MINUTE;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic char **arg_default_environment = NULL;
0dd25fb9f005d8ab7ac4bc10a609d00569f8c56aLennart Poetteringstatic struct rlimit *arg_default_rlimit[_RLIMIT_MAX] = {};
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic uint64_t arg_capability_bounding_set_drop = 0;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic nsec_t arg_timer_slack_nsec = NSEC_INFINITY;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic usec_t arg_default_timer_accuracy_usec = 1 * USEC_PER_MINUTE;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic bool arg_default_cpu_accounting = false;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic bool arg_default_blockio_accounting = false;
1c4baffc1895809bae9ac36b670af90a4cb9cd7dTom Gundersenstatic bool arg_default_memory_accounting = false;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic bool arg_default_tasks_accounting = false;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic void pager_open_if_enabled(void) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringnoreturn static void freeze_or_reboot(void) {
1c4baffc1895809bae9ac36b670af90a4cb9cd7dTom Gundersen log_emergency_errno(errno, "Failed to reboot: %m");
1c4baffc1895809bae9ac36b670af90a4cb9cd7dTom Gundersen /* Pass this on immediately, if this is not PID 1 */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_emergency("Caught <%s>, not dumping core.", signal_to_string(sig));
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* We want to wait for the core process, hence let's enable SIGCHLD */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_emergency_errno(errno, "Caught <%s>, cannot fork for core dump: %m", signal_to_string(sig));
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering else if (pid == 0) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* Enable default signal handler for core dump */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* Don't limit the core dump size */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* Just to be sure... */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* Raise the signal again */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering (void) kill(pid, sig); /* raise() would kill the parent */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering assert_not_reached("We shouldn't be here...");
1c4baffc1895809bae9ac36b670af90a4cb9cd7dTom Gundersen /* Order things nicely. */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_emergency_errno(r, "Caught <%s>, waitpid() failed: %m", signal_to_string(sig));
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_emergency("Caught <%s>, core dump failed (child "PID_FMT", code=%s, status=%i/%s).",
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering ? exit_status_to_string(status.si_status, EXIT_STATUS_FULL)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_emergency("Caught <%s>, dumped core as pid "PID_FMT".", signal_to_string(sig), pid);
1c4baffc1895809bae9ac36b670af90a4cb9cd7dTom Gundersen .sa_flags = SA_NOCLDSTOP|SA_NOCLDWAIT|SA_RESTART,
1c4baffc1895809bae9ac36b670af90a4cb9cd7dTom Gundersen log_notice("Executing crash shell in 10s...");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* Let the kernel reap children for us */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_emergency_errno(errno, "Failed to fork off crash shell: %m");
1c4baffc1895809bae9ac36b670af90a4cb9cd7dTom Gundersen else if (pid == 0) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering (void) execle("/bin/sh", "/bin/sh", NULL, environ);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_emergency_errno(errno, "execle() failed: %m");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_info("Spawned crash shell as PID "PID_FMT".", pid);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic void install_crash_handler(void) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering .sa_flags = SA_NODEFER, /* So that we can raise the signal again from the signal handler */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* We ignore the return value here, since, we don't mind if we
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * cannot set up a crash handler */
1c4baffc1895809bae9ac36b670af90a4cb9cd7dTom Gundersen r = sigaction_many(&sa, SIGNALS_CRASH_HANDLER, -1);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_debug_errno(r, "I had trouble setting up the crash handler, ignoring: %m");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic int console_setup(void) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering tty_fd = open_terminal("/dev/console", O_WRONLY|O_NOCTTY|O_CLOEXEC);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return log_error_errno(tty_fd, "Failed to open /dev/console: %m");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* We don't want to force text mode. plymouth may be showing
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * pictures already from initrd. */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return log_error_errno(r, "Failed to reset /dev/console: %m");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic int parse_crash_chvt(const char *value) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (safe_atoi(value, &arg_crash_chvt) >= 0)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering arg_crash_chvt = 0; /* switch to where kmsg goes */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering arg_crash_chvt = -1; /* turn off switching */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic int parse_proc_cmdline_item(const char *key, const char *value) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering static const char * const rlmap[] = {
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering if (streq(key, "systemd.unit") && value) {
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering return free_and_strdup(&arg_default_unit, value);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering } else if (streq(key, "rd.systemd.unit") && value) {
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering return free_and_strdup(&arg_default_unit, value);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering } else if (streq(key, "systemd.dump_core") && value) {
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering log_warning("Failed to parse dump core switch %s. Ignoring.", value);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering } else if (streq(key, "systemd.crash_chvt") && value) {
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering log_warning("Failed to parse crash chvt switch %s. Ignoring.", value);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering } else if (streq(key, "systemd.crash_shell") && value) {
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering log_warning("Failed to parse crash shell switch %s. Ignoring.", value);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering } else if (streq(key, "systemd.crash_reboot") && value) {
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering log_warning("Failed to parse crash reboot switch %s. Ignoring.", value);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering } else if (streq(key, "systemd.confirm_spawn") && value) {
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering log_warning("Failed to parse confirm spawn switch %s. Ignoring.", value);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering } else if (streq(key, "systemd.show_status") && value) {
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering r = parse_show_status(value, &arg_show_status);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering log_warning("Failed to parse show status switch %s. Ignoring.", value);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering } else if (streq(key, "systemd.default_standard_output") && value) {
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering log_warning("Failed to parse default standard output switch %s. Ignoring.", value);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering } else if (streq(key, "systemd.default_standard_error") && value) {
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering log_warning("Failed to parse default standard error switch %s. Ignoring.", value);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering } else if (streq(key, "systemd.setenv") && value) {
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering env = strv_env_set(arg_default_environment, value);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering log_warning_errno(ENOMEM, "Setting environment variable '%s' failed, ignoring: %m", value);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering log_warning("Environment variable name '%s' is not valid. Ignoring.", value);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering } else if (streq(key, "quiet") && !value) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (arg_show_status == _SHOW_STATUS_UNSET)
c92e531c82a9815ec349aa1bf31236b86b2d5311Lennart Poettering } else if (streq(key, "debug") && !value) {
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen /* Note that log_parse_environment() handles 'debug'
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen * too, and sets the log level to LOG_DEBUG. */
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering /* SysV compatibility */
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen return free_and_strdup(&arg_default_unit, rlmap[i+1]);
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen const char *filename, \
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen const char *section, \
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering const char *lvalue, \
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering const char *rvalue, \
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_syntax(unit, LOG_ERR, filename, line, r, \
091a364c802e34a58f3260c9cb5db9b75c62215cTom GundersenDEFINE_SETTER(config_parse_level2, log_set_max_level_from_string, "log level")
091a364c802e34a58f3260c9cb5db9b75c62215cTom GundersenDEFINE_SETTER(config_parse_target, log_set_target_from_string, "target")
091a364c802e34a58f3260c9cb5db9b75c62215cTom GundersenDEFINE_SETTER(config_parse_color, log_show_color_from_string, "color" )
091a364c802e34a58f3260c9cb5db9b75c62215cTom GundersenDEFINE_SETTER(config_parse_location, log_show_location_from_string, "location")
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen ncpus = parse_cpu_set_and_warn(rvalue, &c, unit, filename, line, lvalue);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (sched_setaffinity(0, CPU_ALLOC_SIZE(ncpus), c) < 0)
f0e1546763304aedc90e91d70dab9eeb7c966cf8Lennart Poettering log_warning("Failed to set CPU affinity: %m");
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering log_syntax(unit, LOG_ERR, filename, line, k, "Failed to parse show status setting, ignoring: %s", rvalue);
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse CrashChangeVT= setting, ignoring: %s", rvalue);
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poetteringstatic int config_parse_join_controllers(const char *unit,
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering unsigned n = 0;
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering arg_join_controllers = strv_free_free(arg_join_controllers);
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering r = extract_first_word(&rvalue, &word, WHITESPACE, EXTRACT_QUOTES);
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering log_syntax(unit, LOG_ERR, filename, line, r, "Invalid value for %s: %s", lvalue, whole_rvalue);
91b14d6ff362b938a72db17b095ee9903d07381bTom Gundersen for (a = arg_join_controllers; *a; a++) {
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering if (strv_extend_strv(&l, *a) < 0) {
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen log_syntax(unit, LOG_ERR, filename, line, 0, "Trailing garbage, ignoring.");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic int parse_config_file(void) {
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen { "Manager", "LogLevel", config_parse_level2, 0, NULL },
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen { "Manager", "LogTarget", config_parse_target, 0, NULL },
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen { "Manager", "LogColor", config_parse_color, 0, NULL },
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen { "Manager", "LogLocation", config_parse_location, 0, NULL },
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering { "Manager", "DumpCore", config_parse_bool, 0, &arg_dump_core },
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen { "Manager", "CrashChVT", /* legacy */ config_parse_crash_chvt, 0, NULL },
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "Manager", "CrashChangeVT", config_parse_crash_chvt, 0, NULL },
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen { "Manager", "CrashShell", config_parse_bool, 0, &arg_crash_shell },
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen { "Manager", "CrashReboot", config_parse_bool, 0, &arg_crash_reboot },
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen { "Manager", "ShowStatus", config_parse_show_status, 0, &arg_show_status },
822db23cfa98a9fbc48f41e11caafb6f1017e052Lennart Poettering { "Manager", "CPUAffinity", config_parse_cpu_affinity2, 0, NULL },
822db23cfa98a9fbc48f41e11caafb6f1017e052Lennart Poettering { "Manager", "JoinControllers", config_parse_join_controllers, 0, &arg_join_controllers },
822db23cfa98a9fbc48f41e11caafb6f1017e052Lennart Poettering { "Manager", "RuntimeWatchdogSec", config_parse_sec, 0, &arg_runtime_watchdog },
822db23cfa98a9fbc48f41e11caafb6f1017e052Lennart Poettering { "Manager", "ShutdownWatchdogSec", config_parse_sec, 0, &arg_shutdown_watchdog },
822db23cfa98a9fbc48f41e11caafb6f1017e052Lennart Poettering { "Manager", "CapabilityBoundingSet", config_parse_bounding_set, 0, &arg_capability_bounding_set_drop },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "Manager", "SystemCallArchitectures", config_parse_syscall_archs, 0, &arg_syscall_archs },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "Manager", "TimerSlackNSec", config_parse_nsec, 0, &arg_timer_slack_nsec },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "Manager", "DefaultTimerAccuracySec", config_parse_sec, 0, &arg_default_timer_accuracy_usec },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "Manager", "DefaultStandardOutput", config_parse_output, 0, &arg_default_std_output },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "Manager", "DefaultStandardError", config_parse_output, 0, &arg_default_std_error },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "Manager", "DefaultTimeoutStartSec", config_parse_sec, 0, &arg_default_timeout_start_usec },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "Manager", "DefaultTimeoutStopSec", config_parse_sec, 0, &arg_default_timeout_stop_usec },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "Manager", "DefaultRestartSec", config_parse_sec, 0, &arg_default_restart_usec },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "Manager", "DefaultStartLimitInterval", config_parse_sec, 0, &arg_default_start_limit_interval },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "Manager", "DefaultStartLimitBurst", config_parse_unsigned, 0, &arg_default_start_limit_burst },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "Manager", "DefaultEnvironment", config_parse_environ, 0, &arg_default_environment },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "Manager", "DefaultLimitCPU", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_CPU] },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "Manager", "DefaultLimitFSIZE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_FSIZE] },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "Manager", "DefaultLimitDATA", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_DATA] },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "Manager", "DefaultLimitSTACK", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_STACK] },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "Manager", "DefaultLimitCORE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_CORE] },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "Manager", "DefaultLimitRSS", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_RSS] },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "Manager", "DefaultLimitNOFILE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_NOFILE] },
822db23cfa98a9fbc48f41e11caafb6f1017e052Lennart Poettering { "Manager", "DefaultLimitAS", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_AS] },
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek { "Manager", "DefaultLimitNPROC", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_NPROC] },
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek { "Manager", "DefaultLimitMEMLOCK", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_MEMLOCK] },
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek { "Manager", "DefaultLimitLOCKS", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_LOCKS] },
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek { "Manager", "DefaultLimitSIGPENDING", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_SIGPENDING] },
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek { "Manager", "DefaultLimitMSGQUEUE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_MSGQUEUE] },
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek { "Manager", "DefaultLimitNICE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_NICE] },
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek { "Manager", "DefaultLimitRTPRIO", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_RTPRIO] },
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek { "Manager", "DefaultLimitRTTIME", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_RTTIME] },
822db23cfa98a9fbc48f41e11caafb6f1017e052Lennart Poettering { "Manager", "DefaultCPUAccounting", config_parse_bool, 0, &arg_default_cpu_accounting },
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek { "Manager", "DefaultBlockIOAccounting", config_parse_bool, 0, &arg_default_blockio_accounting },
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek { "Manager", "DefaultMemoryAccounting", config_parse_bool, 0, &arg_default_memory_accounting },
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek { "Manager", "DefaultTasksAccounting", config_parse_bool, 0, &arg_default_tasks_accounting },
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek const char *fn, *conf_dirs_nulstr;
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek fn = arg_running_as == MANAGER_SYSTEM ? PKGSYSCONFDIR "/system.conf" : PKGSYSCONFDIR "/user.conf";
822db23cfa98a9fbc48f41e11caafb6f1017e052Lennart Poettering conf_dirs_nulstr = arg_running_as == MANAGER_SYSTEM ? CONF_DIRS_NULSTR("systemd/system.conf") : CONF_DIRS_NULSTR("systemd/user.conf");
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek config_parse_many(fn, conf_dirs_nulstr, "Manager\0",
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek config_item_table_lookup, items, false, NULL);
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmekstatic void manager_set_defaults(Manager *m) {
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek m->default_timer_accuracy_usec = arg_default_timer_accuracy_usec;
4713135eae4f7b6b670a98476fe413edfa1d9f41Zbigniew Jędrzejewski-Szmek m->default_std_output = arg_default_std_output;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering m->default_std_error = arg_default_std_error;
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering m->default_timeout_start_usec = arg_default_timeout_start_usec;
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen m->default_timeout_stop_usec = arg_default_timeout_stop_usec;
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen m->default_restart_usec = arg_default_restart_usec;
822db23cfa98a9fbc48f41e11caafb6f1017e052Lennart Poettering m->default_start_limit_interval = arg_default_start_limit_interval;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering m->default_start_limit_burst = arg_default_start_limit_burst;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering m->default_cpu_accounting = arg_default_cpu_accounting;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering m->default_blockio_accounting = arg_default_blockio_accounting;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering m->default_memory_accounting = arg_default_memory_accounting;
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen m->default_tasks_accounting = arg_default_tasks_accounting;
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen manager_set_default_rlimits(m, arg_default_rlimit);
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering manager_environment_add(m, NULL, arg_default_environment);
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poetteringstatic int parse_argv(int argc, char *argv[]) {
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering { "log-level", required_argument, NULL, ARG_LOG_LEVEL },
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering { "log-target", required_argument, NULL, ARG_LOG_TARGET },
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering { "log-color", optional_argument, NULL, ARG_LOG_COLOR },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "log-location", optional_argument, NULL, ARG_LOG_LOCATION },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "unit", required_argument, NULL, ARG_UNIT },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "no-pager", no_argument, NULL, ARG_NO_PAGER },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "version", no_argument, NULL, ARG_VERSION },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "dump-configuration-items", no_argument, NULL, ARG_DUMP_CONFIGURATION_ITEMS },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "dump-core", optional_argument, NULL, ARG_DUMP_CORE },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "crash-chvt", required_argument, NULL, ARG_CRASH_CHVT },
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen { "crash-shell", optional_argument, NULL, ARG_CRASH_SHELL },
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering { "crash-reboot", optional_argument, NULL, ARG_CRASH_REBOOT },
822db23cfa98a9fbc48f41e11caafb6f1017e052Lennart Poettering { "confirm-spawn", optional_argument, NULL, ARG_CONFIRM_SPAWN },
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering { "show-status", optional_argument, NULL, ARG_SHOW_STATUS },
822db23cfa98a9fbc48f41e11caafb6f1017e052Lennart Poettering { "deserialize", required_argument, NULL, ARG_DESERIALIZE },
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering { "switched-root", no_argument, NULL, ARG_SWITCHED_ROOT },
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering { "default-standard-output", required_argument, NULL, ARG_DEFAULT_STD_OUTPUT, },
87f5a19343acf8ba697acc5a62bdb1a2b8c9eda3Lennart Poettering { "default-standard-error", required_argument, NULL, ARG_DEFAULT_STD_ERROR, },
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering while ((c = getopt_long(argc, argv, "hDbsz:", options, NULL)) >= 0)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering r = log_set_max_level_from_string(optarg);
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen log_error("Failed to parse log level %s.", optarg);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering log_error("Failed to parse log target %s.", optarg);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error("Failed to parse log color setting %s.", optarg);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering r = log_show_location_from_string(optarg);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error("Failed to parse log location setting %s.", optarg);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error("Failed to parse default standard output setting %s.", optarg);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error("Failed to parse default standard error output setting %s.", optarg);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering r = free_and_strdup(&arg_default_unit, optarg);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return log_error_errno(r, "Failed to set default unit %s: %m", optarg);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering arg_action = ACTION_DUMP_CONFIGURATION_ITEMS;
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering return log_error_errno(r, "Failed to parse dump core boolean: %s", optarg);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering return log_error_errno(r, "Failed to parse crash virtual terminal index: %s", optarg);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering return log_error_errno(r, "Failed to parse crash shell boolean: %s", optarg);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering return log_error_errno(r, "Failed to parse crash shell boolean: %s", optarg);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error("Failed to parse confirm spawn boolean %s.", optarg);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering r = parse_show_status(optarg, &arg_show_status);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error("Failed to parse show status boolean %s.", optarg);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (r < 0 || fd < 0) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error("Failed to parse deserialize option %s.", optarg);
72290734be81e83e6ef9520c07692f68095eb5b2Tom Gundersen return log_error_errno(errno, "Failed to open serialization fd: %m");
72290734be81e83e6ef9520c07692f68095eb5b2Tom Gundersen /* Just to eat away the sysvinit kernel
72290734be81e83e6ef9520c07692f68095eb5b2Tom Gundersen * cmdline args without getopt() error
72290734be81e83e6ef9520c07692f68095eb5b2Tom Gundersen * messages that we'll parse in
72290734be81e83e6ef9520c07692f68095eb5b2Tom Gundersen * parse_proc_cmdline_word() or ignore. */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering assert_not_reached("Unhandled option code.");
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering /* Hmm, when we aren't run as init system
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering * let's complain about excess arguments */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic int help(void) {
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen "Starts up and maintains the system or user services.\n\n"
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering " -h --help Show this help\n"
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering " --test Determine startup sequence, dump it and exit\n"
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen " --no-pager Do not pipe output into a pager\n"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering " --dump-configuration-items Dump understood unit configuration items\n"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering " --unit=UNIT Set default unit\n"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering " --system Run a system instance, even if PID != 1\n"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering " --user Run a user instance\n"
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen " --dump-core[=BOOL] Dump core on crash\n"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering " --crash-vt=NR Change to specified VT on crash\n"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering " --crash-reboot[=BOOL] Reboot on crash\n"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering " --crash-shell[=BOOL] Run shell on crash\n"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering " --confirm-spawn[=BOOL] Ask for confirmation when spawning processes\n"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering " --show-status[=BOOL] Show status updates on the console during bootup\n"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering " --log-target=TARGET Set log target (console, journal, kmsg, journal-or-kmsg, null)\n"
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering " --log-level=LEVEL Set log level (debug, info, notice, warning, err, crit, alert, emerg)\n"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering " --log-color[=BOOL] Highlight important log messages\n"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering " --log-location[=BOOL] Include code location in log messages\n"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering " --default-standard-output= Set default standard output for services\n"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering " --default-standard-error= Set default standard error output for services\n",
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic int prepare_reexecute(Manager *m, FILE **_f, FDSet **_fds, bool switching_root) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering return log_error_errno(r, "Failed to create serialization file: %m");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* Make sure nothing is really destructed when we shut down */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering r = manager_serialize(m, f, fds, switching_root);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return log_error_errno(r, "Failed to serialize state: %m");
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (fseeko(f, 0, SEEK_SET) == (off_t) -1)
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering return log_error_errno(errno, "Failed to rewind serialization fd: %m");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return log_error_errno(r, "Failed to disable O_CLOEXEC for serialization: %m");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering return log_error_errno(r, "Failed to disable O_CLOEXEC for serialization fds: %m");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic int bump_rlimit_nofile(struct rlimit *saved_rlimit) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* Save the original RLIMIT_NOFILE so that we can reset it
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * later when transitioning from the initrd to the main
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * systemd or suchlike. */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (getrlimit(RLIMIT_NOFILE, saved_rlimit) < 0)
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering return log_error_errno(errno, "Reading RLIMIT_NOFILE failed: %m");
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering /* Make sure forked processes get the default kernel setting */
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (!arg_default_rlimit[RLIMIT_NOFILE]) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering rl = newdup(struct rlimit, saved_rlimit, 1);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering /* Bump up the resource limit for ourselves substantially */
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering r = setrlimit_closest(RLIMIT_NOFILE, &nl);
2c27fbca2d88214bd305272308a370a962818f1eLennart Poettering return log_error_errno(r, "Setting RLIMIT_NOFILE failed: %m");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic void test_mtab(void) {
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poettering static const char ok[] =
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering /* Check that /etc/mtab is a symlink to the right place or
2c27fbca2d88214bd305272308a370a962818f1eLennart Poettering * non-existing. But certainly not a file, or a symlink to
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering * some weird place... */
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering log_error("/etc/mtab is not a symlink or not pointing to /proc/self/mounts. "
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering "This is not supported anymore. "
2c27fbca2d88214bd305272308a370a962818f1eLennart Poettering "Please replace /etc/mtab with a symlink to /proc/self/mounts.");
2c27fbca2d88214bd305272308a370a962818f1eLennart Poetteringstatic void test_usr(void) {
2c27fbca2d88214bd305272308a370a962818f1eLennart Poettering /* Check that /usr is not a separate fs */
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering log_warning("/usr appears to be on its own filesystem and is not already mounted. This is not a supported setup. "
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering "Some things will probably break (sometimes even silently) in mysterious ways. "
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering "Consult http://freedesktop.org/wiki/Software/systemd/separate-usr-is-broken for more information.");
5cb36f41f01cf4b1f4395abfffd1b33116591e58Lennart Poetteringstatic int initialize_join_controllers(void) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* By default, mount "cpu" + "cpuacct" together, and "net_cls"
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering * + "net_prio". We'd like to add "cpuset" to the mix, but
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering * "cpuset" doesn't really work for groups with no initialized
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering * attributes. */
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering arg_join_controllers[0] = strv_new("cpu", "cpuacct", NULL);
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering arg_join_controllers[1] = strv_new("net_cls", "net_prio", NULL);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering arg_join_controllers = strv_free_free(arg_join_controllers);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic int enforce_syscall_archs(Set *archs) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering r = seccomp_arch_add(seccomp, PTR_TO_UINT32(id) - 1);
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering log_error_errno(r, "Failed to add architecture to seccomp: %m");
e1c959948c0e31d6997bcdfbabfbd077784b2baeLennart Poettering r = seccomp_attr_set(seccomp, SCMP_FLTATR_CTL_NNP, 0);
e1c959948c0e31d6997bcdfbabfbd077784b2baeLennart Poettering log_error_errno(r, "Failed to unset NO_NEW_PRIVS: %m");
e1c959948c0e31d6997bcdfbabfbd077784b2baeLennart Poettering log_error_errno(r, "Failed to add install architecture seccomp: %m");
e1c959948c0e31d6997bcdfbabfbd077784b2baeLennart Poetteringstatic int status_welcome(void) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering _cleanup_free_ char *pretty_name = NULL, *ansi_color = NULL;
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering r = parse_env_file("/etc/os-release", NEWLINE,
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering r = parse_env_file("/usr/lib/os-release", NEWLINE,
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering if (r < 0 && r != -ENOENT)
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering log_warning_errno(r, "Failed to read os-release file: %m");
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering "\nWelcome to \x1B[%sm%s\x1B[0m!\n",
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering isempty(pretty_name) ? "Linux" : pretty_name);
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poetteringstatic int write_container_id(void) {
eb60f9cd4e93ff5016dc1b5486fd1b7e1565fd92Lennart Poettering const char *c;
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering return write_string_file("/run/systemd/container", c, WRITE_STRING_FILE_CREATE);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering dual_timestamp initrd_timestamp = DUAL_TIMESTAMP_NULL;
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering dual_timestamp userspace_timestamp = DUAL_TIMESTAMP_NULL;
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering dual_timestamp kernel_timestamp = DUAL_TIMESTAMP_NULL;
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering dual_timestamp security_start_timestamp = DUAL_TIMESTAMP_NULL;
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering dual_timestamp security_finish_timestamp = DUAL_TIMESTAMP_NULL;
556a22945fcc88ca27ae7ecc46c9bb2727e37895Lennart Poettering char *switch_root_dir = NULL, *switch_root_init = NULL;
556a22945fcc88ca27ae7ecc46c9bb2727e37895Lennart Poettering struct rlimit saved_rlimit_nofile = RLIMIT_MAKE_CONST(0);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering if (getpid() != 1 && strstr(program_invocation_short_name, "init")) {
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering /* This is compatibility support for SysV, where
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * calling init as a user is identical to telinit. */
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering log_error_errno(errno, "Failed to exec " SYSTEMCTL_BINARY_PATH ": %m");
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering dual_timestamp_from_monotonic(&kernel_timestamp, 0);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering dual_timestamp_get(&userspace_timestamp);
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering /* Determine if this is a reexecution or normal bootup. We do
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * the full command line parsing much later, so let's just
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * have a quick peek here. */
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering /* If we have switched root, do all the special setup
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering if (strv_find(argv+1, "--switched-root"))
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering /* If we get started via the /sbin/init symlink then we are
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering called 'init'. After a subsequent reexecution we are then
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering called 'systemd'. That is confusing, hence let's call us
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering systemd right-away. */
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering log_show_color(isatty(STDERR_FILENO) > 0);
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering /* Disable the umask logic */
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering if (getpid() == 1 && detect_container() <= 0) {
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering /* Running outside of a container as PID 1 */
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering dual_timestamp_get(&security_start_timestamp);
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering if (mac_selinux_setup(&loaded_policy) < 0) {
a407657425a3e47fd2b559cd3bc800f791303f63Lennart Poettering error_message = "Failed to load SELinux policy";
902bb5d8abb2a7d258741828d212ca549ab16950Lennart Poettering } else if (ima_setup() < 0) {
902bb5d8abb2a7d258741828d212ca549ab16950Lennart Poettering error_message = "Failed to load IMA policy";
902bb5d8abb2a7d258741828d212ca549ab16950Lennart Poettering } else if (mac_smack_setup(&loaded_policy) < 0) {
902bb5d8abb2a7d258741828d212ca549ab16950Lennart Poettering error_message = "Failed to load SMACK policy";
902bb5d8abb2a7d258741828d212ca549ab16950Lennart Poettering dual_timestamp_get(&security_finish_timestamp);
3e684349c2cead2e6fd2f816c34eb17daba23a49Lennart Poettering error_message = "Failed to initialize SELinux policy";
3e684349c2cead2e6fd2f816c34eb17daba23a49Lennart Poettering * The very first call of settimeofday() also does a time warp in the kernel.
91b14d6ff362b938a72db17b095ee9903d07381bTom Gundersen * In the rtc-in-local time mode, we set the kernel's timezone, and rely on
91b14d6ff362b938a72db17b095ee9903d07381bTom Gundersen * external tools to take care of maintaining the RTC and do all adjustments.
91b14d6ff362b938a72db17b095ee9903d07381bTom Gundersen * This matches the behavior of Windows, which leaves the RTC alone if the
91b14d6ff362b938a72db17b095ee9903d07381bTom Gundersen * registry tells that the RTC runs in UTC.
3e684349c2cead2e6fd2f816c34eb17daba23a49Lennart Poettering log_error_errno(r, "Failed to apply local time delta, ignoring: %m");
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering log_info("RTC configured in localtime, applying delta of %i minutes to system time.", min);
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering } else if (!in_initrd()) {
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering * Do a dummy very first call to seal the kernel's time warp magic.
log_open();
log_open();
goto finish;
r = initialize_join_controllers();
goto finish;
if (!skip_setup)
kmod_setup();
goto finish;
(void) reset_all_signal_handlers();
if (parse_config_file() < 0) {
goto finish;
goto finish;
geteuid() == 0) {
goto finish;
sd_booted() <= 0) {
goto finish;
running_in_chroot() > 0) {
goto finish;
skip_setup = true;
goto finish;
goto finish;
goto finish;
goto finish;
goto finish;
log_close();
goto finish;
if (arg_serialization)
setsid();
log_open();
goto finish;
v = detect_virtualization();
if (in_initrd())
* /etc/machine-id as flag file. This allows container
if (empty_etc)
_cleanup_free_ char *t;
if (arg_show_status > 0)
test_mtab();
test_usr();
goto finish;
goto finish;
if (arg_syscall_archs) {
goto finish;
if (empty_etc) {
r = unit_file_preset_all(UNIT_FILE_SYSTEM, false, NULL, UNIT_FILE_PRESET_ENABLE_ONLY, false, NULL, 0);
goto finish;
if (queue_default_job) {
goto finish;
goto finish;
goto finish;
if (r == -EPERM) {
log_debug("Default target could not be isolated, starting instead: %s", bus_error_message(&error, r));
goto finish;
goto finish;
goto finish;
r = manager_loop(m);
goto finish;
switch (m->exit_code) {
case MANAGER_RELOAD:
r = parse_config_file();
r = manager_reload(m);
case MANAGER_REEXECUTE:
goto finish;
reexecute = true;
goto finish;
case MANAGER_SWITCH_ROOT:
if (!switch_root_init)
goto finish;
reexecute = true;
goto finish;
case MANAGER_EXIT:
goto finish;
case MANAGER_REBOOT:
case MANAGER_POWEROFF:
case MANAGER_HALT:
case MANAGER_KEXEC: {
goto finish;
pager_close();
m = manager_free(m);
if (reexecute) {
const char **args;
unsigned i, args_size;
watchdog_close(true);
if (switch_root_dir) {
if (!switch_root_init) {
if (switch_root_dir)
if (switch_root_dir)
(void) clearenv();
(void) make_console_stdio();
(void) reset_all_signal_handlers();
(void) reset_signal_mask();
if (switch_root_init) {
#ifdef HAVE_VALGRIND_VALGRIND_H
if (shutdown_verb) {
switch (log_get_target()) {
case LOG_TARGET_KMSG:
case LOG_TARGET_NULL:
case LOG_TARGET_CONSOLE:
if (log_get_show_color())
if (log_get_show_location())
watchdog_close(r < 0);
watchdog_close(true);
if (detect_container() <= 0)
if (error_message)
return retval;