Blame accountsservice-sysconfig.patch

Bernhard M. Wiedemann 1defcc
commit c3360e3878722b0fefdda02a320f6fb76a41b7da
Bernhard M. Wiedemann 1defcc
Author: Vincent Untz <vuntz@gnome.org>
Bernhard M. Wiedemann 1defcc
Date:   Wed Jul 20 16:48:41 2011 +0200
Bernhard M. Wiedemann 1defcc
Bernhard M. Wiedemann 1defcc
    Use autologin configuration from sysconfig (SUSE-ism)
Bernhard M. Wiedemann 1defcc
c2db8a
c2db8a
Index: accountsservice-23.13.9/src/daemon.c
c2db8a
===================================================================
c2db8a
--- accountsservice-23.13.9.orig/src/daemon.c
c2db8a
+++ accountsservice-23.13.9/src/daemon.c
59d0a6
@@ -51,6 +51,7 @@
Bernhard M. Wiedemann 1defcc
 #include "util.h"
69d580
 #include "user.h"
69d580
 #include "accounts-user-generated.h"
Bernhard M. Wiedemann 1defcc
+#include "gdm-sysconfig.h"
Bernhard M. Wiedemann 1defcc
 
59d0a6
 #define PATH_PASSWD "passwd"
59d0a6
 #define PATH_SHADOW "shadow"
c2db8a
@@ -1789,6 +1790,43 @@ load_autologin_lightdm (Daemon   *daemon
59d0a6
         return TRUE;
Bernhard M. Wiedemann 1defcc
 }
Bernhard M. Wiedemann 1defcc
 
Bernhard M. Wiedemann 1defcc
+#define SYSCONFIG_FILE                  "/etc/sysconfig/displaymanager"
Bernhard M. Wiedemann 1defcc
+#define SYSCONFIG_AUTOLOGIN_KEY         "DISPLAYMANAGER_AUTOLOGIN"
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+gboolean
Bernhard M. Wiedemann 1defcc
+load_autologin_suse (Daemon      *daemon,
Bernhard M. Wiedemann 1defcc
+                     gchar      **name,
Bernhard M. Wiedemann 1defcc
+                     gboolean    *enabled,
Bernhard M. Wiedemann 1defcc
+                     GError     **error)
Bernhard M. Wiedemann 1defcc
+{
Bernhard M. Wiedemann 1defcc
+        *name = gdm_sysconfig_load_value (SYSCONFIG_FILE, SYSCONFIG_AUTOLOGIN_KEY);
Bernhard M. Wiedemann 1defcc
+        *enabled = (name && *name);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        return TRUE;
Bernhard M. Wiedemann 1defcc
+}
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+static gboolean
Bernhard M. Wiedemann 1defcc
+save_autologin_suse (Daemon      *daemon,
Bernhard M. Wiedemann 1defcc
+                     const gchar *name,
Bernhard M. Wiedemann 1defcc
+                     gboolean     enabled,
Bernhard M. Wiedemann 1defcc
+                     GError     **error)
Bernhard M. Wiedemann 1defcc
+{
Bernhard M. Wiedemann 1defcc
+        const gchar *user;
Bernhard M. Wiedemann 1defcc
+        gboolean     result;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        if (enabled && name)
Bernhard M. Wiedemann 1defcc
+                user = name;
Bernhard M. Wiedemann 1defcc
+        else
Bernhard M. Wiedemann 1defcc
+                user = "";
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        result = gdm_sysconfig_save_value (SYSCONFIG_FILE, SYSCONFIG_AUTOLOGIN_KEY, user);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        if (!result)
Bernhard M. Wiedemann 1defcc
+                g_set_error (error, ERROR, ERROR_FAILED, "Could not save autologin configuration in sysconfig");
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        return result;
Bernhard M. Wiedemann 1defcc
+}
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
 gboolean
