116 lines
4.4 KiB
Diff
116 lines
4.4 KiB
Diff
From 8b34041ee97069bee8bf03ae5ba651b34b1b8460 Mon Sep 17 00:00:00 2001
|
|
From: Lennart Poettering <lennart@poettering.net>
|
|
Date: Tue, 26 Mar 2019 15:20:26 +0100
|
|
Subject: [PATCH] systemctl: replace switch statement by table of structures
|
|
|
|
(cherry picked from commit c45e5fb877033c9e3f9b79121644ed71032af379)
|
|
|
|
Related: #846319
|
|
---
|
|
src/systemctl/systemctl.c | 68 ++++++++++++---------------------------
|
|
1 file changed, 21 insertions(+), 47 deletions(-)
|
|
|
|
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
|
|
index e963f19b0a..04e24691d8 100644
|
|
--- a/src/systemctl/systemctl.c
|
|
+++ b/src/systemctl/systemctl.c
|
|
@@ -3179,64 +3179,38 @@ static int logind_set_wall_message(void) {
|
|
}
|
|
#endif
|
|
|
|
-/* Ask systemd-logind, which might grant access to unprivileged users
|
|
- * through PolicyKit */
|
|
+/* Ask systemd-logind, which might grant access to unprivileged users through polkit */
|
|
static int logind_reboot(enum action a) {
|
|
#if ENABLE_LOGIND
|
|
+ static const struct {
|
|
+ const char *method;
|
|
+ const char *description;
|
|
+ } actions[_ACTION_MAX] = {
|
|
+ [ACTION_POWEROFF] = { "PowerOff", "power off system" },
|
|
+ [ACTION_REBOOT] = { "Reboot", "reboot system" },
|
|
+ [ACTION_HALT] = { "Halt", "halt system" },
|
|
+ [ACTION_SUSPEND] = { "Suspend", "suspend system" },
|
|
+ [ACTION_HIBERNATE] = { "Hibernate", "hibernate system" },
|
|
+ [ACTION_HYBRID_SLEEP] = { "HybridSleep", "put system into hybrid sleep" },
|
|
+ [ACTION_SUSPEND_THEN_HIBERNATE] = { "SuspendThenHibernate", "suspend system, hibernate later" },
|
|
+ };
|
|
+
|
|
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
|
|
- const char *method, *description;
|
|
sd_bus *bus;
|
|
int r;
|
|
|
|
+ if (a < 0 || a >= _ACTION_MAX || !actions[a].method)
|
|
+ return -EINVAL;
|
|
+
|
|
r = acquire_bus(BUS_FULL, &bus);
|
|
if (r < 0)
|
|
return r;
|
|
|
|
- switch (a) {
|
|
-
|
|
- case ACTION_POWEROFF:
|
|
- method = "PowerOff";
|
|
- description = "power off system";
|
|
- break;
|
|
-
|
|
- case ACTION_REBOOT:
|
|
- method = "Reboot";
|
|
- description = "reboot system";
|
|
- break;
|
|
-
|
|
- case ACTION_HALT:
|
|
- method = "Halt";
|
|
- description = "halt system";
|
|
- break;
|
|
-
|
|
- case ACTION_SUSPEND:
|
|
- method = "Suspend";
|
|
- description = "suspend system";
|
|
- break;
|
|
-
|
|
- case ACTION_HIBERNATE:
|
|
- method = "Hibernate";
|
|
- description = "hibernate system";
|
|
- break;
|
|
-
|
|
- case ACTION_HYBRID_SLEEP:
|
|
- method = "HybridSleep";
|
|
- description = "put system into hybrid sleep";
|
|
- break;
|
|
-
|
|
- case ACTION_SUSPEND_THEN_HIBERNATE:
|
|
- method = "SuspendThenHibernate";
|
|
- description = "put system into suspend followed by hibernate";
|
|
- break;
|
|
-
|
|
- default:
|
|
- return -EINVAL;
|
|
- }
|
|
-
|
|
polkit_agent_open_maybe();
|
|
(void) logind_set_wall_message();
|
|
|
|
- log_debug("%s org.freedesktop.login1.Manager %s dbus call.", arg_dry_run ? "Would execute" : "Executing", method);
|
|
+ log_debug("%s org.freedesktop.login1.Manager %s dbus call.", arg_dry_run ? "Would execute" : "Executing", actions[a].method);
|
|
+
|
|
if (arg_dry_run)
|
|
return 0;
|
|
|
|
@@ -3245,12 +3219,12 @@ static int logind_reboot(enum action a) {
|
|
"org.freedesktop.login1",
|
|
"/org/freedesktop/login1",
|
|
"org.freedesktop.login1.Manager",
|
|
- method,
|
|
+ actions[a].method,
|
|
&error,
|
|
NULL,
|
|
"b", arg_ask_password);
|
|
if (r < 0)
|
|
- return log_error_errno(r, "Failed to %s via logind: %s", description, bus_error_message(&error, r));
|
|
+ return log_error_errno(r, "Failed to %s via logind: %s", actions[a].description, bus_error_message(&error, r));
|
|
|
|
return 0;
|
|
#else
|