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=f0b41525426b169253e38a7744268c503b61f81b;hb=1cce5d639cdcb3b237e2eda3c36782f98ff23b46;hpb=799de03f51def1cb3cea376c2e3e783c721c9b89 diff --git a/src/core/main.c b/src/core/main.c index f0b415254..26aa56121 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -40,7 +40,7 @@ #include "fdset.h" #include "special.h" #include "conf-parser.h" -#include "bus-errors.h" +#include "dbus-common.h" #include "missing.h" #include "label.h" #include "build.h" @@ -55,6 +55,7 @@ #include "env-util.h" #include "hwclock.h" #include "sd-daemon.h" +#include "sd-messages.h" #include "mount-setup.h" #include "loopback-setup.h" @@ -409,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; @@ -421,40 +424,47 @@ static int parse_proc_cmdline_word(const char *word) { return 0; } -#define DEFINE_SETTER(name, func) \ - static int name( \ - const char *filename, \ - unsigned line, \ - const char *section, \ - const char *lvalue, \ - int ltype, \ - const char *rvalue, \ - void *data, \ - void *userdata) { \ - \ - assert(filename); \ - assert(lvalue); \ - assert(rvalue); \ - \ - func(rvalue); \ - return 0; \ -} +#define DEFINE_SETTER(name, func, descr) \ + static int name(const char *unit, \ + const char *filename, \ + unsigned line, \ + const char *section, \ + const char *lvalue, \ + int ltype, \ + const char *rvalue, \ + void *data, \ + void *userdata) { \ + \ + int r; \ + \ + assert(filename); \ + assert(lvalue); \ + assert(rvalue); \ + \ + r = func(rvalue); \ + if (r < 0) \ + log_syntax(unit, LOG_ERR, filename, line, -r, \ + "Invalid " descr "'%s': %s", \ + rvalue, strerror(-r)); \ + \ + return 0; \ + } -DEFINE_SETTER(config_parse_level2, log_set_max_level_from_string) -DEFINE_SETTER(config_parse_target, log_set_target_from_string) -DEFINE_SETTER(config_parse_color, log_show_color_from_string) -DEFINE_SETTER(config_parse_location, log_show_location_from_string) +DEFINE_SETTER(config_parse_level2, log_set_max_level_from_string, "log level") +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 *filename, - unsigned line, - const char *section, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { +static int config_parse_cpu_affinity2(const char *unit, + const char *filename, + unsigned line, + const char *section, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { char *w; size_t l; @@ -482,7 +492,8 @@ static int config_parse_cpu_affinity2( return log_oom(); if (r < 0 || cpu >= ncpus) { - log_error("[%s:%u] Failed to parse CPU affinity: %s", filename, line, rvalue); + log_syntax(unit, LOG_ERR, filename, line, -r, + "Failed to parse CPU affinity '%s'", rvalue); CPU_FREE(c); return -EBADMSG; } @@ -492,7 +503,7 @@ static int config_parse_cpu_affinity2( if (c) { if (sched_setaffinity(0, CPU_ALLOC_SIZE(ncpus), c) < 0) - log_warning("Failed to set CPU affinity: %m"); + log_warning_unit(unit, "Failed to set CPU affinity: %m"); CPU_FREE(c); } @@ -513,22 +524,19 @@ 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; } -static int config_parse_join_controllers( - const char *filename, - unsigned line, - const char *section, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { +static int config_parse_join_controllers(const char *unit, + const char *filename, + unsigned line, + const char *section, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { unsigned n = 0; char *state, *w; @@ -657,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) @@ -671,7 +679,7 @@ static int parse_config_file(void) { return 0; } - r = config_parse(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)); @@ -679,7 +687,8 @@ static int parse_config_file(void) { } static int parse_proc_cmdline(void) { - char *line, *w, *state; + _cleanup_free_ char *line = NULL; + char *w, *state; int r; size_t l; @@ -688,34 +697,27 @@ static int parse_proc_cmdline(void) { if (detect_container(NULL) > 0) return 0; - if ((r = read_one_line_file("/proc/cmdline", &line)) < 0) { + r = read_one_line_file("/proc/cmdline", &line); + if (r < 0) { log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r)); return 0; } FOREACH_WORD_QUOTED(w, l, line, state) { - char *word; + _cleanup_free_ char *word; - if (!(word = strndup(w, l))) { - r = -ENOMEM; - goto finish; - } + word = strndup(w, l); + if (!word) + return log_oom(); r = parse_proc_cmdline_word(word); if (r < 0) { log_error("Failed on cmdline argument %s: %s", word, strerror(-r)); - free(word); - goto finish; + return r; } - - free(word); } - r = 0; - -finish: - free(line); - return r; + return 0; } static int parse_argv(int argc, char *argv[]) { @@ -1216,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; } @@ -1236,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; @@ -1257,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. */ @@ -1291,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); @@ -1351,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); @@ -1360,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 */ @@ -1390,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) @@ -1607,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); @@ -1680,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);