main.c revision 54b434b1b5055f934230fe04fad35b01642b8488
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 SystemdRunningAs arg_running_as = _SYSTEMD_RUNNING_AS_INVALID;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic bool arg_dump_core = true;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic bool arg_crash_shell = false;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic bool arg_confirm_spawn = false;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic bool arg_show_status = true;
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;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic 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;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic 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;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic struct rlimit *arg_default_rlimit[RLIMIT_NLIMITS] = {};
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic uint64_t arg_capability_bounding_set_drop = 0;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic nsec_t arg_timer_slack_nsec = (nsec_t) -1;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* Pass this on immediately, if this is not PID 1 */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error("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_error("Caught <%s>, cannot fork for core dump: %s", signal_to_string(sig), strerror(errno));
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 assert_not_reached("We shouldn't be here...");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* Order things nicely. */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error("Caught <%s>, waitpid() failed: %s", signal_to_string(sig), strerror(-r));
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error("Caught <%s>, core dump failed.", signal_to_string(sig));
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error("Caught <%s>, dumped core as pid %lu.", signal_to_string(sig), (unsigned long) pid);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering .sa_flags = SA_NOCLDSTOP|SA_NOCLDWAIT|SA_RESTART,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_info("Executing crash shell in 10s...");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* Let the kernel reap children for us */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error("Failed to fork off crash shell: %m");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering else if (pid == 0) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_info("Successfully spawned crash shell as pid %lu.", (unsigned long) pid);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic void install_crash_handler(void) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering sigaction_many(&sa, SIGNALS_CRASH_HANDLER, -1);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* If we are init, we connect stdin/stdout/stderr to /dev/null
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * and make sure we don't have a controlling tty. */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering tty_fd = open_terminal("/dev/console", O_WRONLY|O_NOCTTY|O_CLOEXEC);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error("Failed to open /dev/console: %s", strerror(-tty_fd));
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* We don't want to force text mode.
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * plymouth may be showing pictures already from initrd. */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error("Failed to reset /dev/console: %s", strerror(-r));
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic int set_default_unit(const char *u) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic int parse_proc_cmdline_word(const char *word) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering static const char * const rlmap[] = {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering } else if (startswith(word, "rd.systemd.unit=")) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering } else if (startswith(word, "systemd.log_target=")) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (log_set_target_from_string(word + 19) < 0)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_warning("Failed to parse log target %s. Ignoring.", word + 19);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering } else if (startswith(word, "systemd.log_level=")) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (log_set_max_level_from_string(word + 18) < 0)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_warning("Failed to parse log level %s. Ignoring.", word + 18);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering } else if (startswith(word, "systemd.log_color=")) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (log_show_color_from_string(word + 18) < 0)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_warning("Failed to parse log color setting %s. Ignoring.", word + 18);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering } else if (startswith(word, "systemd.log_location=")) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (log_show_location_from_string(word + 21) < 0)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_warning("Failed to parse log location setting %s. Ignoring.", word + 21);
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen } else if (startswith(word, "systemd.dump_core=")) {
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen log_warning("Failed to parse dump core switch %s. Ignoring.", word + 18);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering } else if (startswith(word, "systemd.crash_shell=")) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_warning("Failed to parse crash shell switch %s. Ignoring.", word + 20);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering } else if (startswith(word, "systemd.confirm_spawn=")) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_warning("Failed to parse confirm spawn switch %s. Ignoring.", word + 22);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering } else if (startswith(word, "systemd.crash_chvt=")) {
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen log_warning("Failed to parse crash chvt switch %s. Ignoring.", word + 19);
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen } else if (startswith(word, "systemd.show_status=")) {
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen log_warning("Failed to parse show status switch %s. Ignoring.", word + 20);
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen } else if (startswith(word, "systemd.default_standard_output=")) {
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen if ((r = exec_output_from_string(word + 32)) < 0)
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen log_warning("Failed to parse default standard output switch %s. Ignoring.", word + 32);
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen } else if (startswith(word, "systemd.default_standard_error=")) {
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen if ((r = exec_output_from_string(word + 31)) < 0)
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen log_warning("Failed to parse default standard error switch %s. Ignoring.", word + 31);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering } else if (startswith(word, "systemd.setenv=")) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering env = strv_env_set(arg_default_environment, cenv);
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen log_warning("Setting environment variable '%s' failed, ignoring: %m", cenv);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_warning("Environment variable name '%s' is not valid. Ignoring.", cenv);
36f822c4bd077f9121757e24b6516e5c7ada63b5Zbigniew Jędrzejewski-Szmek (in_initrd() && startswith(word, "rd.systemd."))) {
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen /* Ignore systemd.journald.xyz and friends */
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen log_warning("Unknown kernel switch %s. Ignoring.", word);
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen "systemd.unit=UNIT Default unit to start\n"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering "rd.systemd.unit=UNIT Default unit to start when run in initrd\n"
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen "systemd.dump_core=0|1 Dump core on crash\n"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering "systemd.crash_shell=0|1 Run shell on crash\n"
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen "systemd.crash_chvt=N Change to VT #N on crash\n"
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen "systemd.confirm_spawn=0|1 Confirm every process spawn\n"
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen "systemd.show_status=0|1 Show status updates on the console during bootup\n"
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen "systemd.log_target=console|kmsg|journal|journal-or-kmsg|syslog|syslog-or-kmsg|null\n"
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen " Log target\n"
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen "systemd.log_level=LEVEL Log level\n"
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen "systemd.log_color=0|1 Highlight important log messages\n"
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen "systemd.log_location=0|1 Include code location in log messages\n"
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen "systemd.default_standard_output=null|tty|syslog|syslog+console|kmsg|kmsg+console|journal|journal+console\n"
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen " Set default log output for services\n"
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen "systemd.default_standard_error=null|tty|syslog|syslog+console|kmsg|kmsg+console|journal|journal+console\n"
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen " Set default log error output for services\n"
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering "systemd.setenv=ASSIGNMENT Set an environment variable for all spawned processes\n");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* Log to kmsg, the journal socket will fill up before the
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * journal is started and tools running during that time
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * will block with every log message for for 60 seconds,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * before they give up. */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering } else if (!in_initrd()) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* SysV compatibility */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering const char *lvalue, \
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering const char *rvalue, \
096b6773886bd7a0c8c97aa684b0b67dfae58355Lennart Poettering log_syntax(unit, LOG_ERR, filename, line, -r, \
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart PoetteringDEFINE_SETTER(config_parse_level2, log_set_max_level_from_string, "log level")
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart PoetteringDEFINE_SETTER(config_parse_target, log_set_target_from_string, "target")
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart PoetteringDEFINE_SETTER(config_parse_color, log_show_color_from_string, "color" )
091a364c802e34a58f3260c9cb5db9b75c62215cTom GundersenDEFINE_SETTER(config_parse_location, log_show_location_from_string, "location")
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic int config_parse_cpu_affinity2(const char *unit,
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen unsigned ncpus = 0;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (!(t = strndup(w, l)))
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen if (sched_setaffinity(0, CPU_ALLOC_SIZE(ncpus), c) < 0)
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen log_warning_unit(unit, "Failed to set CPU affinity: %m");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic void strv_free_free(char ***l) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering for (i = l; *i; i++)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic void free_join_controllers(void) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic int config_parse_join_controllers(const char *unit,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering unsigned n = 0;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering FOREACH_WORD_QUOTED(w, length, rvalue, state) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering for (a = arg_join_controllers; *a; a++) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic int parse_config_file(void) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "Manager", "LogLevel", config_parse_level2, 0, NULL },
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "Manager", "LogTarget", config_parse_target, 0, NULL },
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "Manager", "LogColor", config_parse_color, 0, NULL },
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "Manager", "LogLocation", config_parse_location, 0, NULL },
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "Manager", "DumpCore", config_parse_bool, 0, &arg_dump_core },
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "Manager", "CrashShell", config_parse_bool, 0, &arg_crash_shell },
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "Manager", "ShowStatus", config_parse_bool, 0, &arg_show_status },
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "Manager", "CrashChVT", config_parse_int, 0, &arg_crash_chvt },
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "Manager", "CPUAffinity", config_parse_cpu_affinity2, 0, NULL },
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "Manager", "DefaultStandardOutput", config_parse_output, 0, &arg_default_std_output },
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "Manager", "DefaultStandardError", config_parse_output, 0, &arg_default_std_error },
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "Manager", "DefaultTimeoutStartSec", config_parse_sec, 0, &arg_default_timeout_start_usec },
3cb10d3a0b1b6a7c44f307f2abb5215104e16941Lennart Poettering { "Manager", "DefaultTimeoutStopSec", config_parse_sec, 0, &arg_default_timeout_stop_usec },
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "Manager", "DefaultRestartSec", config_parse_sec, 0, &arg_default_restart_usec },
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "Manager", "DefaultStartLimitInterval", config_parse_sec, 0, &arg_default_start_limit_interval },
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "Manager", "DefaultStartLimitBurst", config_parse_unsigned, 0, &arg_default_start_limit_burst },
ad867662936a4c7ab2c7116d804c272338801231Lennart Poettering { "Manager", "JoinControllers", config_parse_join_controllers, 0, &arg_join_controllers },
ad867662936a4c7ab2c7116d804c272338801231Lennart Poettering { "Manager", "RuntimeWatchdogSec", config_parse_sec, 0, &arg_runtime_watchdog },
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen { "Manager", "ShutdownWatchdogSec", config_parse_sec, 0, &arg_shutdown_watchdog },
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen { "Manager", "CapabilityBoundingSet", config_parse_bounding_set, 0, &arg_capability_bounding_set_drop },
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "Manager", "TimerSlackNSec", config_parse_nsec, 0, &arg_timer_slack_nsec },
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "Manager", "DefaultEnvironment", config_parse_environ, 0, &arg_default_environment },
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "Manager", "DefaultLimitCPU", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_CPU]},
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen { "Manager", "DefaultLimitFSIZE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_FSIZE]},
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen { "Manager", "DefaultLimitDATA", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_DATA]},
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen { "Manager", "DefaultLimitSTACK", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_STACK]},
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "Manager", "DefaultLimitCORE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_CORE]},
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "Manager", "DefaultLimitRSS", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_RSS]},
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "Manager", "DefaultLimitNOFILE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_NOFILE]},
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "Manager", "DefaultLimitAS", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_AS]},
3cb10d3a0b1b6a7c44f307f2abb5215104e16941Lennart Poettering { "Manager", "DefaultLimitNPROC", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_NPROC]},
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "Manager", "DefaultLimitMEMLOCK", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_MEMLOCK]},
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "Manager", "DefaultLimitLOCKS", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_LOCKS]},
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "Manager", "DefaultLimitSIGPENDING",config_parse_limit, 0, &arg_default_rlimit[RLIMIT_SIGPENDING]},
ad867662936a4c7ab2c7116d804c272338801231Lennart Poettering { "Manager", "DefaultLimitMSGQUEUE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_MSGQUEUE]},
ad867662936a4c7ab2c7116d804c272338801231Lennart Poettering { "Manager", "DefaultLimitNICE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_NICE]},
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "Manager", "DefaultLimitRTPRIO", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_RTPRIO]},
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "Manager", "DefaultLimitRTTIME", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_RTTIME]},
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen const char *fn;
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen fn = arg_running_as == SYSTEMD_SYSTEM ? PKGSYSCONFDIR "/system.conf" : PKGSYSCONFDIR "/user.conf";
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_warning("Failed to open configuration file '%s': %m", fn);
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen r = config_parse(NULL, fn, f, "Manager\0", config_item_table_lookup, (void*) items, false, false, NULL);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_warning("Failed to parse configuration file: %s", strerror(-r));
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic int parse_proc_cmdline(void) {
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error("Failed on cmdline argument %s: %s", word, strerror(-r));
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic int parse_argv(int argc, char *argv[]) {
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen { "log-level", required_argument, NULL, ARG_LOG_LEVEL },
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen { "log-target", required_argument, NULL, ARG_LOG_TARGET },
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen { "log-color", optional_argument, NULL, ARG_LOG_COLOR },
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "log-location", optional_argument, NULL, ARG_LOG_LOCATION },
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "unit", required_argument, NULL, ARG_UNIT },
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "version", no_argument, NULL, ARG_VERSION },
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "dump-configuration-items", no_argument, NULL, ARG_DUMP_CONFIGURATION_ITEMS },
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "dump-core", optional_argument, NULL, ARG_DUMP_CORE },
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen { "crash-shell", optional_argument, NULL, ARG_CRASH_SHELL },
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "confirm-spawn", optional_argument, NULL, ARG_CONFIRM_SPAWN },
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "show-status", optional_argument, NULL, ARG_SHOW_STATUS },
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "deserialize", required_argument, NULL, ARG_DESERIALIZE },
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "switched-root", no_argument, NULL, ARG_SWITCHED_ROOT },
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering { "default-standard-output", required_argument, NULL, ARG_DEFAULT_STD_OUTPUT, },
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart 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 if ((r = log_set_max_level_from_string(optarg)) < 0) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error("Failed to parse log level %s.", optarg);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if ((r = log_set_target_from_string(optarg)) < 0) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error("Failed to parse log target %s.", optarg);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if ((r = log_show_color_from_string(optarg)) < 0) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error("Failed to parse log color setting %s.", optarg);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if ((r = log_show_location_from_string(optarg)) < 0) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error("Failed to parse log location setting %s.", optarg);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if ((r = exec_output_from_string(optarg)) < 0) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error("Failed to parse default standard output setting %s.", optarg);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if ((r = exec_output_from_string(optarg)) < 0) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error("Failed to parse default standard error output setting %s.", optarg);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if ((r = set_default_unit(optarg)) < 0) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error("Failed to set default unit %s: %s", optarg, strerror(-r));
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering arg_action = ACTION_DUMP_CONFIGURATION_ITEMS;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_error("Failed to parse dump core boolean %s.", optarg);
e1c959948c0e31d6997bcdfbabfbd077784b2baeLennart Poettering log_error("Failed to parse crash shell boolean %s.", optarg);
e1c959948c0e31d6997bcdfbabfbd077784b2baeLennart Poettering log_error("Failed to parse confirm spawn boolean %s.", optarg);
case ARG_SHOW_STATUS:
arg_show_status = r;
case ARG_DESERIALIZE: {
int fd;
FILE *f;
if (r < 0 || fd < 0) {
return r < 0 ? r : -EINVAL;
return -errno;
if (serialization)
serialization = f;
case ARG_SWITCHED_ROOT:
arg_switched_root = true;
return -EINVAL;
return -EINVAL;
r = parse_proc_cmdline_word(*a);
static int help(void) {
" --log-target=TARGET Set log target (console, journal, syslog, kmsg, journal-or-kmsg, syslog-or-kmsg, null)\n"
static int version(void) {
assert(m);
r = manager_open_serialization(m, &f);
goto fail;
m->n_reloading ++;
bus_manager_send_reloading(m, true);
if (!fds) {
r = -ENOMEM;
goto fail;
goto fail;
goto fail;
goto fail;
goto fail;
*_f = f;
fail:
fclose(f);
return -errno;
if (!rl)
return log_oom();
static void test_mtab(void) {
free(p);
"Please make sure to replace this file by a symlink to avoid incorrect or misleading mount(8) output.");
static void test_usr(void) {
log_warning("/usr appears to be on its own filesytem and is not already mounted. This is not a supported setup. "
"Consult http://freedesktop.org/wiki/Software/systemd/separate-usr-is-broken for more information.");
static void test_cgroups(void) {
"Consult http://0pointer.de/blog/projects/cgroups-vs-cgroups.html for more information.");
static int initialize_join_controllers(void) {
if (!arg_join_controllers)
return -ENOMEM;
return -ENOMEM;
bool reexecute = false;
bool skip_setup = false;
bool loaded_policy = false;
bool arm_reboot_watchdog = false;
bool queue_default_job = false;
#ifdef HAVE_SYSV_COMPAT
skip_setup = true;
skip_setup = false;
umask(0);
log_open();
if (in_initrd())
if (!skip_setup) {
goto finish;
if (ima_setup() < 0)
goto finish;
if (smack_setup() < 0)
goto finish;
goto finish;
if (!skip_setup) {
if (hwclock_is_localtime() > 0) {
int min;
} else if (!in_initrd()) {
log_open();
log_open();
goto finish;
r = initialize_join_controllers();
goto finish;
goto finish;
if (parse_config_file() < 0)
goto finish;
if (parse_proc_cmdline() < 0)
goto finish;
goto finish;
geteuid() == 0) {
goto finish;
sd_booted() <= 0) {
goto finish;
running_in_chroot() > 0) {
goto finish;
goto finish;
goto finish;
goto finish;
goto finish;
goto finish;
log_close();
goto finish;
if (serialization)
setsid();
log_open();
goto finish;
if (virtualization)
if (in_initrd())
#ifdef HAVE_KMOD
kmod_setup();
test_mtab();
test_usr();
test_cgroups();
goto finish;
goto finish;
goto finish;
if (serialization) {
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_EXIT:
goto finish;
case MANAGER_RELOAD:
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_REBOOT:
case MANAGER_POWEROFF:
case MANAGER_HALT:
case MANAGER_KEXEC: {
goto finish;
manager_free(m);
for (j = 0; j < RLIMIT_NLIMITS; j++)
label_finish();
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)
clearenv();
if (serialization) {
if (fds) {
if (switch_root_init) {
if (serialization)
if (fds)
#ifdef HAVE_VALGRIND_VALGRIND_H
if (shutdown_verb) {
const char * command_line[] = {
char **env_block;
watchdog_close(false);
char_array_0(e);
watchdog_close(true);
freeze();
return retval;