X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fmain.c;h=64c2b3f3a143d4248522bb2339689d28e77d1474;hb=671174136525ddf208cdbe75d6d6bd159afa961f;hp=792b316c61b8e980fec719dee453c69da1723046;hpb=1de1c9c37bb58d99c3f9d86f50212e641a2948b4;p=elogind.git diff --git a/src/core/main.c b/src/core/main.c index 792b316c6..64c2b3f3a 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -116,6 +116,9 @@ static FILE* arg_serialization = NULL; static bool arg_default_cpu_accounting = false; static bool arg_default_blockio_accounting = false; static bool arg_default_memory_accounting = false; +static usec_t arg_start_timeout_usec = DEFAULT_MANAGER_START_TIMEOUT_USEC; +static FailureAction arg_start_timeout_action = FAILURE_ACTION_POWEROFF_FORCE; +static char *arg_start_timeout_reboot_arg = NULL; static void nop_handler(int sig) {} @@ -669,6 +672,9 @@ static int parse_config_file(void) { { "Manager", "DefaultCPUAccounting", config_parse_bool, 0, &arg_default_cpu_accounting }, { "Manager", "DefaultBlockIOAccounting", config_parse_bool, 0, &arg_default_blockio_accounting }, { "Manager", "DefaultMemoryAccounting", config_parse_bool, 0, &arg_default_memory_accounting }, + { "Manager", "StartTimeoutSec", config_parse_sec, 0, &arg_start_timeout_usec }, + { "Manager", "StartTimeoutAction", config_parse_failure_action, 0, &arg_start_timeout_action }, + { "Manager", "StartTimeoutRebootArgument",config_parse_string, 0, &arg_start_timeout_reboot_arg }, {} }; @@ -1628,6 +1634,10 @@ int main(int argc, char *argv[]) { m->default_memory_accounting = arg_default_memory_accounting; m->runtime_watchdog = arg_runtime_watchdog; m->shutdown_watchdog = arg_shutdown_watchdog; + m->start_timeout_usec = arg_start_timeout_usec; + m->start_timeout_action = arg_start_timeout_action; + free_and_strdup(&m->start_timeout_reboot_arg, arg_start_timeout_reboot_arg); + m->userspace_timestamp = userspace_timestamp; m->kernel_timestamp = kernel_timestamp; m->initrd_timestamp = initrd_timestamp; @@ -1816,12 +1826,14 @@ finish: set_free(arg_syscall_archs); arg_syscall_archs = NULL; + free(arg_start_timeout_reboot_arg); + arg_start_timeout_reboot_arg = NULL; + label_finish(); if (reexecute) { const char **args; unsigned i, args_size; - sigset_t ss; /* Close and disarm the watchdog, so that the new * instance can reinitialize it, but doesn't get @@ -1841,8 +1853,8 @@ finish: * deserializing. */ broadcast_signal(SIGTERM, false, true); - /* And switch root */ - r = switch_root(switch_root_dir); + /* And switch root with MS_MOVE, because we remove the old directory afterwards and detach it. */ + r = switch_root(switch_root_dir, "/mnt", true, MS_MOVE); if (r < 0) log_error("Failed to switch root, ignoring: %s", strerror(-r)); } @@ -1905,12 +1917,10 @@ finish: args[i++] = NULL; assert(i <= args_size); - /* reenable any blocked signals, especially important + /* Reenable any blocked signals, especially important * if we switch from initial ramdisk to init=... */ reset_all_signal_handlers(); - - assert_se(sigemptyset(&ss) == 0); - assert_se(sigprocmask(SIG_SETMASK, &ss, NULL) == 0); + reset_signal_mask(); if (switch_root_init) { args[0] = switch_root_init;