[gnome-session: 1/2] Add methods and backend to support RebootToFirmwareSetup
- From: Ray Strode <halfline src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-session: 1/2] Add methods and backend to support RebootToFirmwareSetup
- Date: Tue, 14 Aug 2018 14:35:14 +0000 (UTC)
commit 5e0042843230c4aa97d5caa34cd789bee3766f20
Author: Carlo Caione <carlo endlessm com>
Date: Fri Jul 20 18:59:32 2018 +0100
Add methods and backend to support RebootToFirmwareSetup
Add two new methods (SetRebootToFirmwareSetup and
CanRebootToFirmwareSetup) to the D-Bus interface to support rebooting
into setup mode. The idea is to present the user with a new option when
rebooting allowing to reboot into the firmware setup interface.
gnome-session/gsm-manager.c | 36 ++++++++++++++++++
gnome-session/gsm-system.c | 15 ++++++++
gnome-session/gsm-system.h | 8 ++++
gnome-session/gsm-systemd.c | 61 ++++++++++++++++++++++++++++++
gnome-session/org.gnome.SessionManager.xml | 27 +++++++++++++
5 files changed, 147 insertions(+)
---
diff --git a/gnome-session/gsm-manager.c b/gnome-session/gsm-manager.c
index 3cf421cd..6eeea4a6 100644
--- a/gnome-session/gsm-manager.c
+++ b/gnome-session/gsm-manager.c
@@ -2537,6 +2537,38 @@ gsm_manager_can_shutdown (GsmExportedManager *skeleton,
return TRUE;
}
+static gboolean
+gsm_manager_can_reboot_to_firmware_setup (GsmExportedManager *skeleton,
+ GDBusMethodInvocation *invocation,
+ GsmManager *manager)
+{
+ gboolean reboot_to_firmware_available;
+
+ g_debug ("GsmManager: CanRebootToFirmwareSetup called");
+
+ reboot_to_firmware_available = !_log_out_is_locked_down (manager) &&
+ gsm_system_can_restart_to_firmware_setup (manager->priv->system);
+
+ gsm_exported_manager_complete_can_reboot_to_firmware_setup (skeleton, invocation,
reboot_to_firmware_available);
+
+ return TRUE;
+}
+
+static gboolean
+gsm_manager_set_reboot_to_firmware_setup (GsmExportedManager *skeleton,
+ GDBusMethodInvocation *invocation,
+ gboolean enable,
+ GsmManager *manager)
+{
+ g_debug ("GsmManager: SetRebootToFirmwareSetup called");
+
+ gsm_system_set_restart_to_firmware_setup (manager->priv->system, enable);
+
+ gsm_exported_manager_complete_set_reboot_to_firmware_setup (skeleton, invocation);
+
+ return TRUE;
+}
+
static gboolean
gsm_manager_setenv (GsmExportedManager *skeleton,
GDBusMethodInvocation *invocation,
@@ -3124,6 +3156,8 @@ register_manager (GsmManager *manager)
exit (1);
}
+ g_signal_connect (skeleton, "handle-can-reboot-to-firmware-setup",
+ G_CALLBACK (gsm_manager_can_reboot_to_firmware_setup), manager);
g_signal_connect (skeleton, "handle-can-shutdown",
G_CALLBACK (gsm_manager_can_shutdown), manager);
g_signal_connect (skeleton, "handle-get-clients",
@@ -3148,6 +3182,8 @@ register_manager (GsmManager *manager)
G_CALLBACK (gsm_manager_reboot), manager);
g_signal_connect (skeleton, "handle-register-client",
G_CALLBACK (gsm_manager_register_client), manager);
+ g_signal_connect (skeleton, "handle-set-reboot-to-firmware-setup",
+ G_CALLBACK (gsm_manager_set_reboot_to_firmware_setup), manager);
g_signal_connect (skeleton, "handle-setenv",
G_CALLBACK (gsm_manager_setenv), manager);
g_signal_connect (skeleton, "handle-shutdown",
diff --git a/gnome-session/gsm-system.c b/gnome-session/gsm-system.c
index a78409d6..4ce20c1d 100644
--- a/gnome-session/gsm-system.c
+++ b/gnome-session/gsm-system.c
@@ -85,6 +85,8 @@ gsm_system_null_init_iface (GsmSystemInterface *iface)
iface->can_switch_user = (void *) return_false;
iface->can_stop = (void *) return_false;
iface->can_restart = (void *) return_false;
+ iface->can_restart_to_firmware_setup = (void *) return_false;
+ iface->set_restart_to_firmware_setup = (void *) do_nothing;
iface->can_suspend = (void *) return_false;
iface->can_hibernate = (void *) return_false;
iface->attempt_stop = (void *) do_nothing;
@@ -155,6 +157,19 @@ gsm_system_can_restart (GsmSystem *system)
return GSM_SYSTEM_GET_IFACE (system)->can_restart (system);
}
+gboolean
+gsm_system_can_restart_to_firmware_setup (GsmSystem *system)
+{
+ return GSM_SYSTEM_GET_IFACE (system)->can_restart_to_firmware_setup (system);
+}
+
+void
+gsm_system_set_restart_to_firmware_setup (GsmSystem *system,
+ gboolean enable)
+{
+ GSM_SYSTEM_GET_IFACE (system)->set_restart_to_firmware_setup (system, enable);
+}
+
gboolean
gsm_system_can_suspend (GsmSystem *system)
{
diff --git a/gnome-session/gsm-system.h b/gnome-session/gsm-system.h
index 3a34b508..b25ee61a 100644
--- a/gnome-session/gsm-system.h
+++ b/gnome-session/gsm-system.h
@@ -53,6 +53,9 @@ struct _GsmSystemInterface
gboolean (* can_switch_user) (GsmSystem *system);
gboolean (* can_stop) (GsmSystem *system);
gboolean (* can_restart) (GsmSystem *system);
+ gboolean (* can_restart_to_firmware_setup) (GsmSystem *system);
+ void (* set_restart_to_firmware_setup) (GsmSystem *system,
+ gboolean enable);
gboolean (* can_suspend) (GsmSystem *system);
gboolean (* can_hibernate) (GsmSystem *system);
void (* attempt_stop) (GsmSystem *system);
@@ -90,6 +93,11 @@ gboolean gsm_system_can_stop (GsmSystem *system);
gboolean gsm_system_can_restart (GsmSystem *system);
+gboolean gsm_system_can_restart_to_firmware_setup (GsmSystem *system);
+
+void gsm_system_set_restart_to_firmware_setup (GsmSystem *system,
+ gboolean enable);
+
gboolean gsm_system_can_suspend (GsmSystem *system);
gboolean gsm_system_can_hibernate (GsmSystem *system);
diff --git a/gnome-session/gsm-systemd.c b/gnome-session/gsm-systemd.c
index f42767ad..ac72f546 100644
--- a/gnome-session/gsm-systemd.c
+++ b/gnome-session/gsm-systemd.c
@@ -530,6 +530,65 @@ gsm_systemd_can_restart (GsmSystem *system)
return can_restart;
}
+static gboolean
+gsm_systemd_can_restart_to_firmware_setup (GsmSystem *system)
+{
+ GsmSystemd *manager = GSM_SYSTEMD (system);
+ const gchar *rv;
+ GVariant *res;
+ gboolean can_restart;
+ GError *error = NULL;
+
+ res = g_dbus_proxy_call_sync (manager->priv->sd_proxy,
+ "CanRebootToFirmwareSetup",
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ G_MAXINT,
+ NULL,
+ &error);
+ if (!res) {
+ g_warning ("Calling CanRebootToFirmwareSetup failed. Check that logind is "
+ "properly installed and pam_systemd is getting used at login: %s",
+ error->message);
+ g_error_free (error);
+ return FALSE;
+ }
+
+ g_variant_get (res, "(&s)", &rv);
+
+ can_restart = g_strcmp0 (rv, "yes") == 0 ||
+ g_strcmp0 (rv, "challenge") == 0;
+
+ g_variant_unref (res);
+
+ return can_restart;
+}
+
+static void
+gsm_systemd_set_restart_to_firmware_setup (GsmSystem *system,
+ gboolean enable)
+{
+ GsmSystemd *manager = GSM_SYSTEMD (system);
+ GVariant *res;
+ GError *error = NULL;
+
+ res = g_dbus_proxy_call_sync (manager->priv->sd_proxy,
+ "SetRebootToFirmwareSetup",
+ g_variant_new ("(b)", enable),
+ G_DBUS_CALL_FLAGS_NONE,
+ G_MAXINT,
+ NULL,
+ &error);
+ if (!res) {
+ g_warning ("Calling SetRebootToFirmwareSetup failed. Check that logind is "
+ "properly installed and pam_systemd is getting used at login: %s",
+ error->message);
+ g_error_free (error);
+ }
+
+ g_variant_unref (res);
+}
+
static gboolean
gsm_systemd_can_stop (GsmSystem *system)
{
@@ -957,6 +1016,8 @@ gsm_systemd_system_init (GsmSystemInterface *iface)
iface->can_switch_user = gsm_systemd_can_switch_user;
iface->can_stop = gsm_systemd_can_stop;
iface->can_restart = gsm_systemd_can_restart;
+ iface->can_restart_to_firmware_setup = gsm_systemd_can_restart_to_firmware_setup;
+ iface->set_restart_to_firmware_setup = gsm_systemd_set_restart_to_firmware_setup;
iface->can_suspend = gsm_systemd_can_suspend;
iface->can_hibernate = gsm_systemd_can_hibernate;
iface->attempt_stop = gsm_systemd_attempt_stop;
diff --git a/gnome-session/org.gnome.SessionManager.xml b/gnome-session/org.gnome.SessionManager.xml
index 580ec356..51eed3a2 100644
--- a/gnome-session/org.gnome.SessionManager.xml
+++ b/gnome-session/org.gnome.SessionManager.xml
@@ -296,6 +296,33 @@
</doc:doc>
</method>
+ <method name="SetRebootToFirmwareSetup">
+ <arg name="enable" direction="in" type="b">
+ <doc:doc>
+ <doc:summary>Whether we should reboot into setup</doc:summary>
+ </doc:doc>
+ </arg>
+ <doc:doc>
+ <doc:description>
+ <doc:para>Allows the caller to indicate to the system's firmware to boot into setup mode</doc:para>
+ </doc:description>
+ </doc:doc>
+ </method>
+
+ <method name="CanRebootToFirmwareSetup">
+ <arg name="is_available" direction="out" type="b">
+ <doc:doc>
+ <doc:summary>True if boot into setup mode is available to the user, false otherwise</doc:summary>
+ </doc:doc>
+ </arg>
+ <doc:doc>
+ <doc:description>
+ <doc:para>Allows the caller to determine whether or not it's okay to show
+ a reboot to firmware option in the UI</doc:para>
+ </doc:description>
+ </doc:doc>
+ </method>
+
<method name="Logout">
<arg name="mode" type="u" direction="in">
<doc:doc>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]