X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fmain.c;h=2e6ccfaa30d37f3e7a74234f4722cb296a150b66;hp=5b5c05acbc7a6d949e9a17eda41226095e4d8a2a;hb=35df8f27fae82c6f9e83d750ffa5e54733b16cf2;hpb=d6c9574fb558d9e304699b1cc7522c3b133adfc9 diff --git a/src/main.c b/src/main.c index 5b5c05acb..2e6ccfaa3 100644 --- a/src/main.c +++ b/src/main.c @@ -38,7 +38,6 @@ #include "hostname-setup.h" #include "loopback-setup.h" #include "kmod-setup.h" -#include "modprobe-setup.h" #include "load-fragment.h" #include "fdset.h" #include "special.h" @@ -57,16 +56,17 @@ static enum { } arg_action = ACTION_RUN; static char *arg_default_unit = NULL; -static char *arg_console = NULL; static ManagerRunningAs arg_running_as = _MANAGER_RUNNING_AS_INVALID; static bool arg_dump_core = true; static bool arg_crash_shell = false; static int arg_crash_chvt = -1; static bool arg_confirm_spawn = false; -static bool arg_nomodules = false; static bool arg_show_status = true; static bool arg_sysv_console = true; +static bool arg_mount_auto = true; +static bool arg_swap_auto = true; +static char *arg_console = NULL; static FILE* serialization = NULL; @@ -245,6 +245,8 @@ static int parse_proc_cmdline_word(const char *word) { "5", SPECIAL_RUNLEVEL5_TARGET }; + assert(word); + if (startswith(word, "systemd.unit=")) return set_default_unit(word + 13); @@ -334,9 +336,7 @@ static int parse_proc_cmdline_word(const char *word) { "systemd.log_color=0|1 Highlight important log messages\n" "systemd.log_location=0|1 Include code location in log messages\n"); - } else if (streq(word, "nomodules")) - arg_nomodules = true; - else if (startswith(word, "console=")) { + } else if (startswith(word, "console=")) { const char *k; size_t l; char *w = NULL; @@ -344,6 +344,7 @@ static int parse_proc_cmdline_word(const char *word) { k = word + 8; l = strcspn(k, ","); + /* Ignore the console setting if set to a VT */ if (l < 4 || !startswith(k, "tty") || k[3+strspn(k+3, "0123456789")] != 0) { @@ -494,16 +495,18 @@ static int config_parse_cpu_affinity( static int parse_config_file(void) { const ConfigItem items[] = { - { "LogLevel", config_parse_level, NULL, "Manager" }, - { "LogTarget", config_parse_target, NULL, "Manager" }, - { "LogColor", config_parse_color, NULL, "Manager" }, - { "LogLocation", config_parse_location, NULL, "Manager" }, - { "DumpCore", config_parse_bool, &arg_dump_core, "Manager" }, - { "CrashShell", config_parse_bool, &arg_crash_shell, "Manager" }, - { "ShowStatus", config_parse_bool, &arg_show_status, "Manager" }, - { "SysVConsole", config_parse_bool, &arg_sysv_console,"Manager" }, - { "CrashChVT", config_parse_int, &arg_crash_chvt, "Manager" }, - { "CPUAffinity", config_parse_cpu_affinity, NULL, "Manager" }, + { "LogLevel", config_parse_level, NULL, "Manager" }, + { "LogTarget", config_parse_target, NULL, "Manager" }, + { "LogColor", config_parse_color, NULL, "Manager" }, + { "LogLocation", config_parse_location, NULL, "Manager" }, + { "DumpCore", config_parse_bool, &arg_dump_core, "Manager" }, + { "CrashShell", config_parse_bool, &arg_crash_shell, "Manager" }, + { "ShowStatus", config_parse_bool, &arg_show_status, "Manager" }, + { "SysVConsole", config_parse_bool, &arg_sysv_console, "Manager" }, + { "CrashChVT", config_parse_int, &arg_crash_chvt, "Manager" }, + { "CPUAffinity", config_parse_cpu_affinity, NULL, "Manager" }, + { "MountAuto", config_parse_bool, &arg_mount_auto, "Manager" }, + { "SwapAuto", config_parse_bool, &arg_swap_auto, "Manager" }, { NULL, NULL, NULL, NULL } }; @@ -873,8 +876,7 @@ fail: int main(int argc, char *argv[]) { Manager *m = NULL; - Unit *target = NULL; - int r, retval = 1; + int r, retval = EXIT_FAILURE; FDSet *fds = NULL; bool reexecute = false; @@ -935,10 +937,10 @@ int main(int argc, char *argv[]) { goto finish; } else if (arg_action == ACTION_DUMP_CONFIGURATION_ITEMS) { unit_dump_config_items(stdout); - retval = 0; + retval = EXIT_SUCCESS; goto finish; } else if (arg_action == ACTION_DONE) { - retval = 0; + retval = EXIT_SUCCESS; goto finish; } @@ -992,20 +994,13 @@ int main(int argc, char *argv[]) { log_full(arg_running_as == MANAGER_SYSTEM ? LOG_INFO : LOG_DEBUG, PACKAGE_STRING " running in %s mode. (" SYSTEMD_FEATURES ")", manager_running_as_to_string(arg_running_as)); - if (arg_running_as == MANAGER_SYSTEM) { + if (arg_running_as == MANAGER_SYSTEM && !serialization) { + if (arg_show_status) + status_welcome(); - /* Disable nscd, to avoid deadlocks when systemd uses - * NSS and the nscd socket is maintained by us. */ - nss_disable_nscd(); - - if (!serialization) { - if (arg_show_status) - status_welcome(); - modprobe_setup(arg_nomodules); - kmod_setup(); - hostname_setup(); - loopback_setup(); - } + kmod_setup(); + hostname_setup(); + loopback_setup(); } if ((r = manager_new(arg_running_as, &m)) < 0) { @@ -1016,6 +1011,11 @@ int main(int argc, char *argv[]) { m->confirm_spawn = arg_confirm_spawn; m->show_status = arg_show_status; m->sysv_console = arg_sysv_console; + m->mount_auto = arg_mount_auto; + m->swap_auto = arg_swap_auto; + + if (arg_console) + manager_set_console(m, arg_console); if ((r = manager_startup(m, serialization, fds)) < 0) log_error("Failed to fully start up daemon: %s", strerror(-r)); @@ -1033,6 +1033,7 @@ int main(int argc, char *argv[]) { serialization = NULL; } else { DBusError error; + Unit *target = NULL; dbus_error_init(&error); @@ -1041,12 +1042,19 @@ int main(int argc, char *argv[]) { if ((r = manager_load_unit(m, arg_default_unit, NULL, &error, &target)) < 0) { log_error("Failed to load default target: %s", bus_error(&error, r)); dbus_error_free(&error); + } else if (target->meta.load_state != UNIT_LOADED) + log_error("Failed to load default target: %s", strerror(-target->meta.load_error)); + if (!target || target->meta.load_state != UNIT_LOADED) { log_info("Trying to load rescue target..."); + if ((r = manager_load_unit(m, SPECIAL_RESCUE_TARGET, NULL, &error, &target)) < 0) { log_error("Failed to load rescue target: %s", bus_error(&error, r)); dbus_error_free(&error); goto finish; + } else if (target->meta.load_state != UNIT_LOADED) { + log_error("Failed to load rescue target: %s", strerror(-target->meta.load_error)); + goto finish; } } @@ -1061,25 +1069,10 @@ int main(int argc, char *argv[]) { goto finish; } - if (arg_console && arg_running_as == MANAGER_SYSTEM) { - char *name; - - if (asprintf(&name, "getty@%s.service", arg_console) < 0) - log_error("Out of memory while generating console getty service name."); - else { - if ((r = manager_add_job_by_name(m, JOB_START, name, JOB_FAIL, false, &error, NULL)) < 0) { - log_error("Failed to start console getty target: %s", bus_error(&error, r)); - dbus_error_free(&error); - } - - free(name); - } - } - if (arg_action == ACTION_TEST) { printf("-> By jobs:\n"); manager_dump_jobs(m, stdout, "\t"); - retval = 0; + retval = EXIT_SUCCESS; goto finish; } } @@ -1093,7 +1086,7 @@ int main(int argc, char *argv[]) { switch (m->exit_code) { case MANAGER_EXIT: - retval = 0; + retval = EXIT_SUCCESS; log_debug("Exit."); goto finish; @@ -1125,6 +1118,8 @@ finish: dbus_shutdown(); + label_finish(); + if (reexecute) { const char *args[15]; unsigned i = 0; @@ -1189,7 +1184,5 @@ finish: if (getpid() == 1) freeze(); - label_finish(); - return retval; }