Blame SOURCES/0002-common-Add-API-to-reload-settings-from-disk.patch

84adb8
From d3e073fa1cd314b344db1ec22f0add2702a6c299 Mon Sep 17 00:00:00 2001
84adb8
From: Ray Strode <rstrode@redhat.com>
84adb8
Date: Tue, 15 Feb 2022 14:33:22 -0500
84adb8
Subject: [PATCH 2/4] common: Add API to reload settings from disk
84adb8
84adb8
Ideally we would reread /run/gdm/custom.conf after we've decided
84adb8
graphics setup is complete.  This is because the file may not
84adb8
get written out by udev until after GDM is already started and waiting.
84adb8
84adb8
As a first step to get there, this commit adds an API for rereading
84adb8
the file, and changes the SIGHUP handler to use it (instead of
84adb8
the complete teardown and reinitialization it was doing before).
84adb8
---
84adb8
 common/gdm-settings-direct.c |  9 +++++++++
84adb8
 common/gdm-settings-direct.h |  2 ++
84adb8
 common/gdm-settings.c        | 14 ++++++++++++--
84adb8
 common/gdm-settings.h        |  1 +
84adb8
 daemon/main.c                | 12 ++----------
84adb8
 5 files changed, 26 insertions(+), 12 deletions(-)
84adb8
84adb8
diff --git a/common/gdm-settings-direct.c b/common/gdm-settings-direct.c
84adb8
index ddb31908..5fbe0326 100644
84adb8
--- a/common/gdm-settings-direct.c
84adb8
+++ b/common/gdm-settings-direct.c
84adb8
@@ -224,35 +224,44 @@ hashify_list (GdmSettingsEntry *entry,
84adb8
 
84adb8
 gboolean
84adb8
 gdm_settings_direct_init (GdmSettings *settings,
84adb8
                           const char  *file,
84adb8
                           const char  *root)
84adb8
 {
84adb8
         GSList  *list;
84adb8
 
84adb8
         g_return_val_if_fail (file != NULL, FALSE);
84adb8
         g_return_val_if_fail (root != NULL, FALSE);
84adb8
 
84adb8
         g_debug ("Settings Direct Init");
84adb8
         if (schemas != NULL) {
84adb8
                 g_hash_table_unref (schemas);
84adb8
                 schemas = NULL;
84adb8
         }
84adb8
 
84adb8
         if (! gdm_settings_parse_schemas (file, root, &list)) {
84adb8
                 g_warning ("Unable to parse schemas");
84adb8
                 return FALSE;
84adb8
         }
84adb8
 
84adb8
         schemas = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify)gdm_settings_entry_free);
84adb8
         g_slist_foreach (list, (GFunc)hashify_list, NULL);
84adb8
 
84adb8
         settings_object = settings;
84adb8
 
84adb8
         return TRUE;
84adb8
 }
84adb8
 
84adb8
+void
84adb8
+gdm_settings_direct_reload (void)
84adb8
+{
84adb8
+    if (!settings_object)
84adb8
+            return;
84adb8
+
84adb8
+    gdm_settings_reload (settings_object);
84adb8
+}
84adb8
+
84adb8
 void
84adb8
 gdm_settings_direct_shutdown (void)
84adb8
 {
84adb8
 
84adb8
 }
84adb8
diff --git a/common/gdm-settings-direct.h b/common/gdm-settings-direct.h
84adb8
index 156489cd..6754955f 100644
84adb8
--- a/common/gdm-settings-direct.h
84adb8
+++ b/common/gdm-settings-direct.h
84adb8
@@ -3,48 +3,50 @@
84adb8
  * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
84adb8
  *
84adb8
  * This program is free software; you can redistribute it and/or modify
84adb8
  * it under the terms of the GNU General Public License as published by
84adb8
  * the Free Software Foundation; either version 2 of the License, or
84adb8
  * (at your option) any later version.
84adb8
  *
84adb8
  * This program is distributed in the hope that it will be useful,
