X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fmain.c;h=64acdf76e1dbecf63237b4fb5c23c7ce6b6b87c0;hb=609c3029076da1ba423673161e5d0fc82ccca6b6;hp=ed690162bfbd43f60b06e49003cd826b9af3d0f9;hpb=2928b0a863091f8f291fddb168988711afd389ef;p=elogind.git diff --git a/src/core/main.c b/src/core/main.c index ed690162b..64acdf76e 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -75,9 +75,7 @@ #include "selinux-setup.h" #include "ima-setup.h" #include "smack-setup.h" -#ifdef HAVE_KMOD #include "kmod-setup.h" -#endif static enum { ACTION_RUN, @@ -116,9 +114,6 @@ 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_REBOOT_FORCE; -static char *arg_start_timeout_reboot_arg = NULL; static void nop_handler(int sig) {} @@ -272,6 +267,7 @@ static int parse_proc_cmdline_item(const char *key, const char *value) { static const char * const rlmap[] = { "emergency", SPECIAL_EMERGENCY_TARGET, "-b", SPECIAL_EMERGENCY_TARGET, + "rescue", SPECIAL_RESCUE_TARGET, "single", SPECIAL_RESCUE_TARGET, "-s", SPECIAL_RESCUE_TARGET, "s", SPECIAL_RESCUE_TARGET, @@ -672,9 +668,6 @@ 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 }, {} }; @@ -1298,16 +1291,16 @@ int main(int argc, char *argv[]) { if (!skip_setup) { mount_setup_early(); dual_timestamp_get(&security_start_timestamp); - if (selinux_setup(&loaded_policy) < 0) + if (mac_selinux_setup(&loaded_policy) < 0) goto finish; if (ima_setup() < 0) goto finish; - if (smack_setup(&loaded_policy) < 0) + if (mac_smack_setup(&loaded_policy) < 0) goto finish; dual_timestamp_get(&security_finish_timestamp); } - if (label_init(NULL) < 0) + if (mac_selinux_init(NULL) < 0) goto finish; if (!skip_setup) { @@ -1394,6 +1387,11 @@ int main(int argc, char *argv[]) { /* Mount /proc, /sys and friends, so that /proc/cmdline and * /proc/$PID/fd is available. */ if (getpid() == 1) { + + /* Load the kernel modules early, so that we kdbus.ko is loaded before kdbusfs shall be mounted */ + if (!skip_setup) + kmod_setup(); + r = mount_setup(loaded_policy); if (r < 0) goto finish; @@ -1407,9 +1405,11 @@ int main(int argc, char *argv[]) { if (parse_config_file() < 0) goto finish; - if (arg_running_as == SYSTEMD_SYSTEM) - if (parse_proc_cmdline(parse_proc_cmdline_item) < 0) - goto finish; + if (arg_running_as == SYSTEMD_SYSTEM) { + r = parse_proc_cmdline(parse_proc_cmdline_item); + if (r < 0) + log_warning("Failed to parse kernel command line, ignoring: %s", strerror(-r)); + } /* Note that this also parses bits from the kernel command * line, including "debug". */ @@ -1556,9 +1556,6 @@ int main(int argc, char *argv[]) { if (arg_show_status > 0 || plymouth_running()) status_welcome(); -#ifdef HAVE_KMOD - kmod_setup(); -#endif hostname_setup(); machine_id_setup(NULL); loopback_setup(); @@ -1634,9 +1631,6 @@ 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; @@ -1725,7 +1719,7 @@ int main(int argc, char *argv[]) { after_startup = now(CLOCK_MONOTONIC); log_full(arg_action == ACTION_TEST ? LOG_INFO : LOG_DEBUG, "Loaded units and determined initial transaction in %s.", - format_timespan(timespan, sizeof(timespan), after_startup - before_startup, 0)); + format_timespan(timespan, sizeof(timespan), after_startup - before_startup, 100 * USEC_PER_MSEC)); if (arg_action == ACTION_TEST) { printf("-> By jobs:\n"); @@ -1826,15 +1820,11 @@ finish: set_free(arg_syscall_archs); arg_syscall_archs = NULL; - free(arg_start_timeout_reboot_arg); - arg_start_timeout_reboot_arg = NULL; - - label_finish(); + mac_selinux_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 @@ -1854,10 +1844,10 @@ 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)); + log_error("Failed to switch root, trying to continue: %s", strerror(-r)); } args_size = MAX(6, argc+1); @@ -1918,12 +1908,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;