X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fcore%2Fmain.c;h=26aa561218f3f801a27451dc96b1f3c1f92285c3;hp=51c83154a54eac6fe95cec4e78f993f2b78e8641;hb=1cce5d639cdcb3b237e2eda3c36782f98ff23b46;hpb=449101fce2757575c4813a9512890536365445f6 diff --git a/src/core/main.c b/src/core/main.c index 51c83154a..26aa56121 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -410,6 +410,8 @@ static int parse_proc_cmdline_word(const char *word) { } else if (streq(word, "quiet")) arg_show_status = false; + else if (streq(word, "debug")) + log_set_max_level(LOG_DEBUG); else if (!in_initrd()) { unsigned i; @@ -522,9 +524,6 @@ static void strv_free_free(char ***l) { } static void free_join_controllers(void) { - if (!arg_join_controllers) - return; - strv_free_free(arg_join_controllers); arg_join_controllers = NULL; } @@ -666,11 +665,11 @@ static int parse_config_file(void) { { NULL, NULL, NULL, 0, NULL } }; - FILE _cleanup_fclose_ *f; + _cleanup_fclose_ FILE *f; const char *fn; int r; - fn = arg_running_as == SYSTEMD_SYSTEM ? SYSTEM_CONFIG_FILE : USER_CONFIG_FILE; + fn = arg_running_as == SYSTEMD_SYSTEM ? PKGSYSCONFDIR "/system.conf" : PKGSYSCONFDIR "/user.conf"; f = fopen(fn, "re"); if (!f) { if (errno == ENOENT) @@ -680,7 +679,7 @@ static int parse_config_file(void) { return 0; } - r = config_parse(NULL, fn, f, "Manager\0", config_item_table_lookup, (void*) items, false, NULL); + r = config_parse(NULL, fn, f, "Manager\0", config_item_table_lookup, (void*) items, false, false, NULL); if (r < 0) log_warning("Failed to parse configuration file: %s", strerror(-r)); @@ -688,7 +687,7 @@ static int parse_config_file(void) { } static int parse_proc_cmdline(void) { - char _cleanup_free_ *line = NULL; + _cleanup_free_ char *line = NULL; char *w, *state; int r; size_t l; @@ -705,7 +704,7 @@ static int parse_proc_cmdline(void) { } FOREACH_WORD_QUOTED(w, l, line, state) { - char _cleanup_free_ *word; + _cleanup_free_ char *word; word = strndup(w, l); if (!word) @@ -1219,14 +1218,14 @@ static int initialize_join_controllers(void) { return -ENOMEM; arg_join_controllers[0] = strv_new("cpu", "cpuacct", NULL); - if (!arg_join_controllers[0]) - return -ENOMEM; - arg_join_controllers[1] = strv_new("net_cls", "net_prio", NULL); - if (!arg_join_controllers[1]) + arg_join_controllers[2] = NULL; + + if (!arg_join_controllers[0] || !arg_join_controllers[1]) { + free_join_controllers(); return -ENOMEM; + } - arg_join_controllers[2] = NULL; return 0; } @@ -1239,6 +1238,8 @@ int main(int argc, char *argv[]) { bool reexecute = false; const char *shutdown_verb = NULL; dual_timestamp initrd_timestamp = { 0ULL, 0ULL }; + dual_timestamp userspace_timestamp = { 0ULL, 0ULL }; + dual_timestamp kernel_timestamp = { 0ULL, 0ULL }; static char systemd[] = "systemd"; bool skip_setup = false; int j; @@ -1260,6 +1261,9 @@ int main(int argc, char *argv[]) { } #endif + dual_timestamp_from_monotonic(&kernel_timestamp, 0); + dual_timestamp_get(&userspace_timestamp); + /* Determine if this is a reexecution or normal bootup. We do * the full command line parsing much later, so let's just * have a quick peek here. */ @@ -1294,7 +1298,7 @@ int main(int argc, char *argv[]) { if (in_initrd()) { char *rd_timestamp = NULL; - dual_timestamp_get(&initrd_timestamp); + initrd_timestamp = userspace_timestamp; asprintf(&rd_timestamp, "%llu %llu", (unsigned long long) initrd_timestamp.realtime, (unsigned long long) initrd_timestamp.monotonic); @@ -1354,7 +1358,6 @@ int main(int argc, char *argv[]) { log_set_target(LOG_TARGET_JOURNAL_OR_KMSG); } else if (getpid() == 1) { - /* Running inside a container, as PID 1 */ arg_running_as = SYSTEMD_SYSTEM; log_set_target(LOG_TARGET_CONSOLE); @@ -1363,12 +1366,21 @@ int main(int argc, char *argv[]) { /* For the later on, see above... */ log_set_target(LOG_TARGET_JOURNAL); - } else { + /* clear the kernel timestamp, + * because we are in a container */ + kernel_timestamp.monotonic = 0ULL; + kernel_timestamp.realtime = 0ULL; + } else { /* Running as user instance */ arg_running_as = SYSTEMD_USER; log_set_target(LOG_TARGET_AUTO); log_open(); + + /* clear the kernel timestamp, + * because we are not PID 1 */ + kernel_timestamp.monotonic = 0ULL; + kernel_timestamp.realtime = 0ULL; } /* Initialize default unit */ @@ -1393,7 +1405,6 @@ int main(int argc, char *argv[]) { /* Reset all signal handlers. */ assert_se(reset_all_signal_handlers() == 0); - /* If we are init, we can block sigkill. Yay. */ ignore_signals(SIGNALS_IGNORE, -1); if (parse_config_file() < 0) @@ -1610,12 +1621,12 @@ int main(int argc, char *argv[]) { m->default_std_error = arg_default_std_error; m->runtime_watchdog = arg_runtime_watchdog; m->shutdown_watchdog = arg_shutdown_watchdog; + m->userspace_timestamp = userspace_timestamp; + m->kernel_timestamp = kernel_timestamp; + m->initrd_timestamp = initrd_timestamp; manager_set_default_rlimits(m, arg_default_rlimit); - if (dual_timestamp_is_set(&initrd_timestamp)) - m->initrd_timestamp = initrd_timestamp; - if (arg_default_controllers) manager_set_default_controllers(m, arg_default_controllers); @@ -1683,7 +1694,7 @@ int main(int argc, char *argv[]) { r = manager_add_job(m, JOB_START, target, JOB_ISOLATE, false, &error, &default_unit_job); if (r == -EPERM) { - log_error("Default target could not be isolated, starting instead: %s", bus_error(&error, r)); + log_debug("Default target could not be isolated, starting instead: %s", bus_error(&error, r)); dbus_error_free(&error); r = manager_add_job(m, JOB_START, target, JOB_REPLACE, false, &error, &default_unit_job);