1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 Copyright © 2017 Felipe Sateler
10 #include "bus-error.h"
13 #include "process-util.h"
15 #include "signal-util.h"
17 static int reload_manager(sd_bus
*bus
) {
18 _cleanup_(sd_bus_error_free
) sd_bus_error error
= SD_BUS_ERROR_NULL
;
19 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*m
= NULL
;
22 log_info("Reloading system manager configuration");
24 r
= sd_bus_message_new_method_call(
27 "org.freedesktop.systemd1",
28 "/org/freedesktop/systemd1",
29 "org.freedesktop.systemd1.Manager",
32 return bus_log_create_error(r
);
34 /* Note we use an extra-long timeout here. This is because a reload or reexec means generators are rerun which
35 * are timed out after DEFAULT_TIMEOUT_USEC. Let's use twice that time here, so that the generators can have
36 * their timeout, and for everything else there's the same time budget in place. */
38 r
= sd_bus_call(bus
, m
, DEFAULT_TIMEOUT_USEC
* 2, &error
, NULL
);
40 return log_error_errno(r
, "Failed to reload daemon: %s", bus_error_message(&error
, r
));
45 static int start_default_target(sd_bus
*bus
) {
46 _cleanup_(sd_bus_error_free
) sd_bus_error error
= SD_BUS_ERROR_NULL
;
49 log_info("Starting default target");
51 /* Start these units only if we can replace base.target with it */
52 r
= sd_bus_call_method(bus
,
53 "org.freedesktop.systemd1",
54 "/org/freedesktop/systemd1",
55 "org.freedesktop.systemd1.Manager",
59 "ss", "default.target", "isolate");
62 log_error("Failed to start default target: %s", bus_error_message(&error
, r
));
67 static int fork_wait(const char* const cmdline
[]) {
71 r
= safe_fork("(sulogin)", FORK_RESET_SIGNALS
|FORK_DEATHSIG
|FORK_LOG
, &pid
);
76 execv(cmdline
[0], (char**) cmdline
);
77 log_error_errno(errno
, "Failed to execute %s: %m", cmdline
[0]);
78 _exit(EXIT_FAILURE
); /* Operational error */
81 return wait_for_terminate_and_check(cmdline
[0], pid
, WAIT_LOG_ABNORMAL
);
84 static void print_mode(const char* mode
) {
85 printf("You are in %s mode. After logging in, type \"journalctl -xb\" to view\n"
86 "system logs, \"systemctl reboot\" to reboot, \"systemctl default\" or \"exit\"\n"
87 "to boot into default mode.\n", mode
);
91 int main(int argc
, char *argv
[]) {
92 static const char* const sulogin_cmdline
[] = {SULOGIN
, NULL
};
93 _cleanup_(sd_bus_flush_close_unrefp
) sd_bus
*bus
= NULL
;
96 log_set_target(LOG_TARGET_AUTO
);
97 log_parse_environment();
100 print_mode(argc
> 1 ? argv
[1] : "");
102 (void) fork_wait(sulogin_cmdline
);
104 r
= bus_connect_system_systemd(&bus
);
106 log_warning_errno(r
, "Failed to get D-Bus connection: %m");
109 (void) reload_manager(bus
);
111 r
= start_default_target(bus
);
114 return r
>= 0 ? EXIT_SUCCESS
: EXIT_FAILURE
;