main.c revision 97b11eedff9d2e17101ad453caf9e48b73246719
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering This file is part of systemd.
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering Copyright 2010 Lennart Poettering
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering systemd is free software; you can redistribute it and/or modify it
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering under the terms of the GNU Lesser General Public License as published by
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering the Free Software Foundation; either version 2.1 of the License, or
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering (at your option) any later version.
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering systemd is distributed in the hope that it will be useful, but
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering Lesser General Public License for more details.
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering You should have received a copy of the GNU Lesser General Public License
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poetteringstatic ManagerRunningAs arg_running_as = _MANAGER_RUNNING_AS_INVALID;
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poetteringstatic bool arg_dump_core = true;
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poetteringstatic bool arg_crash_shell = false;
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poetteringstatic bool arg_confirm_spawn = false;
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poetteringstatic ShowStatus arg_show_status = _SHOW_STATUS_UNSET;
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poetteringstatic bool arg_switched_root = false;
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poetteringstatic char ***arg_join_controllers = NULL;
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poetteringstatic ExecOutput arg_default_std_output = EXEC_OUTPUT_JOURNAL;
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poetteringstatic ExecOutput arg_default_std_error = EXEC_OUTPUT_INHERIT;
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poetteringstatic usec_t arg_default_restart_usec = DEFAULT_RESTART_USEC;
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poetteringstatic usec_t arg_default_timeout_start_usec = DEFAULT_TIMEOUT_USEC;
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poetteringstatic usec_t arg_default_timeout_stop_usec = DEFAULT_TIMEOUT_USEC;
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poetteringstatic usec_t arg_default_start_limit_interval = DEFAULT_START_LIMIT_INTERVAL;
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poetteringstatic unsigned arg_default_start_limit_burst = DEFAULT_START_LIMIT_BURST;
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poetteringstatic usec_t arg_shutdown_watchdog = 10 * USEC_PER_MINUTE;
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poetteringstatic char **arg_default_environment = NULL;
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poetteringstatic struct rlimit *arg_default_rlimit[_RLIMIT_MAX] = {};
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poetteringstatic uint64_t arg_capability_bounding_set_drop = 0;
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poetteringstatic nsec_t arg_timer_slack_nsec = NSEC_INFINITY;
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poetteringstatic usec_t arg_default_timer_accuracy_usec = 1 * USEC_PER_MINUTE;
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poetteringstatic bool arg_default_cpu_accounting = false;
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poetteringstatic bool arg_default_blockio_accounting = false;
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poetteringstatic bool arg_default_memory_accounting = false;
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poetteringstatic void pager_open_if_enabled(void) {
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering /* Pass this on immediately, if this is not PID 1 */
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering log_emergency("Caught <%s>, not dumping core.", signal_to_string(sig));
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering /* We want to wait for the core process, hence let's enable SIGCHLD */
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering log_emergency_errno(errno, "Caught <%s>, cannot fork for core dump: %m", signal_to_string(sig));
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering else if (pid == 0) {
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering /* Enable default signal handler for core dump */
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering /* Don't limit the core dump size */
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering /* Just to be sure... */
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering /* Raise the signal again */
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering kill(pid, sig); /* raise() would kill the parent */
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering assert_not_reached("We shouldn't be here...");
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering /* Order things nicely. */
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering log_emergency_errno(r, "Caught <%s>, waitpid() failed: %m", signal_to_string(sig));
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering log_emergency("Caught <%s>, core dump failed (child "PID_FMT", code=%s, status=%i/%s).",
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering pid, sigchld_code_to_string(status.si_code),
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering ? exit_status_to_string(status.si_status, EXIT_STATUS_FULL)
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering log_emergency("Caught <%s>, dumped core as pid "PID_FMT".", signal_to_string(sig), pid);
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering .sa_flags = SA_NOCLDSTOP|SA_NOCLDWAIT|SA_RESTART,
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering log_info("Executing crash shell in 10s...");
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering /* Let the kernel reap children for us */
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering log_emergency_errno(errno, "Failed to fork off crash shell: %m");
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering else if (pid == 0) {
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering execle("/bin/sh", "/bin/sh", NULL, environ);
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering log_emergency_errno(errno, "execle() failed: %m");
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering log_info("Successfully spawned crash shell as PID "PID_FMT".", pid);
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poetteringstatic void install_crash_handler(void) {
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering .sa_flags = SA_NODEFER, /* So that we can raise the signal again from the signal handler */
5809560d858f45351856d6fe786a8117306dd0f2Lennart Poettering /* We ignore the return value here, since, we don't mind if we
5809560d858f45351856d6fe786a8117306dd0f2Lennart Poettering * cannot set up a crash handler */
5809560d858f45351856d6fe786a8117306dd0f2Lennart Poettering r = sigaction_many(&sa, SIGNALS_CRASH_HANDLER, -1);
5809560d858f45351856d6fe786a8117306dd0f2Lennart Poettering log_debug_errno(r, "I had trouble setting up the crash handler, ignoring: %m");
5809560d858f45351856d6fe786a8117306dd0f2Lennart Poetteringstatic int console_setup(void) {
5809560d858f45351856d6fe786a8117306dd0f2Lennart Poettering tty_fd = open_terminal("/dev/console", O_WRONLY|O_NOCTTY|O_CLOEXEC);
5809560d858f45351856d6fe786a8117306dd0f2Lennart Poettering return log_error_errno(tty_fd, "Failed to open /dev/console: %m");
5809560d858f45351856d6fe786a8117306dd0f2Lennart Poettering /* We don't want to force text mode. plymouth may be showing
5809560d858f45351856d6fe786a8117306dd0f2Lennart Poettering * pictures already from initrd. */
5809560d858f45351856d6fe786a8117306dd0f2Lennart Poettering return log_error_errno(r, "Failed to reset /dev/console: %m");
5809560d858f45351856d6fe786a8117306dd0f2Lennart Poetteringstatic int set_default_unit(const char *u) {
5809560d858f45351856d6fe786a8117306dd0f2Lennart Poetteringstatic int parse_proc_cmdline_item(const char *key, const char *value) {
5809560d858f45351856d6fe786a8117306dd0f2Lennart Poettering static const char * const rlmap[] = {
5809560d858f45351856d6fe786a8117306dd0f2Lennart Poettering if (streq(key, "systemd.unit") && value) {
5809560d858f45351856d6fe786a8117306dd0f2Lennart Poettering } else if (streq(key, "rd.systemd.unit") && value) {
5809560d858f45351856d6fe786a8117306dd0f2Lennart Poettering } else if (streq(key, "systemd.dump_core") && value) {
5809560d858f45351856d6fe786a8117306dd0f2Lennart Poettering log_warning("Failed to parse dump core switch %s. Ignoring.", value);
5809560d858f45351856d6fe786a8117306dd0f2Lennart Poettering } else if (streq(key, "systemd.crash_shell") && value) {
5809560d858f45351856d6fe786a8117306dd0f2Lennart Poettering log_warning("Failed to parse crash shell switch %s. Ignoring.", value);
5809560d858f45351856d6fe786a8117306dd0f2Lennart Poettering } else if (streq(key, "systemd.crash_chvt") && value) {
5809560d858f45351856d6fe786a8117306dd0f2Lennart Poettering log_warning("Failed to parse crash chvt switch %s. Ignoring.", value);
5809560d858f45351856d6fe786a8117306dd0f2Lennart Poettering } else if (streq(key, "systemd.confirm_spawn") && value) {
5809560d858f45351856d6fe786a8117306dd0f2Lennart Poettering log_warning("Failed to parse confirm spawn switch %s. Ignoring.", value);
5809560d858f45351856d6fe786a8117306dd0f2Lennart Poettering } else if (streq(key, "systemd.show_status") && value) {
5809560d858f45351856d6fe786a8117306dd0f2Lennart Poettering r = parse_show_status(value, &arg_show_status);
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering log_warning("Failed to parse show status switch %s. Ignoring.", value);
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering } else if (streq(key, "systemd.default_standard_output") && value) {
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering log_warning("Failed to parse default standard output switch %s. Ignoring.", value);
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering } else if (streq(key, "systemd.default_standard_error") && value) {
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering log_warning("Failed to parse default standard error switch %s. Ignoring.", value);
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering } else if (streq(key, "systemd.setenv") && value) {
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering env = strv_env_set(arg_default_environment, value);
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering log_warning_errno(ENOMEM, "Setting environment variable '%s' failed, ignoring: %m", value);
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering log_warning("Environment variable name '%s' is not valid. Ignoring.", value);
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering } else if (streq(key, "quiet") && !value) {
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering if (arg_show_status == _SHOW_STATUS_UNSET)
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering } else if (streq(key, "debug") && !value) {
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering /* Note that log_parse_environment() handles 'debug'
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering * too, and sets the log level to LOG_DEBUG. */
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering /* SysV compatibility */
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering for (i = 0; i < ELEMENTSOF(rlmap); i += 2)
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering#define DEFINE_SETTER(name, func, descr) \
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering const char *lvalue, \
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering const char *rvalue, \
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering log_syntax(unit, LOG_ERR, filename, line, -r, \
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart PoetteringDEFINE_SETTER(config_parse_level2, log_set_max_level_from_string, "log level")
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart PoetteringDEFINE_SETTER(config_parse_target, log_set_target_from_string, "target")
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart PoetteringDEFINE_SETTER(config_parse_color, log_show_color_from_string, "color" )
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart PoetteringDEFINE_SETTER(config_parse_location, log_show_location_from_string, "location")
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering FOREACH_WORD_QUOTED(word, l, rvalue, state) {
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering log_syntax(unit, LOG_ERR, filename, line, -r,
35e2e347d38cc2f8bd7c38a0d8a5129f5fbb0ab9Lennart Poettering "Failed to parse CPU affinity '%s'", rvalue);
CPU_FREE(c);
static int config_parse_show_status(
const char* unit,
const char *filename,
unsigned line,
const char *section,
unsigned section_line,
const char *lvalue,
int ltype,
const char *rvalue,
void *data,
void *userdata) {
static void strv_free_free(char ***l) {
strv_free(*i);
free(l);
static void free_join_controllers(void) {
const char *filename,
unsigned line,
const char *section,
unsigned section_line,
const char *lvalue,
int ltype,
const char *rvalue,
void *data,
void *userdata) {
return log_oom();
free(s);
strv_uniq(l);
strv_free(l);
if (!arg_join_controllers) {
if (!arg_join_controllers) {
strv_free(l);
return log_oom();
arg_join_controllers[0] = l;
strv_free(l);
return log_oom();
for (a = arg_join_controllers; *a; a++) {
if (strv_overlap(*a, l)) {
if (strv_extend_strv(&l, *a) < 0) {
strv_free(l);
strv_free_free(t);
return log_oom();
c = strv_copy(*a);
strv_free(l);
strv_free_free(t);
return log_oom();
t[n++] = strv_uniq(l);
arg_join_controllers = t;
static int parse_config_file(void) {
{ "Manager", "CapabilityBoundingSet", config_parse_bounding_set, 0, &arg_capability_bounding_set_drop },
#ifdef HAVE_SECCOMP
{ "Manager", "DefaultLimitSIGPENDING", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_SIGPENDING] },
conf_dirs_nulstr = arg_running_as == MANAGER_SYSTEM ? CONF_DIRS_NULSTR("systemd/system.conf") : CONF_DIRS_NULSTR("systemd/user.conf");
assert(m);
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:
if (arg_no_pager < 0)
arg_no_pager = true;
case ARG_NO_PAGER:
arg_no_pager = true;
case ARG_VERSION:
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:
if (optarg) {
case ARG_DESERIALIZE: {
int fd;
FILE *f;
if (r < 0 || fd < 0) {
return r < 0 ? r : -EINVAL;
if (arg_serialization)
arg_serialization = f;
case ARG_SWITCHED_ROOT:
arg_switched_root = true;
if (arg_no_pager < 0)
arg_no_pager = true;
return -EINVAL;
return -EINVAL;
static int help(void) {
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);
if (!rl)
return log_oom();
static void test_mtab(void) {
static const char ok[] =
if (r == -ENOENT)
"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 filesystem 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 int initialize_join_controllers(void) {
if (!arg_join_controllers)
return -ENOMEM;
return -ENOMEM;
#ifdef HAVE_SECCOMP
Iterator i;
void *id;
if (!seccomp)
return log_oom();
if (r == -EEXIST)
goto finish;
goto finish;
static int status_welcome(void) {
NULL);
if (r == -ENOENT) {
NULL);
if (r < 0 && r != -ENOENT)
static int write_container_id(void) {
if (isempty(c))
bool reexecute = false;
bool skip_setup = false;
bool loaded_policy = false;
bool arm_reboot_watchdog = false;
bool queue_default_job = false;
bool empty_etc = false;
#ifdef HAVE_SYSV_COMPAT
skip_setup = true;
skip_setup = false;
umask(0);
log_open();
if (in_initrd())
if (!skip_setup) {
goto finish;
} else if (ima_setup() < 0) {
goto finish;
goto finish;
goto finish;
if (!skip_setup) {
if (clock_is_localtime() > 0) {
int min;
} else if (!in_initrd()) {
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;
if (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 (arg_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 = 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_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)
clearenv();
if (arg_serialization) {
if (fds) {
(void) reset_all_signal_handlers();
(void) reset_signal_mask();
if (switch_root_init) {
if (arg_serialization) {
if (fds) {
#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 (error_message)
freeze();
return retval;