diff -upr gdm-2.19.5-pre/daemon/gdm.c gdm-2.19.5-post/daemon/gdm.c --- gdm-2.19.5-pre/daemon/gdm.c 2007-07-30 13:51:14.000000000 -0500 +++ gdm-2.19.5-post/daemon/gdm.c 2007-08-03 20:23:38.000000000 -0500 @@ -4363,6 +4363,14 @@ gdm_handle_user_message (GdmConnection * gdm_connection_write (conn, "OK false\n"); } else if (strcmp (msg, GDM_SUP_CLOSE) == 0) { gdm_connection_close (conn); + } else if (strcmp (msg, GDM_SOP_CANCEL_LOGIN_REQUESTS) == 0) { + GSList *li; + for (li = gdm_daemon_config_get_display_list (); li != NULL; li = li->next) { + GdmDisplay *d = li->data; + if (!d->logged_in) { + send_slave_command (d, GDM_NOTIFY_RESET); + } + } } else { gdm_connection_write (conn, "ERROR 0 Not implemented\n"); gdm_connection_close (conn); diff -upr gdm-2.19.5-pre/daemon/gdm-daemon-config-keys.h gdm-2.19.5-post/daemon/gdm-daemon-config-keys.h --- gdm-2.19.5-pre/daemon/gdm-daemon-config-keys.h 2007-08-03 20:20:26.000000000 -0500 +++ gdm-2.19.5-post/daemon/gdm-daemon-config-keys.h 2007-08-03 20:23:38.000000000 -0500 @@ -233,6 +233,7 @@ G_BEGIN_DECLS #define GDM_NOTIFY_SOFT_RESTART_SERVERS "SOFT_RESTART_SERVERS" #define GDM_NOTIFY_GO "GO" #define GDM_NOTIFY_TWIDDLE_POINTER "TWIDDLE_POINTER" +#define GDM_NOTIFY_RESET "RESET" G_END_DECLS diff -upr gdm-2.19.5-pre/daemon/gdm-socket-protocol.h gdm-2.19.5-post/daemon/gdm-socket-protocol.h --- gdm-2.19.5-pre/daemon/gdm-socket-protocol.h 2007-08-03 20:20:26.000000000 -0500 +++ gdm-2.19.5-post/daemon/gdm-socket-protocol.h 2007-08-03 20:23:38.000000000 -0500 @@ -157,6 +157,8 @@ #define GDM_SOP_SHOW_QUESTION_DIALOG "SHOW_QUESTION_DIALOG" /* show the question dialog from daemon */ #define GDM_SOP_SHOW_ASKBUTTONS_DIALOG "SHOW_ASKBUTTON_DIALOG" /* show the askbutton dialog from daemon */ +/* Reset any in progress authentication conversations */ +#define GDM_SOP_CANCEL_LOGIN_REQUESTS "CANCEL_LOGIN_REQUESTS" /* no arguments */ /* Ack for a slave message */ /* Note that an extra response can follow an 'ack' */ diff -upr gdm-2.19.5-pre/daemon/slave.c gdm-2.19.5-post/daemon/slave.c --- gdm-2.19.5-pre/daemon/slave.c 2007-08-03 20:20:26.000000000 -0500 +++ gdm-2.19.5-post/daemon/slave.c 2007-08-03 20:24:23.000000000 -0500 @@ -175,6 +175,12 @@ static int gdm_normal_runlevel = static pid_t extra_process = 0; static int extra_status = 0; +/* a dup of the other side of greeter_fd_in so that + * the slave can talk to itself from its sig handler + * using the greeter ipc mechanism + */ +static int slave_fd_out = -1; + #ifdef HAVE_TSOL static gboolean have_suntsol_extension = FALSE; #endif @@ -663,7 +669,7 @@ ignore_xerror_handler (Display *disp, XE } static void -whack_greeter_fds (void) +whack_greeter_and_slave_fds (void) { if (greeter_fd_out > 0) VE_IGNORE_EINTR (close (greeter_fd_out)); @@ -671,6 +677,9 @@ whack_greeter_fds (void) if (greeter_fd_in > 0) VE_IGNORE_EINTR (close (greeter_fd_in)); greeter_fd_in = -1; + if (slave_fd_out > 0) + VE_IGNORE_EINTR (close (slave_fd_out)); + slave_fd_out = -1; } static void @@ -1156,7 +1165,7 @@ gdm_slave_whack_greeter (void) d->greetpid = 0; - whack_greeter_fds (); + whack_greeter_and_slave_fds (); gdm_slave_send_num (GDM_SOP_GREETPID, 0); @@ -2005,7 +2014,7 @@ restart_the_greeter (void) d->greetpid = 0; - whack_greeter_fds (); + whack_greeter_and_slave_fds (); gdm_slave_send_num (GDM_SOP_GREETPID, 0); } @@ -2295,6 +2304,12 @@ gdm_slave_wait_for_login (void) break; } + if (do_cancel) { + gdm_debug ("canceling..."); + gdm_slave_greeter_ctl_no_ret (GDM_RESETOK, ""); + continue; + } + if (login_user == NULL) { const char *failuresound = gdm_daemon_config_get_value_string (GDM_KEY_SOUND_ON_LOGIN_FAILURE_FILE); @@ -2908,9 +2923,10 @@ gdm_slave_greeter (void) default: VE_IGNORE_EINTR (close (pipe1[0])); - VE_IGNORE_EINTR (close (pipe2[1])); - whack_greeter_fds (); + whack_greeter_and_slave_fds (); + + slave_fd_out = pipe2[1]; greeter_fd_out = pipe1[1]; greeter_fd_in = pipe2[0]; @@ -5208,7 +5224,7 @@ gdm_slave_child_handler (int sig) greet = FALSE; d->greetpid = 0; - whack_greeter_fds (); + whack_greeter_and_slave_fds (); gdm_slave_send_num (GDM_SOP_GREETPID, 0); do_restart_greeter = TRUE; @@ -5220,7 +5236,7 @@ gdm_slave_child_handler (int sig) continue; } - whack_greeter_fds (); + whack_greeter_and_slave_fds (); /* if greet is TRUE, then the greeter died outside of our * control really, so clean up and die, something is wrong @@ -5363,6 +5379,11 @@ gdm_slave_handle_usr2_message (void) gdm_wait_for_go = FALSE; } else if (strcmp (&s[1], GDM_NOTIFY_TWIDDLE_POINTER) == 0) { gdm_twiddle_pointer (d); + } else if (strcmp (&s[1], GDM_NOTIFY_RESET) == 0) { + if (!d->logged_in) { + gdm_fdprintf (slave_fd_out, "%c%c%c\n", + STX, BEL, GDM_INTERRUPT_CANCEL); + } } } else if (s[0] == GDM_SLAVE_NOTIFY_RESPONSE) { gdm_got_ack = TRUE; Only in gdm-2.19.5-post/daemon: slave.c~ Only in gdm-2.19.5-post: error.18580 diff -upr gdm-2.19.5-pre/gui/greeter/greeter.c gdm-2.19.5-post/gui/greeter/greeter.c --- gdm-2.19.5-pre/gui/greeter/greeter.c 2007-08-03 20:20:26.000000000 -0500 +++ gdm-2.19.5-post/gui/greeter/greeter.c 2007-08-03 20:23:38.000000000 -0500 @@ -278,7 +278,6 @@ process_operation (guchar op_code, GtkWidget *dlg; char *tmp; char *session; - GreeterItemInfo *conversation_info; static GnomeCanvasItem *disabled_cover = NULL; gint lookup_status = SESSION_LOOKUP_SUCCESS; gchar *firstmsg = NULL; @@ -483,16 +482,9 @@ process_operation (guchar op_code, first_prompt = TRUE; - conversation_info = greeter_lookup_id ("pam-conversation"); - - if (conversation_info) - { - tmp = ve_locale_to_utf8 (args); - g_object_set (G_OBJECT (conversation_info->item), - "text", tmp, - NULL); - g_free (tmp); - } + greeter_item_ulist_unset_selected_user (); + greeter_item_pam_prompt ("", PW_ENTRY_SIZE, TRUE); + greeter_item_pam_message (""); printf ("%c\n", STX); fflush (stdout);