main.c revision 664f88a7e653918942b858e3f387be2ebc9ebf03
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering This file is part of systemd.
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering Copyright 2010 Lennart Poettering
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering systemd is free software; you can redistribute it and/or modify it
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering under the terms of the GNU Lesser General Public License as published by
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering the Free Software Foundation; either version 2.1 of the License, or
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering (at your option) any later version.
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering systemd is distributed in the hope that it will be useful, but
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering Lesser General Public License for more details.
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering You should have received a copy of the GNU Lesser General Public License
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
d4205751d4643c272059a3728045929dd0e5e800Lennart Poetteringstatic ManagerRunningAs arg_running_as = _MANAGER_RUNNING_AS_INVALID;
d4205751d4643c272059a3728045929dd0e5e800Lennart Poetteringstatic bool arg_dump_core = true;
d4205751d4643c272059a3728045929dd0e5e800Lennart Poetteringstatic bool arg_crash_shell = false;
d4205751d4643c272059a3728045929dd0e5e800Lennart Poetteringstatic bool arg_confirm_spawn = false;
d4205751d4643c272059a3728045929dd0e5e800Lennart Poetteringstatic bool arg_show_status = true;
d4205751d4643c272059a3728045929dd0e5e800Lennart Poetteringstatic bool arg_sysv_console = true;
d4205751d4643c272059a3728045929dd0e5e800Lennart Poetteringstatic char **arg_default_controllers = NULL;
d4205751d4643c272059a3728045929dd0e5e800Lennart Poetteringstatic char ***arg_join_controllers = NULL;
d4205751d4643c272059a3728045929dd0e5e800Lennart Poetteringstatic ExecOutput arg_default_std_output = EXEC_OUTPUT_JOURNAL;
d4205751d4643c272059a3728045929dd0e5e800Lennart Poetteringstatic ExecOutput arg_default_std_error = EXEC_OUTPUT_INHERIT;
d4205751d4643c272059a3728045929dd0e5e800Lennart Poetteringstatic usec_t arg_shutdown_watchdog = 10 * USEC_PER_MINUTE;
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering log_error("Caught <%s>, not dumping core.", signal_to_string(sig));
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering /* We want to wait for the core process, hence let's enable SIGCHLD */
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering log_error("Caught <%s>, cannot fork for core dump: %s", signal_to_string(sig), strerror(errno));
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering else if (pid == 0) {
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering /* Enable default signal handler for core dump */
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering assert_se(sigaction(sig, &sa, NULL) == 0);
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering /* Don't limit the core dump size */
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering /* Just to be sure... */
c7332b0844e28d9b70c3c763b929f105c1056fe8Zbigniew Jędrzejewski-Szmek /* Raise the signal again */
c7332b0844e28d9b70c3c763b929f105c1056fe8Zbigniew Jędrzejewski-Szmek assert_not_reached("We shouldn't be here...");
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering /* Order things nicely. */
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering if ((r = wait_for_terminate(pid, &status)) < 0)
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering log_error("Caught <%s>, waitpid() failed: %s", signal_to_string(sig), strerror(-r));
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering log_error("Caught <%s>, core dump failed.", signal_to_string(sig));
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering log_error("Caught <%s>, dumped core as pid %lu.", signal_to_string(sig), (unsigned long) pid);
c7332b0844e28d9b70c3c763b929f105c1056fe8Zbigniew Jędrzejewski-Szmek log_info("Executing crash shell in 10s...");
c7332b0844e28d9b70c3c763b929f105c1056fe8Zbigniew Jędrzejewski-Szmek /* Let the kernel reap children for us */
c7332b0844e28d9b70c3c763b929f105c1056fe8Zbigniew Jędrzejewski-Szmek sa.sa_flags = SA_NOCLDSTOP|SA_NOCLDWAIT|SA_RESTART;
c7332b0844e28d9b70c3c763b929f105c1056fe8Zbigniew Jędrzejewski-Szmek assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
c7332b0844e28d9b70c3c763b929f105c1056fe8Zbigniew Jędrzejewski-Szmek log_error("Failed to fork off crash shell: %s", strerror(errno));
c7332b0844e28d9b70c3c763b929f105c1056fe8Zbigniew Jędrzejewski-Szmek else if (pid == 0) {
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering if ((fd = acquire_terminal("/dev/console", false, true, true)) < 0)
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering log_error("Failed to acquire terminal: %s", strerror(-fd));
c7332b0844e28d9b70c3c763b929f105c1056fe8Zbigniew Jędrzejewski-Szmek log_error("Failed to duplicate terminal fd: %s", strerror(-r));
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering log_error("execl() failed: %s", strerror(errno));
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering log_info("Successfully spawned crash shell as pid %lu.", (unsigned long) pid);
c7332b0844e28d9b70c3c763b929f105c1056fe8Zbigniew Jędrzejewski-Szmekstatic void install_crash_handler(void) {
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering sigaction_many(&sa, SIGNALS_CRASH_HANDLER, -1);
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering /* If we are init, we connect stdin/stdout/stderr to /dev/null
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering * and make sure we don't have a controlling tty. */
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering tty_fd = open_terminal("/dev/console", O_WRONLY|O_NOCTTY|O_CLOEXEC);
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering log_error("Failed to open /dev/console: %s", strerror(-tty_fd));
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering /* We don't want to force text mode.
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering * plymouth may be showing pictures already from initrd. */
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering log_error("Failed to reset /dev/console: %s", strerror(-r));
d4205751d4643c272059a3728045929dd0e5e800Lennart Poetteringstatic int set_default_unit(const char *u) {
c7332b0844e28d9b70c3c763b929f105c1056fe8Zbigniew Jędrzejewski-Szmekstatic int parse_proc_cmdline_word(const char *word) {
c7332b0844e28d9b70c3c763b929f105c1056fe8Zbigniew Jędrzejewski-Szmek static const char * const rlmap[] = {
c7332b0844e28d9b70c3c763b929f105c1056fe8Zbigniew Jędrzejewski-Szmek if (startswith(word, "systemd.unit="))
c7332b0844e28d9b70c3c763b929f105c1056fe8Zbigniew Jędrzejewski-Szmek return set_default_unit(word + 13);
c7332b0844e28d9b70c3c763b929f105c1056fe8Zbigniew Jędrzejewski-Szmek else if (startswith(word, "systemd.log_target=")) {
c7332b0844e28d9b70c3c763b929f105c1056fe8Zbigniew Jędrzejewski-Szmek if (log_set_target_from_string(word + 19) < 0)
c7332b0844e28d9b70c3c763b929f105c1056fe8Zbigniew Jędrzejewski-Szmek log_warning("Failed to parse log target %s. Ignoring.", word + 19);
c7332b0844e28d9b70c3c763b929f105c1056fe8Zbigniew Jędrzejewski-Szmek } else if (startswith(word, "systemd.log_level=")) {
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering if (log_set_max_level_from_string(word + 18) < 0)
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering log_warning("Failed to parse log level %s. Ignoring.", word + 18);
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering } else if (startswith(word, "systemd.log_color=")) {
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering if (log_show_color_from_string(word + 18) < 0)
18cd5fe99f70a55a2d6f2303d6ee0624942695b1Zbigniew Jędrzejewski-Szmek log_warning("Failed to parse log color setting %s. Ignoring.", word + 18);
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering } else if (startswith(word, "systemd.log_location=")) {
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering if (log_show_location_from_string(word + 21) < 0)
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering log_warning("Failed to parse log location setting %s. Ignoring.", word + 21);
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering } else if (startswith(word, "systemd.dump_core=")) {
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering log_warning("Failed to parse dump core switch %s. Ignoring.", word + 18);
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering } else if (startswith(word, "systemd.crash_shell=")) {
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering log_warning("Failed to parse crash shell switch %s. Ignoring.", word + 20);
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering } else if (startswith(word, "systemd.confirm_spawn=")) {
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering log_warning("Failed to parse confirm spawn switch %s. Ignoring.", word + 22);
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering } else if (startswith(word, "systemd.crash_chvt=")) {
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering log_warning("Failed to parse crash chvt switch %s. Ignoring.", word + 19);
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering } else if (startswith(word, "systemd.show_status=")) {
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering log_warning("Failed to parse show status switch %s. Ignoring.", word + 20);
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek } else if (startswith(word, "systemd.default_standard_output=")) {
7fd1b19bc9e9f5574f2877936b8ac267c7706947Harald Hoyer if ((r = exec_output_from_string(word + 32)) < 0)
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek log_warning("Failed to parse default standard output switch %s. Ignoring.", word + 32);
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek } else if (startswith(word, "systemd.default_standard_error=")) {
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek if ((r = exec_output_from_string(word + 31)) < 0)
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek log_warning("Failed to parse default standard error switch %s. Ignoring.", word + 31);
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek } else if (startswith(word, "systemd.setenv=")) {
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek log_warning("unsetenv failed %s. Ignoring.", strerror(errno));
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek log_warning("setenv failed %s. Ignoring.", strerror(errno));
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek } else if (startswith(word, "systemd.sysv_console=")) {
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek if ((r = parse_boolean(word + 21)) < 0)
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek log_warning("Failed to parse SysV console switch %s. Ignoring.", word + 20);
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek } else if (startswith(word, "systemd.")) {
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek log_warning("Unknown kernel switch %s. Ignoring.", word);
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek log_info("Supported kernel switches:\n"
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek "systemd.unit=UNIT Default unit to start\n"
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek "systemd.dump_core=0|1 Dump core on crash\n"
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek "systemd.crash_shell=0|1 Run shell on crash\n"
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek "systemd.crash_chvt=N Change to VT #N on crash\n"
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek "systemd.confirm_spawn=0|1 Confirm every process spawn\n"
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek "systemd.show_status=0|1 Show status updates on the console during bootup\n"
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek "systemd.sysv_console=0|1 Connect output of SysV scripts to console\n"
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek "systemd.log_target=console|kmsg|journal|journal-or-kmsg|syslog|syslog-or-kmsg|null\n"
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek "systemd.log_level=LEVEL Log level\n"
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek "systemd.log_color=0|1 Highlight important log messages\n"
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek "systemd.log_location=0|1 Include code location in log messages\n"
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek "systemd.default_standard_output=null|tty|syslog|syslog+console|kmsg|kmsg+console|journal|journal+console\n"
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek " Set default log output for services\n"
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek "systemd.default_standard_error=null|tty|syslog|syslog+console|kmsg|kmsg+console|journal|journal+console\n"
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek " Set default log error output for services\n");
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek } else if (streq(word, "quiet")) {
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering /* SysV compatibility */
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering for (i = 0; i < ELEMENTSOF(rlmap); i += 2)
83f6936a018b08880670838756e0f4e9ea98b4a7Lennart Poettering FOREACH_WORD_QUOTED(w, l, rvalue, state) {
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering if (!(t = strndup(w, l)))
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering log_error("[%s:%u] Failed to parse CPU affinity: %s", filename, line, rvalue);
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering CPU_SET_S(cpu, CPU_ALLOC_SIZE(ncpus), c);
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering if (sched_setaffinity(0, CPU_ALLOC_SIZE(ncpus), c) < 0)
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering log_warning("Failed to set CPU affinity: %m");
d4205751d4643c272059a3728045929dd0e5e800Lennart Poetteringstatic void strv_free_free(char ***l) {
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering for (i = l; *i; i++)
d4205751d4643c272059a3728045929dd0e5e800Lennart Poetteringstatic void free_join_controllers(void) {
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering unsigned n = 0;
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering FOREACH_WORD_QUOTED(w, length, rvalue, state) {
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering for (a = arg_join_controllers; *a; a++) {
d4205751d4643c272059a3728045929dd0e5e800Lennart Poetteringstatic int parse_config_file(void) {
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering { "Manager", "LogLevel", config_parse_level2, 0, NULL },
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering { "Manager", "LogTarget", config_parse_target, 0, NULL },
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering { "Manager", "LogColor", config_parse_color, 0, NULL },
54b7254c1fa629937f92fd6fa34bdf127b696a00Zbigniew Jędrzejewski-Szmek { "Manager", "LogLocation", config_parse_location, 0, NULL },
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering { "Manager", "DumpCore", config_parse_bool, 0, &arg_dump_core },
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering { "Manager", "CrashShell", config_parse_bool, 0, &arg_crash_shell },
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering { "Manager", "ShowStatus", config_parse_bool, 0, &arg_show_status },
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering { "Manager", "SysVConsole", config_parse_bool, 0, &arg_sysv_console },
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering { "Manager", "CrashChVT", config_parse_int, 0, &arg_crash_chvt },
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering { "Manager", "CPUAffinity", config_parse_cpu_affinity2, 0, NULL },
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering { "Manager", "DefaultControllers", config_parse_strv, 0, &arg_default_controllers },
54b7254c1fa629937f92fd6fa34bdf127b696a00Zbigniew Jędrzejewski-Szmek { "Manager", "DefaultStandardOutput", config_parse_output, 0, &arg_default_std_output },
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek { "Manager", "DefaultStandardError", config_parse_output, 0, &arg_default_std_error },
54b7254c1fa629937f92fd6fa34bdf127b696a00Zbigniew Jędrzejewski-Szmek { "Manager", "JoinControllers", config_parse_join_controllers, 0, &arg_join_controllers },
54b7254c1fa629937f92fd6fa34bdf127b696a00Zbigniew Jędrzejewski-Szmek { "Manager", "RuntimeWatchdogSec", config_parse_usec, 0, &arg_runtime_watchdog },
54b7254c1fa629937f92fd6fa34bdf127b696a00Zbigniew Jędrzejewski-Szmek { "Manager", "ShutdownWatchdogSec", config_parse_usec, 0, &arg_shutdown_watchdog },
54b7254c1fa629937f92fd6fa34bdf127b696a00Zbigniew Jędrzejewski-Szmek fn = arg_running_as == MANAGER_SYSTEM ? SYSTEM_CONFIG_FILE : USER_CONFIG_FILE;
54b7254c1fa629937f92fd6fa34bdf127b696a00Zbigniew Jędrzejewski-Szmek log_warning("Failed to open configuration file '%s': %m", fn);
54b7254c1fa629937f92fd6fa34bdf127b696a00Zbigniew Jędrzejewski-Szmek r = config_parse(fn, f, "Manager\0", config_item_table_lookup, (void*) items, false, NULL);
464264ac5a35b655065c5d95b8d8ffbbc7ff3bcfLukas Nykryn log_warning("Failed to parse configuration file: %s", strerror(-r));
54b7254c1fa629937f92fd6fa34bdf127b696a00Zbigniew Jędrzejewski-Szmekstatic 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_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.");
r = -errno;
goto fail;
r = -errno;
goto fail;
fail:
bool reexecute = false;
bool is_reexec = false;
bool loaded_policy = false;
bool arm_reboot_watchdog = false;
#ifdef HAVE_SYSV_COMPAT
is_reexec = true;
log_show_location(false);
if (!is_reexec) {
goto finish;
if (ima_setup() < 0)
goto finish;
log_open();
goto finish;
if (!is_reexec)
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
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;
watchdog_close(true);
if (switch_root)
if (!switch_root_init) {
if (serialization)
if (fds)
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;