chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
main: show load profiling in test mode, too
[elogind.git]
/
src
/
main.c
diff --git
a/src/main.c
b/src/main.c
index 25b6e87de395a53257ee50cf37c7c6b4ca0bb5ca..32ccf0bd5c92039f900934347c5dfda0da6088bd 100644
(file)
--- a/
src/main.c
+++ b/
src/main.c
@@
-1020,7
+1020,11
@@
int main(int argc, char *argv[]) {
const char *shutdown_verb = NULL;
dual_timestamp initrd_timestamp = { 0ULL, 0ULL };
char systemd[] = "systemd";
const char *shutdown_verb = NULL;
dual_timestamp initrd_timestamp = { 0ULL, 0ULL };
char systemd[] = "systemd";
+ bool is_reexec = false;
+ int j;
+ bool loaded_policy = false;
+#ifdef HAVE_SYSV_COMPAT
if (getpid() != 1 && strstr(program_invocation_short_name, "init")) {
/* This is compatibility support for SysV, where
* calling init as a user is identical to telinit. */
if (getpid() != 1 && strstr(program_invocation_short_name, "init")) {
/* This is compatibility support for SysV, where
* calling init as a user is identical to telinit. */
@@
-1030,6
+1034,17
@@
int main(int argc, char *argv[]) {
log_error("Failed to exec " SYSTEMCTL_BINARY_PATH ": %m");
return 1;
}
log_error("Failed to exec " SYSTEMCTL_BINARY_PATH ": %m");
return 1;
}
+#endif
+
+ /* 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. */
+
+ for (j = 1; j < argc; j++)
+ if (streq(argv[j], "--deserialize")) {
+ break;
+ is_reexec = true;
+ }
/* If we get started via the /sbin/init symlink then we are
called 'init'. After a subsequent reexecution we are then
/* If we get started via the /sbin/init symlink then we are
called 'init'. After a subsequent reexecution we are then
@@
-1048,25
+1063,26
@@
int main(int argc, char *argv[]) {
if (getpid() == 1) {
arg_running_as = MANAGER_SYSTEM;
log_set_target(detect_container(NULL) > 0 ? LOG_TARGET_CONSOLE : LOG_TARGET_SYSLOG_OR_KMSG);
if (getpid() == 1) {
arg_running_as = MANAGER_SYSTEM;
log_set_target(detect_container(NULL) > 0 ? LOG_TARGET_CONSOLE : LOG_TARGET_SYSLOG_OR_KMSG);
- log_open();
- /* This might actually not return, but cause a
- * reexecution */
- if (selinux_setup(argv) < 0)
- goto finish;
+ if (!is_reexec)
+ if (selinux_setup(&loaded_policy) < 0)
+ goto finish;
+
+ log_open();
if (label_init() < 0)
goto finish;
if (label_init() < 0)
goto finish;
- if (hwclock_is_localtime() > 0) {
- int err, min;
+ if (!is_reexec)
+ if (hwclock_is_localtime() > 0) {
+ int min;
-
er
r = hwclock_apply_localtime_delta(&min);
-
if (er
r < 0)
-
log_error("Failed to apply local time delta: %s", strerror(-er
r));
- else
- log_info("RTC configured in localtime, applying delta of %i minutes to system time.", min);
- }
+
r = hwclock_apply_localtime_delta(&min);
+
if (
r < 0)
+
log_error("Failed to apply local time delta, ignoring: %s", strerror(-
r));
+
else
+
log_info("RTC configured in localtime, applying delta of %i minutes to system time.", min);
+
}
} else {
arg_running_as = MANAGER_USER;
} else {
arg_running_as = MANAGER_USER;
@@
-1080,7
+1096,7
@@
int main(int argc, char *argv[]) {
/* Mount /proc, /sys and friends, so that /proc/cmdline and
* /proc/$PID/fd is available. */
if (geteuid() == 0 && !getenv("SYSTEMD_SKIP_API_MOUNTS"))
/* Mount /proc, /sys and friends, so that /proc/cmdline and
* /proc/$PID/fd is available. */
if (geteuid() == 0 && !getenv("SYSTEMD_SKIP_API_MOUNTS"))
- if (mount_setup() < 0)
+ if (mount_setup(
loaded_policy
) < 0)
goto finish;
/* Reset all signal handlers. */
goto finish;
/* Reset all signal handlers. */
@@
-1177,7
+1193,7
@@
int main(int argc, char *argv[]) {
/* Reset the console, but only if this is really init and we
* are freshly booted */
if (arg_running_as == MANAGER_SYSTEM && arg_action == ACTION_RUN) {
/* Reset the console, but only if this is really init and we
* are freshly booted */
if (arg_running_as == MANAGER_SYSTEM && arg_action == ACTION_RUN) {
- console_setup(getpid() == 1 && !
serialization
);
+ console_setup(getpid() == 1 && !
is_reexec
);
make_null_stdio();
}
make_null_stdio();
}
@@
-1192,7
+1208,7
@@
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 "; " DISTRIBUTION ")", manager_running_as_to_string(arg_running_as));
log_full(arg_running_as == MANAGER_SYSTEM ? LOG_INFO : LOG_DEBUG,
PACKAGE_STRING " running in %s mode. (" SYSTEMD_FEATURES "; " DISTRIBUTION ")", manager_running_as_to_string(arg_running_as));
- if (arg_running_as == MANAGER_SYSTEM && !
serialization
) {
+ if (arg_running_as == MANAGER_SYSTEM && !
is_reexec
) {
locale_setup();
if (arg_show_status || plymouth_running())
locale_setup();
if (arg_show_status || plymouth_running())
@@
-1290,6
+1306,11
@@
int main(int argc, char *argv[]) {
goto finish;
}
goto finish;
}
+ 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));
+
if (arg_action == ACTION_TEST) {
printf("-> By jobs:\n");
manager_dump_jobs(m, stdout, "\t");
if (arg_action == ACTION_TEST) {
printf("-> By jobs:\n");
manager_dump_jobs(m, stdout, "\t");
@@
-1298,10
+1319,6
@@
int main(int argc, char *argv[]) {
}
}
}
}
- after_startup = now(CLOCK_MONOTONIC);
- log_debug("Loaded units and determined initial transaction in %s.",
- format_timespan(timespan, sizeof(timespan), after_startup - before_startup));
-
for (;;) {
if ((r = manager_loop(m)) < 0) {
log_error("Failed to run mainloop: %s", strerror(-r));
for (;;) {
if ((r = manager_loop(m)) < 0) {
log_error("Failed to run mainloop: %s", strerror(-r));