59d0a6
 load_autologin (Daemon   *daemon,
59d0a6
                 gchar   **name,
c2db8a
@@ -1797,6 +1835,8 @@ load_autologin (Daemon   *daemon,
c2db8a
 {
c2db8a
         DisplayManagerType dm_type;
c2db8a
 
c2db8a
+        return load_autologin_suse (daemon, name, enabled, error);
c2db8a
+
c2db8a
         dm_type = get_current_system_dm_type ();
c2db8a
         if (dm_type == DISPLAY_MANAGER_TYPE_LIGHTDM)
c2db8a
                 return load_autologin_lightdm (daemon, name, enabled, error);
c2db8a
@@ -1819,6 +1859,8 @@ save_autologin_gdm (Daemon      *daemon,
59d0a6
         gboolean result;
59d0a6
         g_autoptr (GError) local_error = NULL;
Bernhard M. Wiedemann 1defcc
 
209c6b
+        return save_autologin_suse (daemon, name, enabled, error);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
         keyfile = g_key_file_new ();
Bernhard M. Wiedemann 1defcc
         if (!g_key_file_load_from_file (keyfile,
Bernhard M. Wiedemann 1defcc
                                         PATH_GDM_CUSTOM,
c2db8a
@@ -1851,6 +1893,8 @@ save_autologin_lightdm (Daemon      *dae
Bernhard M. Wiedemann 1defcc
         gboolean result;
59d0a6
         g_autoptr (GError) local_error = NULL;
Bernhard M. Wiedemann 1defcc
 
Bernhard M. Wiedemann 1defcc
+        return save_autologin_suse (daemon, name, enabled, error);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
         keyfile = g_key_file_new ();
Bernhard M. Wiedemann 1defcc
         if (!g_key_file_load_from_file (keyfile,
59d0a6
                                         PATH_LIGHTDM_CONF,
c2db8a
@@ -1879,6 +1923,8 @@ save_autologin (Daemon      *daemon,
c2db8a
 {
c2db8a
         DisplayManagerType dm_type;
c2db8a
 
c2db8a
+        return save_autologin_suse (daemon, name, enabled, error);
c2db8a
+
c2db8a
         dm_type = get_current_system_dm_type ();
c2db8a
         if (dm_type == DISPLAY_MANAGER_TYPE_LIGHTDM)
c2db8a
                 return save_autologin_lightdm (daemon, name, enabled, error);
c2db8a
Index: accountsservice-23.13.9/src/gdm-sysconfig.c
c2db8a
===================================================================
c2db8a
--- /dev/null
c2db8a
+++ accountsservice-23.13.9/src/gdm-sysconfig.c
Bernhard M. Wiedemann 1defcc
@@ -0,0 +1,484 @@
Bernhard M. Wiedemann 1defcc
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
Bernhard M. Wiedemann 1defcc
+ *
Bernhard M. Wiedemann 1defcc
+ * Copyright (C) 2008 Hans Petter Jansson <hpj@novell.com>
Bernhard M. Wiedemann 1defcc
+ *
Bernhard M. Wiedemann 1defcc
+ * This program is free software; you can redistribute it and/or modify
Bernhard M. Wiedemann 1defcc
+ * it under the terms of the GNU General Public License as published by
Bernhard M. Wiedemann 1defcc
+ * the Free Software Foundation; either version 2 of the License, or
Bernhard M. Wiedemann 1defcc
+ * (at your option) any later version.
Bernhard M. Wiedemann 1defcc
+ *
Bernhard M. Wiedemann 1defcc
+ * This program is distributed in the hope that it will be useful,
Bernhard M. Wiedemann 1defcc
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
Bernhard M. Wiedemann 1defcc
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Bernhard M. Wiedemann 1defcc
+ * GNU General Public License for more details.
Bernhard M. Wiedemann 1defcc
+ *
Bernhard M. Wiedemann 1defcc
+ * You should have received a copy of the GNU General Public License
Bernhard M. Wiedemann 1defcc
+ * along with this program; if not, write to the Free Software
Bernhard M. Wiedemann 1defcc
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Bernhard M. Wiedemann 1defcc
+ *
Bernhard M. Wiedemann 1defcc
+ */
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+/* Parser for shell-script-like key-value files. Far from complete, but
Bernhard M. Wiedemann 1defcc
+ * deals with a couple of common shell oddities. For instance, the following
Bernhard M. Wiedemann 1defcc
+ * are parsed correctly:
Bernhard M. Wiedemann 1defcc
+ *
Bernhard M. Wiedemann 1defcc
+ * KEY=value\0
Bernhard M. Wiedemann 1defcc
+ * KEY = value#comment\0
Bernhard M. Wiedemann 1defcc
+ * KEY = " value with spaces"  \0
Bernhard M. Wiedemann 1defcc
+ * KEY = ' it\'s a value with "embedded" quotes'\0
Bernhard M. Wiedemann 1defcc
+ * KEY = "if quotes aren't closed, we assume the string ends at EOL\0
Bernhard M. Wiedemann 1defcc
+ *
Bernhard M. Wiedemann 1defcc
+ * It should be good enough for the config files in /etc/sysconfig/.
Bernhard M. Wiedemann 1defcc
+ */
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+#include "config.h"
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+#include <unistd.h>
Bernhard M. Wiedemann 1defcc
+#include <string.h>
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+#include <glib.h>
Bernhard M. Wiedemann 1defcc
+#include <glib/gi18n.h>
Bernhard M. Wiedemann 1defcc
+#include <glib/gstdio.h>
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+#include "gdm-sysconfig.h"
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+#define SPACE_CHARS     " \t"
Bernhard M. Wiedemann 1defcc
+#define KEY_ALLOW_CHARS "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+static gchar **
Bernhard M. Wiedemann 1defcc
+load_settings_file (const gchar *file_name)
Bernhard M. Wiedemann 1defcc
+{
Bernhard M. Wiedemann 1defcc
+        GIOChannel *channel;
Bernhard M. Wiedemann 1defcc
+        GPtrArray  *lines;
Bernhard M. Wiedemann 1defcc
+        gchar      *str;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        g_debug ("Loading settings from %s", file_name);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        channel = g_io_channel_new_file (file_name, "r", NULL);
Bernhard M. Wiedemann 1defcc
+        if (!channel) {
Bernhard M. Wiedemann 1defcc
+                g_debug ("Failed to open %s", file_name);
Bernhard M. Wiedemann 1defcc
+                return NULL;
Bernhard M. Wiedemann 1defcc
+        }
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        lines = g_ptr_array_new ();
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        while (g_io_channel_read_line (channel, &str, NULL, NULL, NULL) != G_IO_STATUS_EOF) {
Bernhard M. Wiedemann 1defcc
+                if (str) {
Bernhard M. Wiedemann 1defcc
+                        gchar *p0;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+                        /* Remove line separators */
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+                        for (p0 = str + strlen (str) - 1; p0 >= str && strchr ("\r\n", *p0); p0--)
Bernhard M. Wiedemann 1defcc
+                                *p0 = '\0';
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+                        g_ptr_array_add (lines, str);
Bernhard M. Wiedemann 1defcc
+                        g_debug ("%s", str);
Bernhard M. Wiedemann 1defcc
+                } else {
Bernhard M. Wiedemann 1defcc
+                        g_ptr_array_add (lines, g_strdup (""));
Bernhard M. Wiedemann 1defcc
+                        g_debug ("%s", "");
Bernhard M. Wiedemann 1defcc
+                }
Bernhard M. Wiedemann 1defcc
+        }
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        g_io_channel_shutdown (channel, FALSE, NULL);
Bernhard M. Wiedemann 1defcc
+        g_io_channel_unref (channel);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        g_ptr_array_add (lines, NULL);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        return (gchar **) g_ptr_array_free (lines, FALSE);
Bernhard M. Wiedemann 1defcc
+}
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+static gboolean
Bernhard M. Wiedemann 1defcc
+save_settings_file (const gchar *file_name, gchar **lines)
Bernhard M. Wiedemann 1defcc
+{
Bernhard M. Wiedemann 1defcc
+        GIOStatus   last_status = G_IO_STATUS_ERROR;
Bernhard M. Wiedemann 1defcc
+        GIOChannel *channel     = NULL;
Bernhard M. Wiedemann 1defcc
+        gchar      *temp_file_name;
Bernhard M. Wiedemann 1defcc
+        gint        i;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        temp_file_name = g_strdup_printf ("%s.new.%u", file_name, g_random_int ());
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        channel = g_io_channel_new_file (temp_file_name, "w", NULL);
Bernhard M. Wiedemann 1defcc
+        if (!channel)
Bernhard M. Wiedemann 1defcc
+                goto out;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        if (!lines)
Bernhard M. Wiedemann 1defcc
+                goto out;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        for (i = 0; lines [i]; i++) {
Bernhard M. Wiedemann 1defcc
+                gsize bytes_written;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+                if (lines [i] [0] != '\0')
Bernhard M. Wiedemann 1defcc
+                        last_status = g_io_channel_write_chars (channel,
Bernhard M. Wiedemann 1defcc
+                                                                lines [i], strlen (lines [i]),
Bernhard M. Wiedemann 1defcc
+                                                                &bytes_written,
Bernhard M. Wiedemann 1defcc
+                                                                NULL);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+                if (last_status != G_IO_STATUS_NORMAL)
Bernhard M. Wiedemann 1defcc
+                        break;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+                last_status = g_io_channel_write_unichar (channel, '\n', NULL);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+                if (last_status != G_IO_STATUS_NORMAL)
Bernhard M. Wiedemann 1defcc
+                        break;
Bernhard M. Wiedemann 1defcc
+        }
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+out:
Bernhard M. Wiedemann 1defcc
+        if (channel) {
Bernhard M. Wiedemann 1defcc
+                g_io_channel_shutdown (channel, TRUE, NULL);
Bernhard M. Wiedemann 1defcc
+                g_io_channel_unref (channel);
Bernhard M. Wiedemann 1defcc
+        }
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        if (last_status == G_IO_STATUS_NORMAL && g_rename (temp_file_name, file_name) != 0)
Bernhard M. Wiedemann 1defcc
+                last_status = G_IO_STATUS_ERROR;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        g_free (temp_file_name);
Bernhard M. Wiedemann 1defcc
+        return last_status == G_IO_STATUS_NORMAL ? TRUE : FALSE;
Bernhard M. Wiedemann 1defcc
+}
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+static const gchar *
Bernhard M. Wiedemann 1defcc
+skip_from_start_to_key (const gchar *line)
Bernhard M. Wiedemann 1defcc
+{
Bernhard M. Wiedemann 1defcc
+        const gchar *p0;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        /* Skip initial space */
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        p0 = line + strspn (line, SPACE_CHARS);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        /* Ignore comments and other junk */
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        if (*p0 && strchr (KEY_ALLOW_CHARS, *p0))
Bernhard M. Wiedemann 1defcc
+                return p0;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        return NULL;
Bernhard M. Wiedemann 1defcc
+}
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+static const gchar *
Bernhard M. Wiedemann 1defcc
+skip_from_start_to_value_of_key (const gchar *line, const gchar *key_normal, gint key_len)
Bernhard M. Wiedemann 1defcc
+{
Bernhard M. Wiedemann 1defcc
+        const gchar *p0, *p1;
Bernhard M. Wiedemann 1defcc
+        gchar       *potential_key_normal;
Bernhard M. Wiedemann 1defcc
+        gboolean     result;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        p0 = skip_from_start_to_key (line);
Bernhard M. Wiedemann 1defcc
+        if (!p0)
Bernhard M. Wiedemann 1defcc
+                return NULL;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        /* There's at least one key-like character, figure out how many */
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        p1 = p0 + strspn (p0, KEY_ALLOW_CHARS);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        /* Is this the key we're looking for? */
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        if (p1 - p0 != key_len)
Bernhard M. Wiedemann 1defcc
+                return NULL;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        potential_key_normal = g_ascii_strdown (p0, p1 - p0);
Bernhard M. Wiedemann 1defcc
+        result = strcmp (key_normal, potential_key_normal) == 0 ? TRUE : FALSE;
Bernhard M. Wiedemann 1defcc
+        g_free (potential_key_normal);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        if (!result)
Bernhard M. Wiedemann 1defcc
+                return NULL;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        /* It's the right key; skip over key-value separator */
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        p0 = p1 + strspn (p1, SPACE_CHARS);
Bernhard M. Wiedemann 1defcc
+        if (*p0 != '=')
Bernhard M. Wiedemann 1defcc
+                return NULL;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        p0++;
Bernhard M. Wiedemann 1defcc
+        p0 += strspn (p0, SPACE_CHARS);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        return p0;
Bernhard M. Wiedemann 1defcc
+}
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+static const gchar *
Bernhard M. Wiedemann 1defcc
+skip_over_value (const gchar *value_start, gchar *quotes_out)
Bernhard M. Wiedemann 1defcc
+{
Bernhard M. Wiedemann 1defcc
+        const gchar *p0 = value_start;
Bernhard M. Wiedemann 1defcc
+        const gchar *p1;
Bernhard M. Wiedemann 1defcc
+        gchar        quotes;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        /* Is the value quoted? */
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        quotes = *p0;
Bernhard M. Wiedemann 1defcc
+        if (quotes == '\'' || quotes == '"') {
Bernhard M. Wiedemann 1defcc
+                /* Quoted sequence opened; find closing quote, but skip over escaped ones. If
Bernhard M. Wiedemann 1defcc
+                 * there's no closing quote on this line, assume the EOL closes it. */
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+                *quotes_out = quotes;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+                p1 = p0;
Bernhard M. Wiedemann 1defcc
+                do {
Bernhard M. Wiedemann 1defcc
+                        p1++;
Bernhard M. Wiedemann 1defcc
+                        p1 = strchr (p1, quotes);
Bernhard M. Wiedemann 1defcc
+                        if (!p1) {
Bernhard M. Wiedemann 1defcc
+                                /* Hit EOL */
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+                                p1 = p0 + strlen (p0) - 1;
Bernhard M. Wiedemann 1defcc
+                                break;
Bernhard M. Wiedemann 1defcc
+                        }
Bernhard M. Wiedemann 1defcc
+                } while (*(p1 - 1) == '\\');
Bernhard M. Wiedemann 1defcc
+        } else {
Bernhard M. Wiedemann 1defcc
+                /* No quotes; look for comment or EOL */
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+                *quotes_out = 0;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+                p1 = strchr (p0, '#');
Bernhard M. Wiedemann 1defcc
+                if (!p1)
Bernhard M. Wiedemann 1defcc
+                        p1 = p0 + strlen (p0);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+                for (p1--; p1 >= p0; p1--)
Bernhard M. Wiedemann 1defcc
+                        if (!strchr (SPACE_CHARS, *p1))
Bernhard M. Wiedemann 1defcc
+                                break;
Bernhard M. Wiedemann 1defcc
+        }
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        return p1 + 1;
Bernhard M. Wiedemann 1defcc
+}
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+static gchar *
Bernhard M. Wiedemann 1defcc
+get_value_of_key (const gchar *line, const gchar *key_normal, gint key_len)
Bernhard M. Wiedemann 1defcc
+{
Bernhard M. Wiedemann 1defcc
+        const gchar *p0, *p1;
Bernhard M. Wiedemann 1defcc
+        gchar        quotes;
Bernhard M. Wiedemann 1defcc
+        gchar       *value;
Bernhard M. Wiedemann 1defcc
+        gchar       *temp;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        p0 = skip_from_start_to_value_of_key (line, key_normal, key_len);
Bernhard M. Wiedemann 1defcc
+        if (!p0)
Bernhard M. Wiedemann 1defcc
+                return NULL;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        p1 = skip_over_value (p0, &quotes);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        if (quotes != 0) {
Bernhard M. Wiedemann 1defcc
+                if (p1 - p0 > 2) {
Bernhard M. Wiedemann 1defcc
+                        temp = g_strndup (p0 + 1, p1 - p0 - 2);
Bernhard M. Wiedemann 1defcc
+                        value = g_strcompress (temp);
Bernhard M. Wiedemann 1defcc
+                        g_free (temp);
Bernhard M. Wiedemann 1defcc
+                } else {
Bernhard M. Wiedemann 1defcc
+                        value = g_strdup ("");
Bernhard M. Wiedemann 1defcc
+                }
Bernhard M. Wiedemann 1defcc
+        } else {
Bernhard M. Wiedemann 1defcc
+                temp = g_strndup (p0, p1 - p0);
Bernhard M. Wiedemann 1defcc
+                value = g_strcompress (temp);
Bernhard M. Wiedemann 1defcc
+                g_free (temp);
Bernhard M. Wiedemann 1defcc
+                g_strchomp (value);
Bernhard M. Wiedemann 1defcc
+        }
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        return value;
Bernhard M. Wiedemann 1defcc
+}
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+static gchar *
209c6b
+get_value (gchar **lines, const gchar *key)
Bernhard M. Wiedemann 1defcc
+{
Bernhard M. Wiedemann 1defcc
+        gchar *value = NULL;
Bernhard M. Wiedemann 1defcc
+        gchar *key_normal;
Bernhard M. Wiedemann 1defcc
+        gint   key_len;
Bernhard M. Wiedemann 1defcc
+        gint   i;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        g_debug ("Getting value of %s", key);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        if (!lines) {
Bernhard M. Wiedemann 1defcc
+                g_debug ("Missing configuration data");
Bernhard M. Wiedemann 1defcc
+                return NULL;
Bernhard M. Wiedemann 1defcc
+        }
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        key_normal = g_ascii_strdown (key, -1);
Bernhard M. Wiedemann 1defcc
+        key_len    = strlen (key_normal);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        for (i = 0; lines [i]; i++) {
Bernhard M. Wiedemann 1defcc
+                value = get_value_of_key (lines [i], key_normal, key_len);
Bernhard M. Wiedemann 1defcc
+                if (value)
Bernhard M. Wiedemann 1defcc
+                        break;
Bernhard M. Wiedemann 1defcc
+        }
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        g_free (key_normal);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        g_debug ("Got value of %s: %s", key, value);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        return value;
Bernhard M. Wiedemann 1defcc
+}
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+static gchar *
Bernhard M. Wiedemann 1defcc
+set_value_of_key (const gchar *line, const gchar *key_normal, gint key_len, const gchar *key, const gchar *value)
Bernhard M. Wiedemann 1defcc
+{
Bernhard M. Wiedemann 1defcc
+        const gchar *p0, *p1, *p2;
Bernhard M. Wiedemann 1defcc
+        gchar        quotes;
Bernhard M. Wiedemann 1defcc
+        gchar       *escaped_value;
Bernhard M. Wiedemann 1defcc
+        gchar       *quoted_escaped_value;
Bernhard M. Wiedemann 1defcc
+        gint         quoted_escaped_value_len;
Bernhard M. Wiedemann 1defcc
+        gchar       *new_line;
Bernhard M. Wiedemann 1defcc
+        gint         len;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        p0 = skip_from_start_to_value_of_key (line, key_normal, key_len);
Bernhard M. Wiedemann 1defcc
+        if (!p0)
Bernhard M. Wiedemann 1defcc
+                return NULL;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        escaped_value = g_strescape (value, "");
Bernhard M. Wiedemann 1defcc
+        quoted_escaped_value = g_strdup_printf ("\"%s\"", escaped_value);
Bernhard M. Wiedemann 1defcc
+        g_free (escaped_value);
Bernhard M. Wiedemann 1defcc
+        quoted_escaped_value_len = strlen (quoted_escaped_value);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        p1 = skip_over_value (p0, &quotes);
Bernhard M. Wiedemann 1defcc
+        p2 = p1 + strlen (p1);
Bernhard M. Wiedemann 1defcc
+        len = (p0 - line) + quoted_escaped_value_len + (p2 - p1);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        new_line = g_malloc (len + 1);
Bernhard M. Wiedemann 1defcc
+        memcpy (new_line,                                          line,                 p0 - line);
Bernhard M. Wiedemann 1defcc
+        memcpy (new_line + (p0 - line),                            quoted_escaped_value, quoted_escaped_value_len);
Bernhard M. Wiedemann 1defcc
+        memcpy (new_line + (p0 - line) + quoted_escaped_value_len, p1,                   p2 - p1);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        *(new_line + len) = '\0';
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        g_free (quoted_escaped_value);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        return new_line;
Bernhard M. Wiedemann 1defcc
+}
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+static gboolean
Bernhard M. Wiedemann 1defcc
+set_value (gchar **lines, const gchar *key, const gchar *value)
Bernhard M. Wiedemann 1defcc
+{
Bernhard M. Wiedemann 1defcc
+        gboolean  result = FALSE;
Bernhard M. Wiedemann 1defcc
+        gchar    *key_normal;
Bernhard M. Wiedemann 1defcc
+        gint      key_len;
Bernhard M. Wiedemann 1defcc
+        gint      i;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        if (!lines)
Bernhard M. Wiedemann 1defcc
+                return FALSE;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        key_normal = g_ascii_strdown (key, -1);
Bernhard M. Wiedemann 1defcc
+        key_len    = strlen (key_normal);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        for (i = 0; lines [i]; i++) {
Bernhard M. Wiedemann 1defcc
+                gchar *new_line;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+                new_line = set_value_of_key (lines [i], key_normal, key_len, key, value);
Bernhard M. Wiedemann 1defcc
+                if (new_line) {
Bernhard M. Wiedemann 1defcc
+                        g_free (lines [i]);
Bernhard M. Wiedemann 1defcc
+                        lines [i] = new_line;
Bernhard M. Wiedemann 1defcc
+                        result = TRUE;
Bernhard M. Wiedemann 1defcc
+                        break;
Bernhard M. Wiedemann 1defcc
+                }
Bernhard M. Wiedemann 1defcc
+        }
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        g_free (key_normal);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        return result;
Bernhard M. Wiedemann 1defcc
+}
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+gchar **
Bernhard M. Wiedemann 1defcc
+gdm_sysconfig_load_file (const gchar *file_name)
Bernhard M. Wiedemann 1defcc
+{
Bernhard M. Wiedemann 1defcc
+        g_return_val_if_fail (file_name != NULL, NULL);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        return load_settings_file (file_name);
Bernhard M. Wiedemann 1defcc
+}
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+gboolean
Bernhard M. Wiedemann 1defcc
+gdm_sysconfig_save_file (const gchar *file_name, const gchar **sysconfig)
Bernhard M. Wiedemann 1defcc
+{
Bernhard M. Wiedemann 1defcc
+        g_return_val_if_fail (file_name != NULL, FALSE);
Bernhard M. Wiedemann 1defcc
+        g_return_val_if_fail (sysconfig != NULL, FALSE);
Bernhard M. Wiedemann 1defcc
+
209c6b
+        return save_settings_file (file_name, (gchar **)sysconfig);
Bernhard M. Wiedemann 1defcc
+}
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+gchar *
Bernhard M. Wiedemann 1defcc
+gdm_sysconfig_get_value (const gchar **sysconfig, const gchar *key)
Bernhard M. Wiedemann 1defcc
+{
Bernhard M. Wiedemann 1defcc
+        g_return_val_if_fail (sysconfig != NULL, NULL);
Bernhard M. Wiedemann 1defcc
+        g_return_val_if_fail (key != NULL, NULL);
Bernhard M. Wiedemann 1defcc
+
209c6b
+        return get_value ((gchar **)sysconfig, key);
Bernhard M. Wiedemann 1defcc
+}
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+gboolean
Bernhard M. Wiedemann 1defcc
+gdm_sysconfig_set_value (gchar **sysconfig, const gchar *key, const gchar *value)
Bernhard M. Wiedemann 1defcc
+{
Bernhard M. Wiedemann 1defcc
+        g_return_val_if_fail (sysconfig != NULL, FALSE);
Bernhard M. Wiedemann 1defcc
+        g_return_val_if_fail (key != NULL, FALSE);
Bernhard M. Wiedemann 1defcc
+        g_return_val_if_fail (value != NULL, FALSE);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        return set_value (sysconfig, key, value);
Bernhard M. Wiedemann 1defcc
+}
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+gboolean
Bernhard M. Wiedemann 1defcc
+gdm_sysconfig_get_value_boolean (const gchar **sysconfig, const gchar *key, gboolean *value)
Bernhard M. Wiedemann 1defcc
+{
Bernhard M. Wiedemann 1defcc
+	char     *val;
Bernhard M. Wiedemann 1defcc
+	gboolean  val_bool;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        g_return_val_if_fail (sysconfig != NULL, FALSE);
Bernhard M. Wiedemann 1defcc
+        g_return_val_if_fail (key != NULL, FALSE);
Bernhard M. Wiedemann 1defcc
+
209c6b
+        val = get_value ((gchar **)sysconfig, key);
Bernhard M. Wiedemann 1defcc
+	if (val == NULL) {
Bernhard M. Wiedemann 1defcc
+		return FALSE;
Bernhard M. Wiedemann 1defcc
+	}
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        if (!strcasecmp (val, "yes")) {
Bernhard M. Wiedemann 1defcc
+		val_bool = TRUE;
Bernhard M. Wiedemann 1defcc
+	} else if (!strcasecmp (val, "no")) {
Bernhard M. Wiedemann 1defcc
+		val_bool = FALSE;
Bernhard M. Wiedemann 1defcc
+	} else {
Bernhard M. Wiedemann 1defcc
+		g_free (val);
Bernhard M. Wiedemann 1defcc
+		return FALSE;
Bernhard M. Wiedemann 1defcc
+	}
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+	g_free (val);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+	if (value != NULL) {
Bernhard M. Wiedemann 1defcc
+		*value = val_bool;
Bernhard M. Wiedemann 1defcc
+	}
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+	return TRUE;
Bernhard M. Wiedemann 1defcc
+}
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+gboolean
Bernhard M. Wiedemann 1defcc
+gdm_sysconfig_set_value_boolean (gchar **sysconfig, const gchar *key, gboolean value)
Bernhard M. Wiedemann 1defcc
+{
Bernhard M. Wiedemann 1defcc
+        g_return_val_if_fail (sysconfig != NULL, FALSE);
Bernhard M. Wiedemann 1defcc
+        g_return_val_if_fail (key != NULL, FALSE);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        return set_value (sysconfig, key, value ? "yes" : "no");
Bernhard M. Wiedemann 1defcc
+}
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+gchar *
Bernhard M. Wiedemann 1defcc
+gdm_sysconfig_load_value (const gchar *file_name, const gchar *key)
Bernhard M. Wiedemann 1defcc
+{
Bernhard M. Wiedemann 1defcc
+        gchar **lines;
Bernhard M. Wiedemann 1defcc
+        gchar  *value;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        g_return_val_if_fail (file_name != NULL, NULL);
Bernhard M. Wiedemann 1defcc
+        g_return_val_if_fail (key != NULL, NULL);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        lines = load_settings_file (file_name);
Bernhard M. Wiedemann 1defcc
+        if (!lines)
Bernhard M. Wiedemann 1defcc
+                return NULL;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        value = get_value (lines, key);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        g_strfreev (lines);
Bernhard M. Wiedemann 1defcc
+        return value;
Bernhard M. Wiedemann 1defcc
+}
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+gboolean
Bernhard M. Wiedemann 1defcc
+gdm_sysconfig_save_value (const gchar *file_name, const gchar *key, const gchar *value)
Bernhard M. Wiedemann 1defcc
+{
Bernhard M. Wiedemann 1defcc
+        gchar    **lines;
Bernhard M. Wiedemann 1defcc
+        gboolean   result;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        g_return_val_if_fail (file_name != NULL, FALSE);
Bernhard M. Wiedemann 1defcc
+        g_return_val_if_fail (key != NULL, FALSE);
Bernhard M. Wiedemann 1defcc
+        g_return_val_if_fail (value != NULL, FALSE);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        lines = load_settings_file (file_name);
Bernhard M. Wiedemann 1defcc
+        if (!lines)
Bernhard M. Wiedemann 1defcc
+                return FALSE;
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        result = set_value (lines, key, value);
Bernhard M. Wiedemann 1defcc
+        if (result)
Bernhard M. Wiedemann 1defcc
+                result = save_settings_file (file_name, lines);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+        g_strfreev (lines);
Bernhard M. Wiedemann 1defcc
+        return result;
Bernhard M. Wiedemann 1defcc
+}
c2db8a
Index: accountsservice-23.13.9/src/gdm-sysconfig.h
c2db8a
===================================================================
c2db8a
--- /dev/null
c2db8a
+++ accountsservice-23.13.9/src/gdm-sysconfig.h
Bernhard M. Wiedemann 1defcc
@@ -0,0 +1,43 @@
Bernhard M. Wiedemann 1defcc
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
Bernhard M. Wiedemann 1defcc
+ *
Bernhard M. Wiedemann 1defcc
+ * Copyright (C) 2008 Hans Petter Jansson <hpj@novell.com>
Bernhard M. Wiedemann 1defcc
+ *
Bernhard M. Wiedemann 1defcc
+ * This program is free software; you can redistribute it and/or modify
Bernhard M. Wiedemann 1defcc
+ * it under the terms of the GNU General Public License as published by
Bernhard M. Wiedemann 1defcc
+ * the Free Software Foundation; either version 2 of the License, or
Bernhard M. Wiedemann 1defcc
+ * (at your option) any later version.
Bernhard M. Wiedemann 1defcc
+ *
Bernhard M. Wiedemann 1defcc
+ * This program is distributed in the hope that it will be useful,
Bernhard M. Wiedemann 1defcc
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
Bernhard M. Wiedemann 1defcc
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Bernhard M. Wiedemann 1defcc
+ * GNU General Public License for more details.
Bernhard M. Wiedemann 1defcc
+ *
Bernhard M. Wiedemann 1defcc
+ * You should have received a copy of the GNU General Public License
Bernhard M. Wiedemann 1defcc
+ * along with this program; if not, write to the Free Software
Bernhard M. Wiedemann 1defcc
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Bernhard M. Wiedemann 1defcc
+ *
Bernhard M. Wiedemann 1defcc
+ */
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+#ifndef __GDM_SYSCONFIG_H
Bernhard M. Wiedemann 1defcc
+#define __GDM_SYSCONFIG_H
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+#include <glib-object.h>
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+G_BEGIN_DECLS
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+gchar    **gdm_sysconfig_load_file (const gchar *file_name);
Bernhard M. Wiedemann 1defcc
+gboolean   gdm_sysconfig_save_file (const gchar *file_name, const gchar **sysconfig);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+gchar     *gdm_sysconfig_get_value (const gchar **sysconfig, const gchar *key);
Bernhard M. Wiedemann 1defcc
+gboolean   gdm_sysconfig_set_value (gchar **sysconfig, const gchar *key, const gchar *value);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+gboolean   gdm_sysconfig_get_value_boolean (const gchar **sysconfig, const gchar *key, gboolean *value);
Bernhard M. Wiedemann 1defcc
+gboolean   gdm_sysconfig_set_value_boolean (gchar **sysconfig, const gchar *key, gboolean value);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+gchar     *gdm_sysconfig_load_value (const gchar *file_name, const gchar *key);
Bernhard M. Wiedemann 1defcc
+gboolean   gdm_sysconfig_save_value (const gchar *file_name, const gchar *key, const gchar *value);
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+G_END_DECLS
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+#endif /* __GDM_SYSCONFIG_H */
c2db8a
Index: accountsservice-23.13.9/src/meson.build
c2db8a
===================================================================
c2db8a
--- accountsservice-23.13.9.orig/src/meson.build
c2db8a
+++ accountsservice-23.13.9/src/meson.build
c2db8a
@@ -48,6 +48,8 @@ libaccounts_generated_dep = declare_depe
Bernhard M. Wiedemann 1defcc
 )
Bernhard M. Wiedemann 1defcc
 
Bernhard M. Wiedemann 1defcc
 sources = files(
Bernhard M. Wiedemann 1defcc
+  'gdm-sysconfig.c',
Bernhard M. Wiedemann 1defcc
+  'gdm-sysconfig.h',
Bernhard M. Wiedemann 1defcc
   'daemon.c',
Bernhard M. Wiedemann 1defcc
   'extensions.c',
Bernhard M. Wiedemann 1defcc
   'main.c',