84adb8
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
84adb8
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
84adb8
  * GNU General Public License for more details.
84adb8
  *
84adb8
  * You should have received a copy of the GNU General Public License
84adb8
  * along with this program; if not, write to the Free Software
84adb8
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
84adb8
  *
84adb8
  */
84adb8
 
84adb8
 
84adb8
 #ifndef __GDM_SETTINGS_DIRECT_H
84adb8
 #define __GDM_SETTINGS_DIRECT_H
84adb8
 
84adb8
 #include <glib-object.h>
84adb8
 #include "gdm-settings.h"
84adb8
 
84adb8
 G_BEGIN_DECLS
84adb8
 
84adb8
 gboolean              gdm_settings_direct_init                       (GdmSettings       *settings,
84adb8
                                                                       const char        *schemas_file,
84adb8
                                                                       const char        *root);
84adb8
+
84adb8
+void                  gdm_settings_direct_reload                     (void);
84adb8
 void                  gdm_settings_direct_shutdown                   (void);
84adb8
 
84adb8
 gboolean              gdm_settings_direct_get                        (const char        *key,
84adb8
                                                                       GValue            *value);
84adb8
 gboolean              gdm_settings_direct_set                        (const char        *key,
84adb8
                                                                       GValue            *value);
84adb8
 gboolean              gdm_settings_direct_get_int                    (const char        *key,
84adb8
                                                                       int               *value);
84adb8
 gboolean              gdm_settings_direct_get_uint                   (const char        *key,
84adb8
                                                                       uint              *value);
84adb8
 gboolean              gdm_settings_direct_get_boolean                (const char        *key,
84adb8
                                                                       gboolean          *value);
84adb8
 gboolean              gdm_settings_direct_get_string                 (const char        *key,
84adb8
                                                                       char             **value);
84adb8
 
84adb8
 G_END_DECLS
84adb8
 
84adb8
 #endif /* __GDM_SETTINGS_DIRECT_H */
84adb8
diff --git a/common/gdm-settings.c b/common/gdm-settings.c
84adb8
index e6f46ec3..96c2f8d3 100644
84adb8
--- a/common/gdm-settings.c
84adb8
+++ b/common/gdm-settings.c
84adb8
@@ -157,84 +157,94 @@ gdm_settings_class_init (GdmSettingsClass *klass)
84adb8
         object_class->finalize = gdm_settings_finalize;
84adb8
 
84adb8
         signals [VALUE_CHANGED] =
84adb8
                 g_signal_new ("value-changed",
84adb8
                               G_TYPE_FROM_CLASS (object_class),
84adb8
                               G_SIGNAL_RUN_LAST,
84adb8
                               0,
84adb8
                               NULL,
84adb8
                               NULL,
84adb8
                               g_cclosure_marshal_generic,
84adb8
                               G_TYPE_NONE,
84adb8
                               3,
84adb8
                               G_TYPE_STRING,
84adb8
                               G_TYPE_STRING,
84adb8
                               G_TYPE_STRING);
84adb8
 }
84adb8
 
84adb8
 static void
84adb8
 backend_value_changed (GdmSettingsBackend *backend,
84adb8
                        const char         *key,
84adb8
                        const char         *old_value,
84adb8
                        const char         *new_value,
84adb8
                        GdmSettings        *settings)
84adb8
 {
84adb8
         g_debug ("Emitting value-changed %s %s %s", key, old_value, new_value);
84adb8
 
84adb8
         /* proxy it to internal listeners */
84adb8
         g_signal_emit (settings, signals [VALUE_CHANGED], 0, key, old_value, new_value);
84adb8
 }
84adb8
 
