]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
logind: add support for 'soft-reboot' reboots
authorLennart Poettering <lennart@poettering.net>
Thu, 27 Apr 2023 19:56:14 +0000 (21:56 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 2 Jun 2023 14:49:38 +0000 (16:49 +0200)
src/basic/login-util.h
src/login/logind-action.c
src/login/logind-action.h
src/login/logind-dbus.c

index 841fd324f1606cd541738c15e33cc1ab72f70918..613fb0f86f48d99cb33e4c19fc5050f9c081c83f 100644 (file)
@@ -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);
index c6a36a1556cdfd68e00b9a5802891d1ad2ebc1a4..42dc36b6708991e078f7d54025f35c1a5a16407e 100644 (file)
@@ -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",
index 9a01af1690881a68b66614c292de212ef9bf629c..dfef6400e930ba9101d215058cf0fa1a32b080d0 100644 (file)
@@ -9,6 +9,7 @@ typedef enum HandleAction {
         HANDLE_REBOOT,
         HANDLE_HALT,
         HANDLE_KEXEC,
+        HANDLE_SOFT_REBOOT,
         HANDLE_SUSPEND,
         HANDLE_HIBERNATE,
         HANDLE_HYBRID_SLEEP,
index c5e0fda5e5d74ee3785ff2a57a9b4a93a84d9ac7..e1e9b723c8c0129b7c472bc95b98fc7196400c6d 100644 (file)
@@ -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);