[systemd-devel] [PATCH] systemctl: Use logind for --firmware-setup if possible
Jan Janssen
medhefgo at web.de
Wed Apr 8 07:49:25 PDT 2015
---
src/systemctl/systemctl.c | 43 ++++++++++++++++++++++++++++++++++++++-----
1 file changed, 38 insertions(+), 5 deletions(-)
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index ae87e44..caa8d07 100644
--- a/src/systemctl/systemctl.c
+++ b/src/systemctl/systemctl.c
@@ -2913,6 +2913,41 @@ static int check_inhibitors(sd_bus *bus, enum action a) {
#endif
}
+static int prepare_firmware_setup(sd_bus *bus) {
+ int r;
+ _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
+
+ if (!arg_firmware_setup)
+ return 0;
+
+#ifdef HAVE_LOGIND
+ r = sd_bus_call_method(
+ bus,
+ "org.freedesktop.login1",
+ "/org/freedesktop/login1",
+ "org.freedesktop.login1.Manager",
+ "SetRebootToFirmwareSetup",
+ &error,
+ NULL,
+ "b", true);
+ if (r < 0)
+ log_error("Cannot indicate to EFI to boot into setup mode: %s", bus_error_message(&error, r));
+
+ /* No point trying to fall back. */
+ if (r == -EOPNOTSUPP)
+ return r;
+#endif
+
+ if (arg_transport != BUS_TRANSPORT_LOCAL)
+ return log_error_errno(-EINVAL, "Cannot remotely indicate to EFI to boot into setup mode.");
+
+ r = efi_set_reboot_to_firmware(true);
+ if (r < 0)
+ return log_error_errno(r, "Cannot indicate to EFI to boot into setup mode: %m");
+
+ return 0;
+}
+
static int start_special(sd_bus *bus, char **args) {
enum action a;
int r;
@@ -2930,11 +2965,9 @@ static int start_special(sd_bus *bus, char **args) {
return -EPERM;
}
- if (arg_firmware_setup) {
- r = efi_set_reboot_to_firmware(true);
- if (r < 0)
- return log_error_errno(r, "Cannot indicate to EFI to boot into setup mode: %m");
- }
+ r = prepare_firmware_setup(bus);
+ if (r < 0)
+ return r;
if (a == ACTION_REBOOT && args[1]) {
r = update_reboot_param_file(args[1]);
--
2.3.5
More information about the systemd-devel
mailing list