X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fmain.c;h=fb34e4d3d19982ff286541ea8e4f7d8d298e7657;hb=cccb0b2cdbd25e90ae92d2d5b107125cb1ca3433;hp=4d4f6e8f4caf664f772406840213b6f73326c8e8;hpb=54b434b1b5055f934230fe04fad35b01642b8488;p=elogind.git diff --git a/src/core/main.c b/src/core/main.c index 4d4f6e8f4..fb34e4d3d 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -112,7 +112,7 @@ static FILE* serialization = NULL; static void nop_handler(int sig) { } -_noreturn_ static void crash(int sig) { +noreturn static void crash(int sig) { if (getpid() != 1) /* Pass this on immediately, if this is not PID 1 */ @@ -131,7 +131,7 @@ _noreturn_ static void crash(int sig) { pid = fork(); if (pid < 0) - log_error("Caught <%s>, cannot fork for core dump: %s", signal_to_string(sig), strerror(errno)); + log_error("Caught <%s>, cannot fork for core dump: %m", signal_to_string(sig)); else if (pid == 0) { struct rlimit rl = {}; @@ -166,7 +166,7 @@ _noreturn_ static void crash(int sig) { else if (status.si_code != CLD_DUMPED) log_error("Caught <%s>, core dump failed.", signal_to_string(sig)); else - log_error("Caught <%s>, dumped core as pid %lu.", signal_to_string(sig), (unsigned long) pid); + log_error("Caught <%s>, dumped core as pid "PID_FMT".", signal_to_string(sig), pid); } } @@ -197,7 +197,7 @@ _noreturn_ static void crash(int sig) { _exit(1); } - log_info("Successfully spawned crash shell as pid %lu.", (unsigned long) pid); + log_info("Successfully spawned crash shell as pid "PID_FMT".", pid); } log_info("Freezing execution."); @@ -417,7 +417,7 @@ static int parse_proc_cmdline_word(const char *word) { * will block with every log message for for 60 seconds, * before they give up. */ log_set_max_level(LOG_DEBUG); - log_set_target(LOG_TARGET_KMSG); + log_set_target(detect_container(NULL) > 0 ? LOG_TARGET_CONSOLE : LOG_TARGET_KMSG); } else if (!in_initrd()) { unsigned i; @@ -435,6 +435,7 @@ static int parse_proc_cmdline_word(const char *word) { const char *filename, \ unsigned line, \ const char *section, \ + unsigned section_line, \ const char *lvalue, \ int ltype, \ const char *rvalue, \ @@ -461,11 +462,11 @@ DEFINE_SETTER(config_parse_target, log_set_target_from_string, "target") DEFINE_SETTER(config_parse_color, log_show_color_from_string, "color" ) DEFINE_SETTER(config_parse_location, log_show_location_from_string, "location") - static int config_parse_cpu_affinity2(const char *unit, const char *filename, unsigned line, const char *section, + unsigned section_line, const char *lvalue, int ltype, const char *rvalue, @@ -538,6 +539,7 @@ static int config_parse_join_controllers(const char *unit, const char *filename, unsigned line, const char *section, + unsigned section_line, const char *lvalue, int ltype, const char *rvalue, @@ -597,17 +599,12 @@ static int config_parse_join_controllers(const char *unit, for (a = arg_join_controllers; *a; a++) { if (strv_overlap(*a, l)) { - char **c; - - c = strv_merge(*a, l); - if (!c) { + if (strv_extend_strv(&l, *a) < 0) { strv_free(l); strv_free_free(t); return log_oom(); } - strv_free(l); - l = c; } else { char **c; @@ -1325,6 +1322,7 @@ int main(int argc, char *argv[]) { /* Running inside a container, as PID 1 */ arg_running_as = SYSTEMD_SYSTEM; log_set_target(LOG_TARGET_CONSOLE); + log_close_console(); /* force reopen of /dev/console */ log_open(); /* For the later on, see above... */ @@ -1477,15 +1475,19 @@ int main(int argc, char *argv[]) { if (in_initrd()) log_info("Running in initial RAM disk."); - } else - log_debug(PACKAGE_STRING " running in user mode. (" SYSTEMD_FEATURES ")"); + } else { + _cleanup_free_ char *t = uid_to_name(getuid()); + log_debug(PACKAGE_STRING " running in user mode for user "PID_FMT"/%s. (" SYSTEMD_FEATURES ")", + getuid(), t); + } if (arg_running_as == SYSTEMD_SYSTEM && !skip_setup) { if (arg_show_status || plymouth_running()) status_welcome(); #ifdef HAVE_KMOD - kmod_setup(); + if (detect_container(NULL) <= 0) + kmod_setup(); #endif hostname_setup(); machine_id_setup(); @@ -1528,7 +1530,7 @@ int main(int argc, char *argv[]) { if (arg_running_as == SYSTEMD_SYSTEM) bump_rlimit_nofile(&saved_rlimit_nofile); - r = manager_new(arg_running_as, !!serialization, &m); + r = manager_new(arg_running_as, &m); if (r < 0) { log_error("Failed to allocate manager object: %s", strerror(-r)); goto finish; @@ -1742,7 +1744,7 @@ finish: * initrd, but don't wait for them, so that we * can handle the SIGCHLD for them after * deserializing. */ - broadcast_signal(SIGTERM, false); + broadcast_signal(SIGTERM, false, true); /* And switch root */ r = switch_root(switch_root_dir); @@ -1849,10 +1851,11 @@ finish: shutdown_verb, NULL }; - char **env_block; + _cleanup_strv_free_ char **env_block = NULL; + env_block = strv_copy(environ); if (arm_reboot_watchdog && arg_shutdown_watchdog > 0) { - char e[32]; + char *e; /* If we reboot let's set the shutdown * watchdog and tell the shutdown binary to @@ -1860,15 +1863,11 @@ finish: watchdog_set_timeout(&arg_shutdown_watchdog); watchdog_close(false); - /* Tell the binary how often to ping */ - snprintf(e, sizeof(e), "WATCHDOG_USEC=%llu", (unsigned long long) arg_shutdown_watchdog); - char_array_0(e); - - env_block = strv_append(environ, e); - } else { - env_block = strv_copy(environ); + /* Tell the binary how often to ping, ignore failure */ + if (asprintf(&e, "WATCHDOG_USEC="USEC_FMT, arg_shutdown_watchdog) > 0) + strv_push(&env_block, e); + } else watchdog_close(true); - } /* Avoid the creation of new processes forked by the * kernel; at this point, we will not listen to the @@ -1877,7 +1876,6 @@ finish: cg_uninstall_release_agent(SYSTEMD_CGROUP_CONTROLLER); execve(SYSTEMD_SHUTDOWN_BINARY_PATH, (char **) command_line, env_block); - free(env_block); log_error("Failed to execute shutdown binary, freezing: %m"); }