chvt(crash_chvt);
if (crash_shell) {
+ sigset_t mask;
+
log_info("Executing crash shell in 10s...");
sleep(10);
+ /* Make sure the signal is not delivered inside the
+ * exec() */
+ assert_se(sigemptyset(&mask) == 0);
+ assert_se(sigaddset(&mask, sig) == 0);
+ assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0);
+
+ ignore_signal(sig);
+
execl("/bin/sh", "/bin/sh", NULL);
log_error("execl() failed: %s", strerror(errno));
}
else
crash_shell = r;
+
+ } else if (startswith(word, "systemd.confirm_spawn=")) {
+ int r;
+
+ if ((r = parse_boolean(word + 22)) < 0)
+ log_warning("Failed to parse confirm spawn switch %s, Ignoring.", word + 22);
+ else
+ confirm_spawn = r;
+
} else if (startswith(word, "systemd.crash_chvt=")) {
int k;
log_info("systemd.dump_core=0|1 Dump core on crash");
log_info("systemd.crash_shell=0|1 On crash run shell");
log_info("systemd.crash_chvt=N Change to VT #N on crash");
+ log_info("systemd.confirm_spawn=0|1 Confirm every process spawn");
} else {
unsigned i;
assert_se(reset_all_signal_handlers() == 0);
/* If we are init, we can block sigkill. Yay. */
- signal(SIGKILL, SIG_IGN);
- signal(SIGPIPE, SIG_IGN);
+ ignore_signal(SIGKILL);
+ ignore_signal(SIGPIPE);
/* Close all open files */
assert_se(close_all_fds(NULL, 0) == 0);
dbus_shutdown();
+ if (getpid() == 1)
+ freeze();
+
return retval;
}