Re: [gdm-list] Help with GDM 2.20.2: gdm ignoring custom server config
- From: Martin Weinberg <martin weinberg comcast net>
- To: Brian Cameron <Brian Cameron Sun COM>
- Cc: Martin Weinberg <martin weinberg comcast net>, gdm-list gnome org
- Subject: Re: [gdm-list] Help with GDM 2.20.2: gdm ignoring custom server config
- Date: Fri, 4 Jan 2008 11:21:09 -0500
Thanks!!
I tried your patch, the ChangeLog did not patch smoothly but no
matter, the source itself did.
However, the patch gdm dies with a seg fault in parsing the config in
gdm-daemon-config.c at line 1211 in load_xservers_group(). I compiled
with debug to see if there was something obvious to me. Does this
help? I don't think this is on my end (e.g. in the patching). The
loop looks like:
for (j = 0; j < G_N_ELEMENTS (gdm_daemon_server_config_entries); j++) {
GdmConfigEntry *srv_entry;
if (gdm_daemon_server_config_entries[j].key == NULL) {
continue;
}
srv_entry = gdm_config_entry_copy (&gdm_daemon_server_config_entries[j]);
g_free (srv_entry->group);
srv_entry->group = xserver_group;
gdm_config_process_entry (config, srv_entry, NULL);
gdm_config_entry_free (srv_entry);
}
BTW, the [servers] section in my gdm.conf is default, that is to say,
empty.
On Thu, Jan 03, 2008 at 12:33:10AM -0600, Brian Cameron wrote:
> Martin:
>
> >I recently upgraded to GDM 2.20.2 via Debian/Lenny. I now notice that
> >my custom [server-foo] instances are being ignored without messages.
> >I turned on debug to look for a problem.
>
> GDM 2.20 has a bug that [server-foo] sections are not read by the daemon
> unless they are actually used by a display in the [servers] section.
> Refer to bug #462613.
>
> http://bugzilla.gnome.org/show_bug.cgi?id=462613
>
> For example, if you have the following in your [servers] section:
>
> [servers]
> 0=Standard
> 1=Foo
>
> Then *only* [server-Standard} and [server-Foo} will be read by the
> daemon and recognized. If you have other "server-xyz" sections, they
> will be ignored.
>
> This was recently fixed in the 2.20 branch so now it should work
> better and read in all the server-* sections even if they aren't
> used in the [servers] section.
>
> You don't mention the contents of the "[servers]" section of your
> configuration file, so I'm not 100% sure this is your problem, but
> I'm guessing this known issue is what you are seeing?
>
> Could you try the attached patch and see if it fixes your issues?
> This fix will go into the next release of GDM 2.20.
>
> If this doesn't fix your problem, please provide additional details
> and we can look into the problems further.
>
> Thanks,
>
> Brian
>
>
>
> >E.g
> >
> >>gdmflexiserver -c GET_SERVER_LIST
> >OK Standard
> >
> >but my gdm.conf has:
> >
> >[server-Standard]
> >name=Standard server
> >command=/usr/bin/X -br -audit 0 -layout Single
> >flexible=true
> >
> >[server-Dual]
> >name=Dual Head
> >command=/usr/bin/X -br -audit 0 -layout Dual
> >flexible=true
> >
> >[server-Xinerama]
> >name=Xinerama
> >command=/usr/bin/X -br -audit 0 -layout Xinerama
> >flexible=true
> >
> >If I do:
> >
> >>gdmflexiserver -c "GET_SERVER_DETAILS Standard COMMAND"
> >OK /usr/bin/X -br -audit 0 -layout Single
> >
> >which shows my nonstandard command. I tried changing order
> >of the stanzas while grabbing at straws.
> >
> >Is this a Debian problem? This all worked fine on an earlier version.
> >Does anyone know what I'm missing? A new default feature? I tried
> >scanning the changelogs but didn't find anything relevant.
> >
> >Thanks in advance!!
> >
> >--Martin
> >
> >
> >P.S. I'm not suscribed so please cc me . . .
> >_______________________________________________
> >gdm-list mailing list
> >gdm-list gnome org
> >http://mail.gnome.org/mailman/listinfo/gdm-list
>
> Index: ChangeLog
> ===================================================================
> --- ChangeLog (revision 5598)
> +++ ChangeLog (working copy)
> @@ -1,3 +1,20 @@
> +2008-01-02 Brian Cameron <brian cameron sun com>
> +
> + * common/gdm-config.h, common/gdm-config.c: Add function for
> + getting a list of server-foo sections from the configuration
> + files. Also fix bug that was causing the comparison of
> + STRING_ARRAY keys to not work. This was causing gdmsetup
> + to behave badly when changing the value of the
> + Halt/Shutdown/Reboot commands. Fixes bug #502074.
> + * daemon/gdm-daemon-config.c: Now use the above functions to
> + get the server-foo section names rather than just parsing the
> + ones used in the [server] section. This makes gdmsetup work
> + better and fixes bug #462613.
> + * daemon/gdm.c, daemon/gdm-daemon-config.c: Set debug as soon as
> + the configuration value is read, not after the configuration
> + file parsing is done. This is useful for debugging problems
> + while parsing.
> +
> 2007-12-21 Brian Cameron <brian cameron sun com>
>
> * daemon/gdm.c, daemon/slave.c: Fix some casting issues pointed out
> @@ -7,7 +24,12 @@
>
> * gui/gdmflexiserver.c: Revert to the old logic for handling
> options. This uses g_option_context* rather than gtk_init.
> - This fixes bug #438939.
> + Now we only call gtk_init when not handling the "--command"
> + argument. This fixes bug #438939. The problem here is that
> + you should be able to run gdmflexiserver with the --command
> + option even if running setuid or setgid, but the gtk_init
> + function doesn't allow this. So we need to use the g_option
> + functions instead.
>
> 2007-12-10 Brian Cameron <brian cameron sun com>
>
> Index: common/gdm-config.h
> ===================================================================
> --- common/gdm-config.h (revision 5598)
> +++ common/gdm-config.h (working copy)
> @@ -126,6 +126,7 @@
> const gchar *group_name,
> gsize *length,
> GError **error);
> +GPtrArray * gdm_config_get_server_groups (GdmConfig *config);
>
> gboolean gdm_config_peek_value (GdmConfig *config,
> const char *group,
> Index: common/gdm-config.c
> ===================================================================
> --- common/gdm-config.c (revision 5598)
> +++ common/gdm-config.c (working copy)
> @@ -286,7 +286,7 @@
> int res;
>
> str_a = gdm_config_value_to_string (value_a);
> - str_b = gdm_config_value_to_string (value_a);
> + str_b = gdm_config_value_to_string (value_b);
> res = safe_strcmp (str_a, str_b);
> g_free (str_a);
> g_free (str_b);
> @@ -615,6 +615,71 @@
> g_slice_free (GdmConfig, config);
> }
>
> +static void
> +add_server_group_once (GPtrArray *server_groups, char *group)
> +{
> + int i;
> +
> + for (i=0; i < server_groups->len; i++) {
> + if (strcmp (g_ptr_array_index (server_groups, i), group) == 0) {
> + g_debug ("server group %s already exists, skipping",
> + group);
> + return;
> + }
> + }
> + g_ptr_array_add (server_groups, g_strdup (group));
> +}
> +
> +GPtrArray *
> +gdm_config_get_server_groups (GdmConfig *config)
> +{
> + GPtrArray *server_groups;
> + GError *error;
> + char **groups;
> + gsize len;
> + int i;
> +
> + server_groups = g_ptr_array_new ();
> +
> + if (config->mandatory_key_file != NULL) {
> + groups = g_key_file_get_groups (config->mandatory_key_file, &len);
> +
> + for (i = 0; i < len; i++)
> + {
> + if (g_str_has_prefix (groups[i], "server-")) {
> + add_server_group_once (server_groups, groups[i]);
> + }
> + }
> + g_strfreev (groups);
> + }
> +
> + if (config->default_key_file != NULL) {
> + groups = g_key_file_get_groups (config->default_key_file, &len);
> +
> + for (i = 0; i < len; i++)
> + {
> + if (g_str_has_prefix (groups[i], "server-")) {
> + add_server_group_once (server_groups, groups[i]);
> + }
> + }
> + g_strfreev (groups);
> + }
> +
> + if (config->custom_key_file != NULL) {
> + groups = g_key_file_get_groups (config->custom_key_file, &len);
> +
> + for (i = 0; i < len; i++)
> + {
> + if (g_str_has_prefix (groups[i], "server-")) {
> + add_server_group_once (server_groups, groups[i]);
> + }
> + }
> + g_strfreev (groups);
> + }
> +
> + return server_groups;
> +}
> +
> const GdmConfigEntry *
> gdm_config_lookup_entry (GdmConfig *config,
> const char *group,
> Index: daemon/gdm.c
> ===================================================================
> --- daemon/gdm.c (revision 5598)
> +++ daemon/gdm.c (working copy)
> @@ -1575,7 +1575,6 @@
> gdm_log_init ();
> /* Parse configuration file */
> gdm_daemon_config_parse (config_file, no_console);
> - gdm_log_set_debug (gdm_daemon_config_get_bool_for_id (GDM_ID_DEBUG));
>
> /* XDM compliant error message */
> if G_UNLIKELY (getuid () != 0) {
> Index: daemon/gdm-daemon-config.c
> ===================================================================
> --- daemon/gdm-daemon-config.c (revision 5598)
> +++ daemon/gdm-daemon-config.c (working copy)
> @@ -1067,12 +1067,11 @@
> */
> static void
> gdm_daemon_config_load_xserver (GdmConfig *config,
> - const char *key,
> + const char *group,
> const char *name)
> {
> GdmXserver *svr;
> int n;
> - char *group;
> gboolean res;
> GdmConfigValue *value;
>
> @@ -1084,8 +1083,6 @@
> svr = g_new0 (GdmXserver, 1);
> svr->id = g_strdup (name);
>
> - group = g_strdup_printf ("server-%s", name);
> -
> /* string */
> res = gdm_config_get_value (config, group, "name", &value);
> if (res) {
> @@ -1141,8 +1138,6 @@
> }
>
> xservers = g_slist_append (xservers, svr);
> -
> - g_free (group);
> }
>
> static void
> @@ -1187,78 +1182,45 @@
> static void
> load_xservers_group (GdmConfig *config)
> {
> - char **keys;
> - gsize len;
> - int i;
> + GPtrArray *server_groups;
> + char **vname_array;
> + char *xserver_value;
> + int i, j;
>
> - keys = gdm_config_get_keys_for_group (config,
> - GDM_CONFIG_GROUP_SERVERS, &len, NULL);
> + server_groups = gdm_config_get_server_groups (config);
>
> - /* now construct entries for these groups */
> - for (i = 0; i < len; i++) {
> - GdmConfigEntry entry;
> - GdmConfigValue *value;
> - const char *display_value;
> - const char *name;
> - char **value_list;
> - char *new_group;
> - int j;
> - gboolean res;
> + for (i=0; i < server_groups->len; i++) {
> + xserver_value = g_ptr_array_index (server_groups, i);
> + gdm_debug ("Processing server group <%s>", xserver_value);
>
> - entry.group = GDM_CONFIG_GROUP_SERVERS;
> - entry.key = keys[i];
> - entry.type = GDM_CONFIG_VALUE_STRING;
> - entry.default_value = NULL;
> - entry.id = GDM_CONFIG_INVALID_ID;
> + if (g_str_has_prefix (xserver_value, "server-")) {
> + char * xserver_group;
> + char * xserver_name;
>
> - gdm_config_add_entry (config, &entry);
> - gdm_config_process_entry (config, &entry, NULL);
> + xserver_group = g_strdup (xserver_value);
> +
> + for (j = 0; j < G_N_ELEMENTS (gdm_daemon_server_config_entries); j++) {
> + GdmConfigEntry *srv_entry;
> + if (gdm_daemon_server_config_entries[j].key == NULL) {
> + continue;
> + }
> + srv_entry = gdm_config_entry_copy (&gdm_daemon_server_config_entries[j]);
> + g_free (srv_entry->group);
> + srv_entry->group = xserver_group;
> + gdm_config_process_entry (config, srv_entry, NULL);
> + gdm_config_entry_free (srv_entry);
> + }
>
> - res = gdm_config_get_value (config, entry.group, entry.key,
> - &value);
> - if (! res) {
> - continue;
> - }
> + /* Strip "server-" prefix from name */
> + xserver_name = xserver_group + strlen ("server-");
>
> - display_value = gdm_config_value_get_string (value);
> - value_list = g_strsplit (display_value, " ", -1);
> - if (value_list == NULL || value_list[0] == '\0') {
> - gdm_config_value_free (value);
> - g_strfreev (value_list);
> - continue;
> + /* Now we can add this server */
> + if (xserver_name != NULL)
> + gdm_daemon_config_load_xserver (config, xserver_group, xserver_name);
> }
> -
> - name = value_list[0];
> -
> - /* Skip servers marked as inactive */
> - if (name == NULL || name[0] == '\0' ||
> - g_ascii_strcasecmp (name, "inactive") == 0) {
> - gdm_config_value_free (value);
> - g_strfreev (value_list);
> - continue;
> - }
> -
> - new_group = g_strdup_printf ("server-%s", name);
> - for (j = 0; j < G_N_ELEMENTS (gdm_daemon_server_config_entries); j++) {
> - GdmConfigEntry *srv_entry;
> - if (gdm_daemon_server_config_entries[j].key == NULL) {
> - continue;
> - }
> - srv_entry = gdm_config_entry_copy (&gdm_daemon_server_config_entries[j]);
> - g_free (srv_entry->group);
> - srv_entry->group = g_strdup (new_group);
> - gdm_config_process_entry (config, srv_entry, NULL);
> - gdm_config_entry_free (srv_entry);
> - }
> - g_free (new_group);
> -
> - /* Now we can add this server */
> - gdm_daemon_config_load_xserver (config, entry.key, name);
> - gdm_config_value_free (value);
> - g_strfreev (value_list);
> }
>
> - g_strfreev (keys);
> + g_ptr_array_free (server_groups, TRUE);
> }
>
> static void
> @@ -1471,16 +1433,36 @@
> keys = gdm_config_get_keys_for_group (config,
> GDM_CONFIG_GROUP_SERVERS, &len, NULL);
>
> - /* now construct entries for these groups */
> - for (i = 0; i < len; i++) {
> + for (i = 0; i < len; i++) {
> + GdmConfigEntry entry;
> + GdmConfigValue *value;
> + const char *display_value;
> + const char *name;
> + char **value_list;
> + char *new_group;
> + int j;
> + gboolean res;
> +
> + entry.group = GDM_CONFIG_GROUP_SERVERS;
> + entry.key = keys[i];
> + entry.type = GDM_CONFIG_VALUE_STRING;
> + entry.default_value = NULL;
> + entry.id = GDM_CONFIG_INVALID_ID;
> +
> + gdm_config_add_entry (config, &entry);
> + gdm_config_process_entry (config, &entry, NULL);
> + }
> +
> + /* Now construct entries for these groups */
> + for (i = 0; i < len; i++) {
> + char **value_list;
> GString *command = NULL;
> - GdmDisplay *disp;
> - GdmConfigValue *value;
> + GdmDisplay *disp;
> + GdmConfigValue *value;
> const char *name = NULL;
> const char *device_name = NULL;
> - char **value_list;
> - int keynum;
> - gboolean res;
> + int keynum;
> + gboolean res;
>
> name = keys[i];
>
> @@ -1490,15 +1472,20 @@
>
> keynum = atoi (name);
>
> - res = gdm_config_get_value (config, GDM_CONFIG_GROUP_SERVERS,
> + res = gdm_config_get_value (config, GDM_CONFIG_GROUP_SERVERS,
> keys[i], &value);
> if (! res) {
> continue;
> }
>
> - display_value = gdm_config_value_get_string (value);
> - value_list = g_strsplit (display_value, " ", -1);
> + display_value = gdm_config_value_get_string (value);
>
> + /* Skip displays marked as inactive */
> + if (g_ascii_strcasecmp (display_value, "inactive") == 0)
> + continue;
> +
> + value_list = g_strsplit (display_value, " ", -1);
> +
> if (value_list == NULL || value_list[0] == '\0') {
> gdm_config_value_free (value);
> g_strfreev (value_list);
> @@ -1524,7 +1511,7 @@
> g_string_append (command, " ");
> }
> j++;
> - }
> + }
>
> gdm_debug ("Loading display for key '%d'", keynum);
>
> @@ -1786,7 +1773,21 @@
> return TRUE;
> }
>
> +/* Cause debug to affect logging as soon as the config value is read */
> static gboolean
> +validate_debug (GdmConfig *config,
> + GdmConfigSourceType source,
> + GdmConfigValue *value)
> +{
> + gboolean debugval;
> +
> + debugval = gdm_config_value_get_bool (value);
> + gdm_log_set_debug (debugval);
> +
> + return TRUE;
> +}
> +
> +static gboolean
> validate_at_least_int (GdmConfig *config,
> GdmConfigSourceType source,
> GdmConfigValue *value,
> @@ -1814,6 +1815,9 @@
> res = TRUE;
>
> switch (id) {
> + case GDM_ID_DEBUG:
> + res = validate_debug (config, source, value);
> + break;
> case GDM_ID_PATH:
> res = validate_path (config, source, value);
> break;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]