84adb8
-static void
84adb8
-gdm_settings_init (GdmSettings *settings)
84adb8
+void
84adb8
+gdm_settings_reload (GdmSettings *settings)
84adb8
 {
84adb8
         GList *l;
84adb8
         GdmSettingsBackend *backend;
84adb8
 
84adb8
+        g_list_foreach (settings->backends, (GFunc) g_object_unref, NULL);
84adb8
+        g_list_free (settings->backends);
84adb8
+        settings->backends = NULL;
84adb8
+
84adb8
         backend = gdm_settings_desktop_backend_new (GDM_CUSTOM_CONF);
84adb8
         if (backend)
84adb8
                 settings->backends = g_list_prepend (NULL, backend);
84adb8
 
84adb8
         backend = gdm_settings_desktop_backend_new (GDM_RUNTIME_CONF);
84adb8
         if (backend)
84adb8
                 settings->backends = g_list_prepend (settings->backends, backend);
84adb8
 
84adb8
         for (l = settings->backends; l; l = g_list_next (l)) {
84adb8
                 backend = l->data;
84adb8
 
84adb8
                 g_signal_connect (backend,
84adb8
                                   "value-changed",
84adb8
                                   G_CALLBACK (backend_value_changed),
84adb8
                                   settings);
84adb8
         }
84adb8
 }
84adb8
 
84adb8
+static void
84adb8
+gdm_settings_init (GdmSettings *settings)
84adb8
+{
84adb8
+        gdm_settings_reload (settings);
84adb8
+}
84adb8
+
84adb8
 static void
84adb8
 gdm_settings_finalize (GObject *object)
84adb8
 {
84adb8
         GdmSettings *settings;
84adb8
 
84adb8
         g_return_if_fail (object != NULL);
84adb8
         g_return_if_fail (GDM_IS_SETTINGS (object));
84adb8
 
84adb8
         settings = GDM_SETTINGS (object);
84adb8
 
84adb8
         g_return_if_fail (settings != NULL);
84adb8
 
84adb8
         g_list_foreach (settings->backends, (GFunc) g_object_unref, NULL);
84adb8
         g_list_free (settings->backends);
84adb8
         settings->backends = NULL;
84adb8
 
84adb8
         settings_object = NULL;
84adb8
 
84adb8
         G_OBJECT_CLASS (gdm_settings_parent_class)->finalize (object);
84adb8
 }
84adb8
 
84adb8
 GdmSettings *
84adb8
 gdm_settings_new (void)
