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