I took the liberty of enabling debug in gdm.conf and relevant bits of log files are attached.
Meanwhile, my C isn't up to an awful lot, much less gtk glib and so on. However, looking in the source I can see that the greeter failing error message is only in one place, from a condition in the gdm_slave_greeter() function in slave.c
daemon/slave.c:2611:
if G_UNLIKELY (d->try_different_greeter) {
/* ... call gdm_error_box with the failure message ... */
Following that, d->try_different_greeter is only set in the gdm_cleanup_children() function in gdm.c when the exit status is DISPLAY_GREETERFAILED (defined as 65 in gdm.h line 76), in this block:
daemon/gdm.c:847:
if (status == DISPLAY_GREETERFAILED) {
if (d->managetime + 10 >= time (NULL)) { d->try_different_greeter = TRUE;
} else { d->try_different_greeter = FALSE;
}
/* now just remanage */
status = DISPLAY_REMANAGE;
} else {
d->try_different_greeter = FALSE;
}
It looks like it is giving up after 10 seconds, so perhaps it is a timing thing? Anyway, I grepped for things that exit with a DISPLAY_GREETERFAILED code and found these:
The daemon/slave.c calls are in the gdm_slave_child_handler() function at line 4621 which handles SIGCHLD signals.
The gui/gdmcommon.c references are in the gdm_common_fail_greeter() function, which looks like it tries to log, clean up and exit with DISPLAY_GREETERFAILED. It is called from gui/greeter/greeter.c (and gui/gdmlogin.c, but we're not concerned with that since it is the fall-back greeter, which works).
In gui/greeter/greeter.c, gdm_common_fail_greeter() is called from int main() at line and the process_operation() function contains a switch(op_code), and the default case calls it at line 451.
gui/greeter/greeter.c:451: gdm_common_fail_greeter ("Unexpected greeter command received: '%c'", op_code);
gui/greeter/greeter.c:1089: gdm_common_fail_greeter ("%s: Error setting up %s signal handler: %s", "main",
gui/greeter/greeter.c:1099: gdm_common_fail_greeter ("%s: Error setting up %s signal handler: %s", "main",
gui/greeter/greeter.c:1104: gdm_common_fail_greeter ("%s: Error setting up %s signal handler: %s", "main",
gui/greeter/greeter.c:1114: gdm_common_fail_greeter ("Could not set signal mask!");
gui/greeter/greeter.c:1122: gdm_common_fail_greeter ("Could not set signal mask!");
So it seems to boil down to gui/greeter/greeter.c and scrutinising what int main() is doing, or else I wonder if there is some op_code that isn't being processed by the process_operation() function?
I took the liberty of enabling debug in gdm.conf and relevant bits of log files are attached.
Meanwhile, my C isn't up to an awful lot, much less gtk glib and so on. However, looking in the source I can see that the greeter failing error message is only in one place, from a condition in the gdm_slave_greeter() function in slave.c
daemon/ slave.c: 2611: different_ greeter) {
if G_UNLIKELY (d->try_
/* ... call gdm_error_box with the failure message ... */
Following that, d->try_ different_ greeter is only set in the gdm_cleanup_ children( ) function in gdm.c when the exit status is DISPLAY_ GREETERFAILED (defined as 65 in gdm.h line 76), in this block:
daemon/gdm.c:847: GREETERFAILED) {
d->try_ different_ greeter = TRUE;
d->try_ different_ greeter = FALSE; >try_different_ greeter = FALSE;
if (status == DISPLAY_
if (d->managetime + 10 >= time (NULL)) {
} else {
}
/* now just remanage */
status = DISPLAY_REMANAGE;
} else {
d-
}
It looks like it is giving up after 10 seconds, so perhaps it is a timing thing? Anyway, I grepped for things that exit with a DISPLAY_ GREETERFAILED code and found these:
daemon/ slave.c: 4692: exit_code_to_use = DISPLAY_ GREETERFAILED; slave.c: 4698: exit_code_to_use = DISPLAY_ GREETERFAILED; GREETERFAILED) ; c:109: _exit (DISPLAY_ GREETERFAILED) ;
daemon/
gui/gdmcommon.c:94: _exit (DISPLAY_
gui/gdmcommon.
The daemon/slave.c calls are in the gdm_slave_ child_handler( ) function at line 4621 which handles SIGCHLD signals.
The gui/gdmcommon.c references are in the gdm_common_ fail_greeter( ) function, which looks like it tries to log, clean up and exit with DISPLAY_ GREETERFAILED. It is called from gui/greeter/ greeter. c (and gui/gdmlogin.c, but we're not concerned with that since it is the fall-back greeter, which works).
In gui/greeter/ greeter. c, gdm_common_ fail_greeter( ) is called from int main() at line and the process_operation() function contains a switch(op_code), and the default case calls it at line 451.
gui/greeter/ greeter. c:451: gdm_common_ fail_greeter ("Unexpected greeter command received: '%c'", op_code); greeter. c:1089: gdm_common_ fail_greeter ("%s: Error setting up %s signal handler: %s", "main", greeter. c:1099: gdm_common_ fail_greeter ("%s: Error setting up %s signal handler: %s", "main", greeter. c:1104: gdm_common_ fail_greeter ("%s: Error setting up %s signal handler: %s", "main", greeter. c:1114: gdm_common_ fail_greeter ("Could not set signal mask!"); greeter. c:1122: gdm_common_ fail_greeter ("Could not set signal mask!");
gui/greeter/
gui/greeter/
gui/greeter/
gui/greeter/
gui/greeter/
So it seems to boil down to gui/greeter/ greeter. c and scrutinising what int main() is doing, or else I wonder if there is some op_code that isn't being processed by the process_operation() function?