84adb8
 {
84adb8
         if (settings_object != NULL) {
84adb8
                 g_object_ref (settings_object);
84adb8
         } else {
84adb8
                 settings_object = g_object_new (GDM_TYPE_SETTINGS, NULL);
84adb8
         }
84adb8
 
84adb8
diff --git a/common/gdm-settings.h b/common/gdm-settings.h
84adb8
index 786868a9..07b64785 100644
84adb8
--- a/common/gdm-settings.h
84adb8
+++ b/common/gdm-settings.h
84adb8
@@ -13,45 +13,46 @@
84adb8
  * GNU General Public License for more details.
84adb8
  *
84adb8
  * You should have received a copy of the GNU General Public License
84adb8
  * along with this program; if not, write to the Free Software
84adb8
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
84adb8
  *
84adb8
  */
84adb8
 
84adb8
 
84adb8
 #ifndef __GDM_SETTINGS_H
84adb8
 #define __GDM_SETTINGS_H
84adb8
 
84adb8
 #include <glib-object.h>
84adb8
 
84adb8
 G_BEGIN_DECLS
84adb8
 
84adb8
 #define GDM_TYPE_SETTINGS (gdm_settings_get_type ())
84adb8
 G_DECLARE_FINAL_TYPE (GdmSettings, gdm_settings, GDM, SETTINGS, GObject)
84adb8
 
84adb8
 typedef enum
84adb8
 {
84adb8
         GDM_SETTINGS_ERROR_GENERAL,
84adb8
         GDM_SETTINGS_ERROR_KEY_NOT_FOUND
84adb8
 } GdmSettingsError;
84adb8
 
84adb8
 #define GDM_SETTINGS_ERROR gdm_settings_error_quark ()
84adb8
 
84adb8
 GQuark              gdm_settings_error_quark                    (void);
84adb8
 
84adb8
 GdmSettings *       gdm_settings_new                            (void);
84adb8
+void                gdm_settings_reload                         (GdmSettings *settings);
84adb8
 
84adb8
 /* exported */
84adb8
 
84adb8
 gboolean            gdm_settings_get_value                      (GdmSettings *settings,
84adb8
                                                                  const char  *key,
84adb8
                                                                  char       **value,
84adb8
                                                                  GError     **error);
84adb8
 gboolean            gdm_settings_set_value                      (GdmSettings *settings,
84adb8
                                                                  const char  *key,
84adb8
                                                                  const char  *value,
84adb8
                                                                  GError     **error);
84adb8
 
84adb8
 G_END_DECLS
84adb8
 
84adb8
 #endif /* __GDM_SETTINGS_H */
84adb8
diff --git a/daemon/main.c b/daemon/main.c
84adb8
index 1b893fe0..344d1b74 100644
84adb8
--- a/daemon/main.c
84adb8
+++ b/daemon/main.c
84adb8
@@ -240,70 +240,62 @@ gdm_daemon_lookup_user (uid_t *uidp,
84adb8
         if G_UNLIKELY (gid == 0) {
84adb8
                 gdm_fail (_("The GDM group should not be root. Aborting!"));
84adb8
         }
84adb8
 
84adb8
         if (uidp != NULL) {
84adb8
                 *uidp = uid;
84adb8
         }
84adb8
 
84adb8
         if (gidp != NULL) {
84adb8
                 *gidp = gid;
84adb8
         }
84adb8
 
84adb8
         g_free (username);
84adb8
         g_free (groupname);
84adb8
 }
84adb8
 
84adb8
 static gboolean
84adb8
 on_shutdown_signal_cb (gpointer user_data)
84adb8
 {
84adb8
         GMainLoop *mainloop = user_data;
84adb8
 
84adb8
         g_main_loop_quit (mainloop);
84adb8
 
84adb8
         return FALSE;
84adb8
 }
84adb8
 
84adb8
 static gboolean
84adb8
 on_sighup_cb (gpointer user_data)
84adb8
 {
84adb8
         g_debug ("Got HUP signal");
84adb8
-        /* Reread config stuff like system config files, VPN service
84adb8
-         * files, etc
84adb8
-         */
84adb8
-        g_object_unref (settings);
84adb8
-        settings = gdm_settings_new ();
84adb8
-        if (settings != NULL) {
84adb8
-                if (! gdm_settings_direct_init (settings, DATADIR "/gdm/gdm.schemas", "/")) {
84adb8
-                        g_warning ("Unable to initialize settings");
84adb8
-                }
84adb8
-        }
84adb8
+
84adb8
+        gdm_settings_reload (settings);
84adb8
 
84adb8
         return TRUE;
84adb8
 }
84adb8
 
84adb8
 static gboolean
84adb8
 is_debug_set (void)
84adb8
 {
84adb8
         gboolean debug;
84adb8
         gdm_settings_direct_get_boolean (GDM_KEY_DEBUG, &debug);
84adb8
         return debug;
84adb8
 }
84adb8
 
84adb8
 /* SIGUSR1 is used by the X server to tell us that we're ready, so
84adb8
  * block it. We'll unblock it in the worker thread in gdm-server.c
84adb8
  */
84adb8
 static void
84adb8
 block_sigusr1 (void)
84adb8
 {
84adb8
         sigset_t mask;
84adb8
 
84adb8
         sigemptyset (&mask);
84adb8
         sigaddset (&mask, SIGUSR1);
84adb8
         sigprocmask (SIG_BLOCK, &mask, NULL);
84adb8
 }
84adb8
 
84adb8
 int
84adb8
 main (int    argc,
84adb8
       char **argv)
84adb8
 {
84adb8
         GMainLoop          *main_loop;
84adb8
-- 
84adb8
2.34.1
84adb8