main.c revision df6e44c4affced590b0d19c594d9301ffd436591
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 SystemdRunningAs arg_running_as = _SYSTEMD_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 ShowStatus arg_show_status = _SHOW_STATUS_UNSET;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poetteringstatic bool arg_switched_root = false;
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_default_restart_usec = DEFAULT_RESTART_USEC;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poetteringstatic usec_t arg_default_timeout_start_usec = DEFAULT_TIMEOUT_USEC;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poetteringstatic usec_t arg_default_timeout_stop_usec = DEFAULT_TIMEOUT_USEC;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poetteringstatic usec_t arg_default_start_limit_interval = DEFAULT_START_LIMIT_INTERVAL;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poetteringstatic unsigned arg_default_start_limit_burst = DEFAULT_START_LIMIT_BURST;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poetteringstatic usec_t arg_shutdown_watchdog = 10 * USEC_PER_MINUTE;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poetteringstatic char **arg_default_environment = NULL;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poetteringstatic struct rlimit *arg_default_rlimit[_RLIMIT_MAX] = {};
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poetteringstatic uint64_t arg_capability_bounding_set_drop = 0;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poetteringstatic nsec_t arg_timer_slack_nsec = NSEC_INFINITY;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poetteringstatic usec_t arg_default_timer_accuracy_usec = 1 * USEC_PER_MINUTE;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poetteringstatic bool arg_default_cpu_accounting = false;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poetteringstatic bool arg_default_blockio_accounting = false;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poetteringstatic bool arg_default_memory_accounting = false;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poetteringstatic void pager_open_if_enabled(void) {
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering /* Pass this on immediately, if this is not PID 1 */
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering log_emergency("Caught <%s>, not dumping core.", signal_to_string(sig));
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering /* We want to wait for the core process, hence let's enable SIGCHLD */
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering log_emergency_errno(errno, "Caught <%s>, cannot fork for core dump: %m", signal_to_string(sig));
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering else if (pid == 0) {
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering /* Enable default signal handler for core dump */
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering /* Don't limit the core dump size */
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering /* Just to be sure... */
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering /* Raise the signal again */
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering kill(pid, sig); /* raise() would kill the parent */
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering assert_not_reached("We shouldn't be here...");
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering /* Order things nicely. */
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering log_emergency_errno(r, "Caught <%s>, waitpid() failed: %m", signal_to_string(sig));
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering log_emergency("Caught <%s>, core dump failed (child "PID_FMT", code=%s, status=%i/%s).",
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering pid, sigchld_code_to_string(status.si_code),
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering ? exit_status_to_string(status.si_status, EXIT_STATUS_FULL)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_emergency("Caught <%s>, dumped core as pid "PID_FMT".", signal_to_string(sig), pid);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering .sa_flags = SA_NOCLDSTOP|SA_NOCLDWAIT|SA_RESTART,
8bf52d3d17d364438191077d0750b8b80b5dc53aLennart Poettering log_info("Executing crash shell in 10s...");
8bf52d3d17d364438191077d0750b8b80b5dc53aLennart Poettering /* Let the kernel reap children for us */
8bf52d3d17d364438191077d0750b8b80b5dc53aLennart Poettering assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_emergency_errno(errno, "Failed to fork off crash shell: %m");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering else if (pid == 0) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering execle("/bin/sh", "/bin/sh", NULL, environ);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_emergency_errno(errno, "execle() failed: %m");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering log_info("Successfully spawned crash shell as PID "PID_FMT".", pid);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic void install_crash_handler(void) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering .sa_flags = SA_NODEFER, /* So that we can raise the signal again from the signal handler */
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering /* We ignore the return value here, since, we don't mind if we
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering * cannot set up a crash handler */
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering r = sigaction_many(&sa, SIGNALS_CRASH_HANDLER, -1);
7e8e0422aeb16f2a09a40546c61df753d10029b6Lennart Poettering log_debug_errno(r, "I had trouble setting up the crash handler, ignoring: %m");
946c70944ebdf428ffeb9991a7449edbd4011461Zbigniew Jędrzejewski-Szmekstatic int console_setup(void) {
946c70944ebdf428ffeb9991a7449edbd4011461Zbigniew Jędrzejewski-Szmek _cleanup_close_ int tty_fd = -1;
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering tty_fd = open_terminal("/dev/console", O_WRONLY|O_NOCTTY|O_CLOEXEC);
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering return log_error_errno(tty_fd, "Failed to open /dev/console: %m");
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering /* We don't want to force text mode. plymouth may be showing
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering * pictures already from initrd. */
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering return log_error_errno(r, "Failed to reset /dev/console: %m");
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poetteringstatic int set_default_unit(const char *u) {
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poetteringstatic int parse_proc_cmdline_item(const char *key, const char *value) {
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering static const char * const rlmap[] = {
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering if (streq(key, "systemd.unit") && value) {
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering } else if (streq(key, "rd.systemd.unit") && value) {
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering } else if (streq(key, "systemd.dump_core") && value) {
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering log_warning("Failed to parse dump core switch %s. Ignoring.", value);
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering } else if (streq(key, "systemd.crash_shell") && value) {
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering log_warning("Failed to parse crash shell switch %s. Ignoring.", value);
7e8e0422aeb16f2a09a40546c61df753d10029b6Lennart Poettering } else if (streq(key, "systemd.crash_chvt") && value) {
7e8e0422aeb16f2a09a40546c61df753d10029b6Lennart Poettering log_warning("Failed to parse crash chvt switch %s. Ignoring.", value);
7e8e0422aeb16f2a09a40546c61df753d10029b6Lennart Poettering } else if (streq(key, "systemd.confirm_spawn") && value) {
946c70944ebdf428ffeb9991a7449edbd4011461Zbigniew Jędrzejewski-Szmek log_warning("Failed to parse confirm spawn switch %s. Ignoring.", value);
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering } else if (streq(key, "systemd.show_status") && value) {
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering r = parse_show_status(value, &arg_show_status);
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering log_warning("Failed to parse show status switch %s. Ignoring.", value);
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering } else if (streq(key, "systemd.default_standard_output") && value) {
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering log_warning("Failed to parse default standard output switch %s. Ignoring.", value);
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering } else if (streq(key, "systemd.default_standard_error") && value) {
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering log_warning("Failed to parse default standard error switch %s. Ignoring.", value);
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering } else if (streq(key, "systemd.setenv") && value) {
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering env = strv_env_set(arg_default_environment, value);
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering log_warning_errno(ENOMEM, "Setting environment variable '%s' failed, ignoring: %m", value);
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering log_warning("Environment variable name '%s' is not valid. Ignoring.", value);
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering } else if (streq(key, "quiet") && !value) {
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering if (arg_show_status == _SHOW_STATUS_UNSET)
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering } else if (streq(key, "debug") && !value) {
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering /* Note that log_parse_environment() handles 'debug'
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering * too, and sets the log level to LOG_DEBUG. */
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering /* SysV compatibility */
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering for (i = 0; i < ELEMENTSOF(rlmap); i += 2)
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering#define DEFINE_SETTER(name, func, descr) \
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering const char *lvalue, \
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering const char *rvalue, \
946c70944ebdf428ffeb9991a7449edbd4011461Zbigniew Jędrzejewski-Szmek log_syntax(unit, LOG_ERR, filename, line, -r, \
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart PoetteringDEFINE_SETTER(config_parse_level2, log_set_max_level_from_string, "log level")
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart PoetteringDEFINE_SETTER(config_parse_target, log_set_target_from_string, "target")
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart PoetteringDEFINE_SETTER(config_parse_color, log_show_color_from_string, "color" )
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart PoetteringDEFINE_SETTER(config_parse_location, log_show_location_from_string, "location")
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering FOREACH_WORD_QUOTED(word, l, rvalue, state) {
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering log_syntax(unit, LOG_ERR, filename, line, -r,
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering "Failed to parse CPU affinity '%s'", rvalue);
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering CPU_SET_S(cpu, CPU_ALLOC_SIZE(ncpus), c);
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering log_syntax(unit, LOG_ERR, filename, line, EINVAL,
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering "Trailing garbage, ignoring.");
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering if (sched_setaffinity(0, CPU_ALLOC_SIZE(ncpus), c) < 0)
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering log_unit_warning(unit, "Failed to set CPU affinity: %m");
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering log_syntax(unit, LOG_ERR, filename, line, -k,
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering "Failed to parse show status setting, ignoring: %s", rvalue);
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 == SYSTEMD_SYSTEM ? CONF_DIRS_NULSTR("systemd/system.conf") : CONF_DIRS_NULSTR("systemd/user.conf");
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;
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;
test_mtab();
test_usr();
goto finish;
goto finish;
if (arg_syscall_archs) {
goto finish;
if (empty_etc) {
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 = 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) {
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_CONSOLE:
if (log_get_show_color())
if (log_get_show_location())
watchdog_close(false);
watchdog_close(true);
if (error_message)
freeze();
return retval;