Blame SOURCES/fix-lang-changes.patch

1e501a
From b58a964bfac6d6af19a5e4d8b74508d06705909f Mon Sep 17 00:00:00 2001
1e501a
From: Ray Strode <rstrode@redhat.com>
1e501a
Date: Thu, 2 Jul 2015 13:08:05 -0400
1e501a
Subject: [PATCH] session: load locale.conf from gdm-session.c
1e501a
1e501a
Right now we're not picking up changes to locale.conf completely
1e501a
at runtime.
1e501a
1e501a
This commit moves reading locale.conf to a different place in the
1e501a
code, so that it's more effectively read and used.
1e501a
---
1e501a
 daemon/gdm-launch-environment.c | 106 ----------------------------------------
1e501a
 daemon/gdm-session.c            | 102 ++++++++++++++++++++++++++++++++++++--
1e501a
 2 files changed, 99 insertions(+), 109 deletions(-)
1e501a
1e501a
diff --git a/daemon/gdm-launch-environment.c b/daemon/gdm-launch-environment.c
1e501a
index e6b16dd..4aee187 100644
1e501a
--- a/daemon/gdm-launch-environment.c
1e501a
+++ b/daemon/gdm-launch-environment.c
1e501a
@@ -107,109 +107,6 @@ static void     gdm_launch_environment_finalize      (GObject
1e501a
 
1e501a
 G_DEFINE_TYPE (GdmLaunchEnvironment, gdm_launch_environment, G_TYPE_OBJECT)
1e501a
 
1e501a
-static void
1e501a
-load_lang_config_file (const char  *config_file,
1e501a
-                       const char **str_array)
1e501a
-{
1e501a
-        gchar         *contents = NULL;
1e501a
-        gchar         *p;
1e501a
-        gchar         *str_joinv;
1e501a
-        gchar         *pattern;
1e501a
-        gchar         *key;
1e501a
-        gchar         *value;
1e501a
-        gsize          length;
1e501a
-        GError        *error;
1e501a
-        GString       *line;
1e501a
-        GRegex        *re;
1e501a
-
1e501a
-        g_return_if_fail (config_file != NULL);
1e501a
-        g_return_if_fail (str_array != NULL);
1e501a
-
1e501a
-        if (!g_file_test (config_file, G_FILE_TEST_EXISTS)) {
1e501a
-                g_debug ("Cannot access '%s'", config_file);
1e501a
-                return;
1e501a
-        }
1e501a
-
1e501a
-        error = NULL;
1e501a
-        if (!g_file_get_contents (config_file, &contents, &length, &error)) {
1e501a
-                g_debug ("Failed to parse '%s': %s",
1e501a
-                         config_file,
1e501a
-                         (error && error->message) ? error->message : "(null)");
1e501a
-                g_error_free (error);
1e501a
-                return;
1e501a
-        }
1e501a
-
1e501a
-        if (!g_utf8_validate (contents, length, NULL)) {
1e501a
-                g_warning ("Invalid UTF-8 in '%s'", config_file);
1e501a
-                g_free (contents);
1e501a
-                return;
1e501a
-        }
1e501a
-
1e501a
-        str_joinv = g_strjoinv ("|", (char **) str_array);
1e501a
-        if (str_joinv == NULL) {
1e501a
-                g_warning ("Error in joined");
1e501a
-                g_free (contents);
1e501a
-                return;
1e501a
-        }
1e501a
-
1e501a
-        pattern = g_strdup_printf ("(?P<key>(%s))=(\")?(?P<value>[^\"]*)?(\")?",
1e501a
-                                   str_joinv);
1e501a
-        error = NULL;
1e501a
-        re = g_regex_new (pattern, 0, 0, &error);
1e501a
-        g_free (pattern);
1e501a
-        g_free (str_joinv);
1e501a
-        if (re == NULL) {
1e501a
-                g_warning ("Failed to regex: %s",
1e501a
-                           (error && error->message) ? error->message : "(null)");
1e501a
-                g_error_free (error);
1e501a
-                g_free (contents);
1e501a
-                return;
1e501a
-        }
1e501a
-
1e501a
-        line = g_string_new ("");
1e501a
-        for (p = contents; p && *p; p = g_utf8_find_next_char (p, NULL)) {
1e501a
-                gunichar ch;
1e501a
-                GMatchInfo *match_info = NULL;
1e501a
-
1e501a
-                ch = g_utf8_get_char (p);
1e501a
-                if ((ch != '\n') && (ch != '\0')) {
1e501a
-                        g_string_append_unichar (line, ch);
1e501a
-                        continue;
1e501a
-                }
1e501a
-
1e501a
-                if (line->str && g_utf8_get_char (line->str) == '#') {
1e501a
-                        goto next_line;
1e501a
-                }
1e501a
-
1e501a
-                if (!g_regex_match (re, line->str, 0, &match_info)) {
1e501a
-                        goto next_line;
1e501a
-                }
1e501a
-
1e501a
-                if (!g_match_info_matches (match_info)) {
1e501a
-                        goto next_line;
1e501a
-                }
1e501a
-
1e501a
-                key = g_match_info_fetch_named (match_info, "key");
1e501a
-                value = g_match_info_fetch_named (match_info, "value");
1e501a
-
1e501a
-                if (key && *key && value && *value) {
1e501a
-                        g_setenv (key, value, TRUE);
1e501a
-                } else if (key && *key) {
1e501a
-                        g_unsetenv (key);
1e501a
-                }
1e501a
-
1e501a
-                g_free (key);
1e501a
-                g_free (value);
1e501a
-next_line:
1e501a
-                g_match_info_free (match_info);
1e501a
-                g_string_set_size (line, 0);
1e501a
-        }
1e501a
-
1e501a
-        g_string_free (line, TRUE);
1e501a
-        g_regex_unref (re);
1e501a
-        g_free (contents);
1e501a
-}
1e501a
-
1e501a
 static GHashTable *
1e501a
 build_launch_environment (GdmLaunchEnvironment *launch_environment,
1e501a
                           gboolean              start_session)
1e501a
@@ -226,9 +123,6 @@ build_launch_environment (GdmLaunchEnvironment *launch_environment,
1e501a
         char *system_data_dirs;
1e501a
         int i;
1e501a
 
1e501a
-        load_lang_config_file (LANG_CONFIG_FILE,
1e501a
-                               (const char **) optional_environment);
1e501a
-
1e501a
         /* create a hash table of current environment, then update keys has necessary */
1e501a
         hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
1e501a
 
1e501a
diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
1e501a
index 1674bb6..d3643c2 100644
1e501a
--- a/daemon/gdm-session.c
1e501a
+++ b/daemon/gdm-session.c
1e501a
@@ -523,8 +523,17 @@ get_session_command_for_name (const char *name,
1e501a
 static const char *
1e501a
 get_default_language_name (GdmSession *self)
1e501a
 {
1e501a
+    const char *default_language;
1e501a
+
1e501a
     if (self->priv->saved_language != NULL) {
1e501a
-                return self->priv->saved_language;
1e501a
+            return self->priv->saved_language;
1e501a
+    }
1e501a
+
1e501a
+    default_language = g_hash_table_lookup (self->priv->environment,
1e501a
+                                            "LANG");
1e501a
+
1e501a
+    if (default_language != NULL) {
1e501a
+            return default_language;
1e501a
     }
1e501a
 
1e501a
     return setlocale (LC_MESSAGES, NULL);
1e501a
@@ -1705,6 +1714,90 @@ free_conversation (GdmSessionConversation *conversation)
1e501a
 }
1e501a
 
1e501a
 static void
1e501a
+load_lang_config_file (GdmSession *self)
1e501a
+{
1e501a
+        static const char *config_file = LANG_CONFIG_FILE;
1e501a
+        gchar         *contents = NULL;
1e501a
+        gchar         *p;
1e501a
+        gchar         *key;
1e501a
+        gchar         *value;
1e501a
+        gsize          length;
1e501a
+        GError        *error;
1e501a
+        GString       *line;
1e501a
+        GRegex        *re;
1e501a
+
1e501a
+        if (!g_file_test (config_file, G_FILE_TEST_EXISTS)) {
1e501a
+                g_debug ("Cannot access '%s'", config_file);
1e501a
+                return;
1e501a
+        }
1e501a
+
1e501a
+        error = NULL;
1e501a
+        if (!g_file_get_contents (config_file, &contents, &length, &error)) {
1e501a
+                g_debug ("Failed to parse '%s': %s",
1e501a
+                         LANG_CONFIG_FILE,
1e501a
+                         (error && error->message) ? error->message : "(null)");
1e501a
+                g_error_free (error);
1e501a
+                return;
1e501a
+        }
1e501a
+
1e501a
+        if (!g_utf8_validate (contents, length, NULL)) {
1e501a
+                g_warning ("Invalid UTF-8 in '%s'", config_file);
1e501a
+                g_free (contents);
1e501a
+                return;
1e501a
+        }
1e501a
+
1e501a
+        re = g_regex_new ("(?P<key>(LANG|LANGUAGE|LC_CTYPE|LC_NUMERIC|LC_TIME|LC_COLLATE|LC_MONETARY|LC_MESSAGES|LC_PAPER|LC_NAME|LC_ADDRESS|LC_TELEPHONE|LC_MEASUREMENT|LC_IDENTIFICATION|LC_ALL))=(\")?(?P<value>[^\"]*)?(\")?", 0, 0, &error);
1e501a
+        if (re == NULL) {
1e501a
+                g_warning ("Failed to regex: %s",
1e501a
+                           (error && error->message) ? error->message : "(null)");
1e501a
+                g_error_free (error);
1e501a
+                g_free (contents);
1e501a
+                return;
1e501a
+        }
1e501a
+
1e501a
+        line = g_string_new ("");
1e501a
+        for (p = contents; p && *p; p = g_utf8_find_next_char (p, NULL)) {
1e501a
+                gunichar ch;
1e501a
+                GMatchInfo *match_info = NULL;
1e501a
+
1e501a
+                ch = g_utf8_get_char (p);
1e501a
+                if ((ch != '\n') && (ch != '\0')) {
1e501a
+                        g_string_append_unichar (line, ch);
1e501a
+                        continue;
1e501a
+                }
1e501a
+
1e501a
+                if (line->str && g_utf8_get_char (line->str) == '#') {
1e501a
+                        goto next_line;
1e501a
+                }
1e501a
+
1e501a
+                if (!g_regex_match (re, line->str, 0, &match_info)) {
1e501a
+                        goto next_line;
1e501a
+                }
1e501a
+
1e501a
+                if (!g_match_info_matches (match_info)) {
1e501a
+                        goto next_line;
1e501a
+                }
1e501a
+
1e501a
+                key = g_match_info_fetch_named (match_info, "key");
1e501a
+                value = g_match_info_fetch_named (match_info, "value");
1e501a
+
1e501a
+                if (key && *key && value && *value) {
1e501a
+			g_setenv (key, value, TRUE);
1e501a
+                }
1e501a
+
1e501a
+                g_free (key);
1e501a
+                g_free (value);
1e501a
+next_line:
1e501a
+                g_match_info_free (match_info);
1e501a
+                g_string_set_size (line, 0);
1e501a
+        }
1e501a
+
1e501a
+        g_string_free (line, TRUE);
1e501a
+        g_regex_unref (re);
1e501a
+        g_free (contents);
1e501a
+}
1e501a
+
1e501a
+static void
1e501a
 gdm_session_init (GdmSession *self)
1e501a
 {
1e501a
         self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
1e501a
@@ -1734,6 +1827,7 @@ gdm_session_init (GdmSession *self)
1e501a
                                                          (GDestroyNotify) g_free,
1e501a
                                                          (GDestroyNotify) g_free);
1e501a
 
1e501a
+        load_lang_config_file (self);
1e501a
         setup_worker_server (self);
1e501a
         setup_outside_server (self);
1e501a
 }
1e501a
@@ -2396,7 +2490,7 @@ set_up_session_environment (GdmSession *self)
1e501a
 {
1e501a
         GdmSessionDisplayMode display_mode;
1e501a
         gchar *desktop_names;
1e501a
-        const char *locale;
1e501a
+        char *locale;
1e501a
 
1e501a
         gdm_session_set_environment_variable (self,
1e501a
                                               "GDMSESSION",
1e501a
@@ -2415,7 +2509,7 @@ set_up_session_environment (GdmSession *self)
1e501a
 
1e501a
         set_up_session_language (self);
1e501a
 
1e501a
-        locale = get_default_language_name (self);
1e501a
+        locale = g_strdup (get_default_language_name (self));
1e501a
 
1e501a
         if (locale != NULL && locale[0] != '\0') {
1e501a
                 gdm_session_set_environment_variable (self,
1e501a
@@ -2426,6 +2520,8 @@ set_up_session_environment (GdmSession *self)
1e501a
                                                       locale);
1e501a
         }
1e501a
 
1e501a
+        g_free (locale);
1e501a
+
1e501a
         display_mode = gdm_session_get_display_mode (self);
1e501a
         if (display_mode == GDM_SESSION_DISPLAY_MODE_REUSE_VT) {
1e501a
                 gdm_session_set_environment_variable (self,
1e501a
-- 
1e501a
1.8.3.1
1e501a