[systemd-devel] [PATCH] systemctl: Use logind for --firmware-setup if possible

Lennart Poettering lennart at poettering.net
Wed Apr 8 10:09:10 PDT 2015


On Wed, 08.04.15 19:05, Jan Janssen (medhefgo at web.de) wrote:

> What's the point in retrying if you got EOPNOTSUPP the first time?
> :P

Well, dunno. Actually the main reason I swapped around the order of
the two ways, is to avoid whitelisting or blacklisting error
cases... I mean, there are certain cases where it makes sense to try
the other way (EPERM, EACCES, ...), and others where it clearly doesn't
(ENOTSUPP, ...), but I really wanted to avoid to list them all
here. Hence I figured we should do the cheap thing first, and then the
expensive thing, without any kind of optimizations via error code
whitelists/blacklists... If you follow what I mean...

Does that make any sense?

> 
> Jan
> 
> On 2015-04-08 18:24, Lennart Poettering wrote:
> >On Wed, 08.04.15 16:49, Jan Janssen (medhefgo at web.de) wrote:
> >
> >Awesome! Thanks!
> >
> >Applied! (Though I took the liberty to swap the order around, to first
> >try direct access, and only the fall back via logind.
> >
> >Thanks,
> >
> >Lennart
> >
> >>---
> >>  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
> >>
> >>_______________________________________________
> >>systemd-devel mailing list
> >>systemd-devel at lists.freedesktop.org
> >>http://lists.freedesktop.org/mailman/listinfo/systemd-devel
> >
> >
> >Lennart
> >


Lennart

-- 
Lennart Poettering, Red Hat


More information about the systemd-devel mailing list