From: Lennart Poettering Date: Thu, 27 Apr 2023 19:56:14 +0000 (+0200) Subject: logind: add support for 'soft-reboot' reboots X-Git-Tag: v254-rc1~298^2~12 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9edf5af57bdfd2de1ef32f2f3d3609b917d5cedf;p=thirdparty%2Fsystemd.git logind: add support for 'soft-reboot' reboots --- diff --git a/src/basic/login-util.h b/src/basic/login-util.h index 841fd324f16..613fb0f86f4 100644 --- a/src/basic/login-util.h +++ b/src/basic/login-util.h @@ -6,11 +6,12 @@ #define SD_LOGIND_ROOT_CHECK_INHIBITORS (UINT64_C(1) << 0) #define SD_LOGIND_REBOOT_VIA_KEXEC (UINT64_C(1) << 1) +#define SD_LOGIND_SOFT_REBOOT (UINT64_C(1) << 2) /* For internal use only */ #define SD_LOGIND_INTERACTIVE (UINT64_C(1) << 63) -#define SD_LOGIND_SHUTDOWN_AND_SLEEP_FLAGS_PUBLIC (SD_LOGIND_ROOT_CHECK_INHIBITORS|SD_LOGIND_REBOOT_VIA_KEXEC) +#define SD_LOGIND_SHUTDOWN_AND_SLEEP_FLAGS_PUBLIC (SD_LOGIND_ROOT_CHECK_INHIBITORS|SD_LOGIND_REBOOT_VIA_KEXEC|SD_LOGIND_SOFT_REBOOT) #define SD_LOGIND_SHUTDOWN_AND_SLEEP_FLAGS_ALL (SD_LOGIND_SHUTDOWN_AND_SLEEP_FLAGS_PUBLIC|SD_LOGIND_INTERACTIVE) bool session_id_valid(const char *id); diff --git a/src/login/logind-action.c b/src/login/logind-action.c index c6a36a1556c..42dc36b6708 100644 --- a/src/login/logind-action.c +++ b/src/login/logind-action.c @@ -67,6 +67,18 @@ static const HandleActionData handle_action_data_table[_HANDLE_ACTION_MAX] = { .message = "System is rebooting with kexec", .log_verb = "kexec", }, + [HANDLE_SOFT_REBOOT] = { + .handle = HANDLE_SOFT_REBOOT, + .target = SPECIAL_SOFT_REBOOT_TARGET, + .inhibit_what = INHIBIT_SHUTDOWN, + .polkit_action = "org.freedesktop.login1.reboot", + .polkit_action_multiple_sessions = "org.freedesktop.login1.reboot-multiple-sessions", + .polkit_action_ignore_inhibit = "org.freedesktop.login1.reboot-ignore-inhibit", + .sleep_operation = _SLEEP_OPERATION_INVALID, + .message_id = SD_MESSAGE_SHUTDOWN_STR, + .message = "System userspace is rebooting", + .log_verb = "soft-reboot", + }, [HANDLE_SUSPEND] = { .handle = HANDLE_SUSPEND, .target = SPECIAL_SUSPEND_TARGET, @@ -133,6 +145,7 @@ int manager_handle_action( [HANDLE_REBOOT] = "Rebooting...", [HANDLE_HALT] = "Halting...", [HANDLE_KEXEC] = "Rebooting via kexec...", + [HANDLE_SOFT_REBOOT] = "Rebooting userspace...", [HANDLE_SUSPEND] = "Suspending...", [HANDLE_HIBERNATE] = "Hibernating...", [HANDLE_HYBRID_SLEEP] = "Hibernating and suspending...", @@ -257,6 +270,7 @@ static const char* const handle_action_verb_table[_HANDLE_ACTION_MAX] = { [HANDLE_REBOOT] = "reboot", [HANDLE_HALT] = "halt", [HANDLE_KEXEC] = "kexec", + [HANDLE_SOFT_REBOOT] = "soft-reboot", [HANDLE_SUSPEND] = "suspend", [HANDLE_HIBERNATE] = "hibernate", [HANDLE_HYBRID_SLEEP] = "enter hybrid sleep", @@ -273,6 +287,7 @@ static const char* const handle_action_table[_HANDLE_ACTION_MAX] = { [HANDLE_REBOOT] = "reboot", [HANDLE_HALT] = "halt", [HANDLE_KEXEC] = "kexec", + [HANDLE_SOFT_REBOOT] = "soft-reboot", [HANDLE_SUSPEND] = "suspend", [HANDLE_HIBERNATE] = "hibernate", [HANDLE_HYBRID_SLEEP] = "hybrid-sleep", diff --git a/src/login/logind-action.h b/src/login/logind-action.h index 9a01af16908..dfef6400e93 100644 --- a/src/login/logind-action.h +++ b/src/login/logind-action.h @@ -9,6 +9,7 @@ typedef enum HandleAction { HANDLE_REBOOT, HANDLE_HALT, HANDLE_KEXEC, + HANDLE_SOFT_REBOOT, HANDLE_SUSPEND, HANDLE_HIBERNATE, HANDLE_HYBRID_SLEEP, diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c index c5e0fda5e5d..e1e9b723c8c 100644 --- a/src/login/logind-dbus.c +++ b/src/login/logind-dbus.c @@ -1860,9 +1860,19 @@ static int method_do_shutdown_or_sleep( if ((flags & ~SD_LOGIND_SHUTDOWN_AND_SLEEP_FLAGS_PUBLIC) != 0) return sd_bus_error_set(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid flags parameter"); - if (a->handle != HANDLE_REBOOT && (flags & SD_LOGIND_REBOOT_VIA_KEXEC)) + + if (FLAGS_SET(flags, (SD_LOGIND_REBOOT_VIA_KEXEC|SD_LOGIND_SOFT_REBOOT))) return sd_bus_error_set(error, SD_BUS_ERROR_INVALID_ARGS, - "Reboot via kexec is only applicable with reboot operations"); + "Both reboot via kexec and soft reboot selected, which is not supported"); + + if (a->handle != HANDLE_REBOOT) { + if (flags & SD_LOGIND_REBOOT_VIA_KEXEC) + return sd_bus_error_set(error, SD_BUS_ERROR_INVALID_ARGS, + "Reboot via kexec option is only applicable with reboot operations"); + if (flags & SD_LOGIND_SOFT_REBOOT) + return sd_bus_error_set(error, SD_BUS_ERROR_INVALID_ARGS, + "Soft reboot option is only applicable with reboot operations"); + } } else { /* Old style method: no flags parameter, but interactive bool passed as boolean in * payload. Let's convert this argument to the new-style flags parameter for our internal @@ -1878,6 +1888,8 @@ static int method_do_shutdown_or_sleep( if ((flags & SD_LOGIND_REBOOT_VIA_KEXEC) && kexec_loaded()) a = handle_action_lookup(HANDLE_KEXEC); + else if ((flags & SD_LOGIND_SOFT_REBOOT)) + a = handle_action_lookup(HANDLE_SOFT_REBOOT); /* Don't allow multiple jobs being executed at the same time */ if (m->delayed_action) @@ -2221,7 +2233,7 @@ static int method_schedule_shutdown(sd_bus_message *message, void *userdata, sd_ } handle = handle_action_from_string(type); - if (!IN_SET(handle, HANDLE_POWEROFF, HANDLE_REBOOT, HANDLE_HALT, HANDLE_KEXEC)) + if (!IN_SET(handle, HANDLE_POWEROFF, HANDLE_REBOOT, HANDLE_SOFT_REBOOT, HANDLE_HALT, HANDLE_KEXEC)) return sd_bus_error_set(error, SD_BUS_ERROR_INVALID_ARGS, "Unsupported shutdown type"); a = handle_action_lookup(handle);