main.c revision 2660882b52ae1a5d97a2344633a999d88a3cd45b
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering This file is part of systemd.
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering Copyright 2010 Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering systemd is free software; you can redistribute it and/or modify it
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering under the terms of the GNU Lesser General Public License as published by
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering the Free Software Foundation; either version 2.1 of the License, or
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering (at your option) any later version.
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering systemd is distributed in the hope that it will be useful, but
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering Lesser General Public License for more details.
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering You should have received a copy of the GNU Lesser General Public License
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poetteringstatic ManagerRunningAs arg_running_as = _MANAGER_RUNNING_AS_INVALID;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poetteringstatic bool arg_dump_core = true;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poetteringstatic bool arg_crash_shell = false;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poetteringstatic bool arg_confirm_spawn = false;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poetteringstatic bool arg_show_status = true;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poetteringstatic bool arg_sysv_console = true;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poetteringstatic char **arg_default_controllers = NULL;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poetteringstatic char ***arg_join_controllers = NULL;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poetteringstatic ExecOutput arg_default_std_output = EXEC_OUTPUT_JOURNAL;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poetteringstatic ExecOutput arg_default_std_error = EXEC_OUTPUT_INHERIT;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poetteringstatic usec_t arg_shutdown_watchdog = 10 * USEC_PER_MINUTE;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering log_error("Caught <%s>, not dumping core.", signal_to_string(sig));
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering /* We want to wait for the core process, hence let's enable SIGCHLD */
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering log_error("Caught <%s>, cannot fork for core dump: %s", signal_to_string(sig), strerror(errno));
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering else if (pid == 0) {
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering /* Enable default signal handler for core dump */
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering assert_se(sigaction(sig, &sa, NULL) == 0);
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering /* Don't limit the core dump size */
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering /* Just to be sure... */
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering /* Raise the signal again */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering assert_not_reached("We shouldn't be here...");
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering /* Order things nicely. */
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering if ((r = wait_for_terminate(pid, &status)) < 0)
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering log_error("Caught <%s>, waitpid() failed: %s", signal_to_string(sig), strerror(-r));
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering log_error("Caught <%s>, core dump failed.", signal_to_string(sig));
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering log_error("Caught <%s>, dumped core as pid %lu.", signal_to_string(sig), (unsigned long) pid);
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering log_info("Executing crash shell in 10s...");
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering /* Let the kernel reap children for us */
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering sa.sa_flags = SA_NOCLDSTOP|SA_NOCLDWAIT|SA_RESTART;
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering log_error("Failed to fork off crash shell: %s", strerror(errno));
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering else if (pid == 0) {
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering if ((fd = acquire_terminal("/dev/console", false, true, true)) < 0)
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering log_error("Failed to acquire terminal: %s", strerror(-fd));
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering log_error("Failed to duplicate terminal fd: %s", strerror(-r));
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering log_error("execl() failed: %s", strerror(errno));
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering log_info("Successfully spawned crash shell as pid %lu.", (unsigned long) pid);
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart 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. */
8bf52d3d17d364438191077d0750b8b80b5dc53aLennart Poettering tty_fd = open_terminal("/dev/console", O_WRONLY|O_NOCTTY|O_CLOEXEC);
8bf52d3d17d364438191077d0750b8b80b5dc53aLennart 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 Poettering if (!(c = strdup(u)))
9c92ce6d67f88beb31dd6555d12ae3f632218a39Lennart Poetteringstatic int parse_proc_cmdline_word(const char *word) {
9c92ce6d67f88beb31dd6555d12ae3f632218a39Lennart Poettering static const char * const rlmap[] = {
9de3e3294065e8697ff10130b53f274319cdcf6fZbigniew Jędrzejewski-Szmek "emergency", SPECIAL_EMERGENCY_TARGET,
9de3e3294065e8697ff10130b53f274319cdcf6fZbigniew Jędrzejewski-Szmek "single", SPECIAL_RESCUE_TARGET,
9de3e3294065e8697ff10130b53f274319cdcf6fZbigniew Jędrzejewski-Szmek if (startswith(word, "systemd.unit="))
7e8e0422aeb16f2a09a40546c61df753d10029b6Lennart Poettering else if (startswith(word, "systemd.log_target=")) {
9de3e3294065e8697ff10130b53f274319cdcf6fZbigniew Jędrzejewski-Szmek if (log_set_target_from_string(word + 19) < 0)
9c92ce6d67f88beb31dd6555d12ae3f632218a39Lennart Poettering log_warning("Failed to parse log target %s. Ignoring.", word + 19);
946c70944ebdf428ffeb9991a7449edbd4011461Zbigniew Jędrzejewski-Szmek } else if (startswith(word, "systemd.log_level=")) {
9c92ce6d67f88beb31dd6555d12ae3f632218a39Lennart Poettering if (log_set_max_level_from_string(word + 18) < 0)
42cc2eebb01056beb7acd3ecfe8e533558237f84Lennart Poettering log_warning("Failed to parse log level %s. Ignoring.", word + 18);
42cc2eebb01056beb7acd3ecfe8e533558237f84Lennart Poettering } else if (startswith(word, "systemd.log_color=")) {
0dae31d468b1a0e22d98921f7b0dbd92fd217167Zbigniew Jędrzejewski-Szmek if (log_show_color_from_string(word + 18) < 0)
9de3e3294065e8697ff10130b53f274319cdcf6fZbigniew Jędrzejewski-Szmek log_warning("Failed to parse log color setting %s. Ignoring.", word + 18);
9de3e3294065e8697ff10130b53f274319cdcf6fZbigniew Jędrzejewski-Szmek } else if (startswith(word, "systemd.log_location=")) {
9de3e3294065e8697ff10130b53f274319cdcf6fZbigniew Jędrzejewski-Szmek if (log_show_location_from_string(word + 21) < 0)
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering log_warning("Failed to parse log location setting %s. Ignoring.", word + 21);
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering } else if (startswith(word, "systemd.dump_core=")) {
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering log_warning("Failed to parse dump core switch %s. Ignoring.", word + 18);
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering } else if (startswith(word, "systemd.crash_shell=")) {
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering log_warning("Failed to parse crash shell switch %s. Ignoring.", word + 20);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering } else if (startswith(word, "systemd.confirm_spawn=")) {
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering log_warning("Failed to parse confirm spawn switch %s. Ignoring.", word + 22);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering } else if (startswith(word, "systemd.crash_chvt=")) {
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering log_warning("Failed to parse crash chvt switch %s. Ignoring.", word + 19);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering } else if (startswith(word, "systemd.show_status=")) {
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering log_warning("Failed to parse show status switch %s. Ignoring.", word + 20);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering } else if (startswith(word, "systemd.default_standard_output=")) {
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if ((r = exec_output_from_string(word + 32)) < 0)
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering log_warning("Failed to parse default standard output switch %s. Ignoring.", word + 32);
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering } else if (startswith(word, "systemd.default_standard_error=")) {
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering if ((r = exec_output_from_string(word + 31)) < 0)
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering log_warning("Failed to parse default standard error switch %s. Ignoring.", word + 31);
fd0b4602f6332c3f1660eb208c8f5c719709a009Lennart Poettering } else if (startswith(word, "systemd.setenv=")) {
9c92ce6d67f88beb31dd6555d12ae3f632218a39Lennart Poettering log_warning("unsetenv failed %s. Ignoring.", strerror(errno));
8ac4e9e1e54397f6d1745c2a7a806132418c7da2Lennart Poettering log_warning("setenv failed %s. Ignoring.", strerror(errno));
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering } else if (startswith(word, "systemd.sysv_console=")) {
9de3e3294065e8697ff10130b53f274319cdcf6fZbigniew Jędrzejewski-Szmek if ((r = parse_boolean(word + 21)) < 0)
2e276efc7b0398a3086629a52970bdd4ab7252f9Zbigniew Jędrzejewski-Szmek log_warning("Failed to parse SysV console switch %s. Ignoring.", word + 20);
2e276efc7b0398a3086629a52970bdd4ab7252f9Zbigniew Jędrzejewski-Szmek } else if (startswith(word, "systemd.")) {
2e276efc7b0398a3086629a52970bdd4ab7252f9Zbigniew Jędrzejewski-Szmek log_warning("Unknown kernel switch %s. Ignoring.", word);
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering "systemd.unit=UNIT Default unit to start\n"
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering "systemd.dump_core=0|1 Dump core on crash\n"
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering "systemd.crash_shell=0|1 Run shell on crash\n"
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering "systemd.crash_chvt=N Change to VT #N on crash\n"
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering "systemd.confirm_spawn=0|1 Confirm every process spawn\n"
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering "systemd.show_status=0|1 Show status updates on the console during bootup\n"
7e8e0422aeb16f2a09a40546c61df753d10029b6Lennart Poettering "systemd.sysv_console=0|1 Connect output of SysV scripts to console\n"
7e8e0422aeb16f2a09a40546c61df753d10029b6Lennart Poettering "systemd.log_target=console|kmsg|journal|journal-or-kmsg|syslog|syslog-or-kmsg|null\n"
7e8e0422aeb16f2a09a40546c61df753d10029b6Lennart Poettering " Log target\n"
7e8e0422aeb16f2a09a40546c61df753d10029b6Lennart Poettering "systemd.log_level=LEVEL Log level\n"
7e8e0422aeb16f2a09a40546c61df753d10029b6Lennart Poettering "systemd.log_color=0|1 Highlight important log messages\n"
7e8e0422aeb16f2a09a40546c61df753d10029b6Lennart Poettering "systemd.log_location=0|1 Include code location in log messages\n"
7e8e0422aeb16f2a09a40546c61df753d10029b6Lennart Poettering "systemd.default_standard_output=null|tty|syslog|syslog+console|kmsg|kmsg+console|journal|journal+console\n"
7e8e0422aeb16f2a09a40546c61df753d10029b6Lennart Poettering " Set default log output for services\n"
7e8e0422aeb16f2a09a40546c61df753d10029b6Lennart Poettering "systemd.default_standard_error=null|tty|syslog|syslog+console|kmsg|kmsg+console|journal|journal+console\n"
7e8e0422aeb16f2a09a40546c61df753d10029b6Lennart Poettering " Set default log error output for services\n");
946c70944ebdf428ffeb9991a7449edbd4011461Zbigniew Jędrzejewski-Szmek } else if (streq(word, "quiet")) {
0dae31d468b1a0e22d98921f7b0dbd92fd217167Zbigniew Jędrzejewski-Szmek /* SysV compatibility */
0dae31d468b1a0e22d98921f7b0dbd92fd217167Zbigniew Jędrzejewski-Szmek for (i = 0; i < ELEMENTSOF(rlmap); i += 2)
0dae31d468b1a0e22d98921f7b0dbd92fd217167Zbigniew Jędrzejewski-Szmek return set_default_unit(rlmap[i+1]);
0dae31d468b1a0e22d98921f7b0dbd92fd217167Zbigniew Jędrzejewski-Szmek log_set_max_level_from_string(rvalue);
0dae31d468b1a0e22d98921f7b0dbd92fd217167Zbigniew Jędrzejewski-Szmek log_set_target_from_string(rvalue);
2e276efc7b0398a3086629a52970bdd4ab7252f9Zbigniew Jędrzejewski-Szmek FOREACH_WORD_QUOTED(w, l, rvalue, state) {
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering if (!(t = strndup(w, l)))
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering log_error("[%s:%u] Failed to parse CPU affinity: %s", filename, line, rvalue);
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering CPU_SET_S(cpu, CPU_ALLOC_SIZE(ncpus), c);
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering if (sched_setaffinity(0, CPU_ALLOC_SIZE(ncpus), c) < 0)
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering log_warning("Failed to set CPU affinity: %m");
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poetteringstatic void strv_free_free(char ***l) {
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering for (i = l; *i; i++)
946c70944ebdf428ffeb9991a7449edbd4011461Zbigniew Jędrzejewski-Szmekstatic void free_join_controllers(void) {
946c70944ebdf428ffeb9991a7449edbd4011461Zbigniew Jędrzejewski-Szmek strv_free_free(arg_join_controllers);
0dae31d468b1a0e22d98921f7b0dbd92fd217167Zbigniew Jędrzejewski-Szmekstatic int config_parse_join_controllers(
42cc2eebb01056beb7acd3ecfe8e533558237f84Lennart Poettering FOREACH_WORD_QUOTED(w, length, rvalue, state) {
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering for (a = arg_join_controllers; *a; a++) {
9de3e3294065e8697ff10130b53f274319cdcf6fZbigniew Jędrzejewski-Szmekstatic int parse_config_file(void) {
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering { "Manager", "LogLevel", config_parse_level2, 0, NULL },
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering { "Manager", "LogTarget", config_parse_target, 0, NULL },
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering { "Manager", "LogColor", config_parse_color, 0, NULL },
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering { "Manager", "LogLocation", config_parse_location, 0, NULL },
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering { "Manager", "DumpCore", config_parse_bool, 0, &arg_dump_core },
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering { "Manager", "CrashShell", config_parse_bool, 0, &arg_crash_shell },
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering { "Manager", "ShowStatus", config_parse_bool, 0, &arg_show_status },
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering { "Manager", "SysVConsole", config_parse_bool, 0, &arg_sysv_console },
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering { "Manager", "CrashChVT", config_parse_int, 0, &arg_crash_chvt },
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering { "Manager", "CPUAffinity", config_parse_cpu_affinity2, 0, NULL },
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering { "Manager", "DefaultControllers", config_parse_strv, 0, &arg_default_controllers },
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering { "Manager", "DefaultStandardOutput", config_parse_output, 0, &arg_default_std_output },
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering { "Manager", "DefaultStandardError", config_parse_output, 0, &arg_default_std_error },
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering { "Manager", "JoinControllers", config_parse_join_controllers, 0, &arg_join_controllers },
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering { "Manager", "RuntimeWatchdogSec", config_parse_usec, 0, &arg_runtime_watchdog },
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering { "Manager", "ShutdownWatchdogSec", config_parse_usec, 0, &arg_shutdown_watchdog },
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering fn = arg_running_as == MANAGER_SYSTEM ? SYSTEM_CONFIG_FILE : USER_CONFIG_FILE;
fclose(f);
static int parse_proc_cmdline(void) {
size_t l;
char *word;
r = -ENOMEM;
goto finish;
goto finish;
#ifdef HAVE_SYSV_COMPAT
opterr = 0;
case ARG_LOG_LEVEL:
case ARG_LOG_TARGET:
case ARG_LOG_COLOR:
if (optarg) {
log_show_color(true);
case ARG_LOG_LOCATION:
if (optarg) {
log_show_location(true);
case ARG_DEFAULT_STD_OUTPUT:
case ARG_DEFAULT_STD_ERROR:
case ARG_UNIT:
case ARG_SYSTEM:
case ARG_USER:
case ARG_TEST:
case ARG_DUMP_CORE:
arg_dump_core = r;
case ARG_CRASH_SHELL:
arg_crash_shell = r;
case ARG_CONFIRM_SPAWN:
arg_confirm_spawn = r;
case ARG_SHOW_STATUS:
arg_show_status = r;
#ifdef HAVE_SYSV_COMPAT
case ARG_SYSV_CONSOLE:
arg_sysv_console = r;
case ARG_DESERIALIZE: {
int fd;
FILE *f;
if (serialization)
serialization = f;
case ARG_SWITCHED_ROOT:
case ARG_INTROSPECT: {
const char * const * i = NULL;
if (optarg)
if (!i[0] && optarg)
return -EINVAL;
return -EINVAL;
if ((r = parse_proc_cmdline_word(*a)) < 0)
static int help(void) {
#ifdef HAVE_SYSV_COMPAT
" --log-target=TARGET Set log target (console, journal, syslog, kmsg, journal-or-kmsg, syslog-or-kmsg, null)\n"
assert(m);
m->n_reloading ++;
if ((r = manager_open_serialization(m, &f)) < 0) {
goto fail;
r = -ENOMEM;
goto fail;
goto fail;
goto fail;
goto fail;
goto fail;
*_f = f;
fail:
fclose(f);
assert(t);
return NULL;
return NULL;
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.");
bool reexecute = false;
bool skip_setup = false;
bool loaded_policy = false;
bool arm_reboot_watchdog = false;
#ifdef HAVE_SYSV_COMPAT
skip_setup = true;
skip_setup = false;
log_show_location(false);
if (in_initrd()) {
if (rd_timestamp) {
if (!skip_setup) {
goto finish;
if (ima_setup() < 0)
goto finish;
log_open();
goto finish;
if (!skip_setup)
if (hwclock_is_localtime() > 0) {
int min;
log_open();
goto finish;
if (!arg_join_controllers)
goto finish;
if (!arg_join_controllers[0])
goto finish;
goto finish;
if (parse_config_file() < 0)
goto finish;
if (parse_proc_cmdline() < 0)
goto finish;
goto finish;
goto finish;
running_in_chroot() > 0) {
goto finish;
goto finish;
goto finish;
goto finish;
log_close();
if (serialization) {
goto finish;
#ifdef HAVE_SPLIT_USR
if (!in_initrd())
setsid();
umask(0);
log_open();
goto finish;
PACKAGE_STRING " running in %s mode. (" SYSTEMD_FEATURES "; " DISTRIBUTION ")", manager_running_as_to_string(arg_running_as));
locale_setup();
kmod_setup();
test_mtab();
test_usr();
test_cgroups();
goto finish;
#ifdef HAVE_SYSV_COMPAT
if (fds) {
if (serialization) {
goto finish;
goto finish;
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);
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 (serialization) {
if (fds) {
if (switch_root_init) {
if (serialization)
if (fds)
if (shutdown_verb) {
const char * command_line[] = {
char **env_block;
watchdog_close(false);
char_array_0(e);
watchdog_close(true);
freeze();
return retval;