diff options
author | Michael Terry <michael.terry@canonical.com> | 2012-08-17 14:38:21 -0400 |
---|---|---|
committer | Michael Terry <michael.terry@canonical.com> | 2012-08-17 14:38:21 -0400 |
commit | 8c308d4e3455bc9600fd3b64832156f6f0ba775c (patch) | |
tree | ac42627985a04163b6fac837e726472dff82e671 | |
parent | 902617f00b428cef10c524839e7d6940a03297d9 (diff) | |
download | lightdm-8c308d4e3455bc9600fd3b64832156f6f0ba775c.tar.gz |
queue up responses in greeter and send them at once to lightdm daemon
-rw-r--r-- | liblightdm-gobject/greeter.c | 46 |
1 files changed, 36 insertions, 10 deletions
diff --git a/liblightdm-gobject/greeter.c b/liblightdm-gobject/greeter.c index 78943d76..2d31b84c 100644 --- a/liblightdm-gobject/greeter.c +++ b/liblightdm-gobject/greeter.c @@ -50,7 +50,9 @@ typedef struct GIOChannel *to_server_channel, *from_server_channel; guint8 *read_buffer; gsize n_read; - gsize n_prompts_waiting; + + gsize n_responses_waiting; + GList *responses_received; GHashTable *hints; guint autologin_timeout; @@ -302,6 +304,10 @@ handle_prompt_authentication (LightDMGreeter *greeter, guint8 *message, gsize me g_free (priv->authentication_user); priv->authentication_user = username; + g_list_free_full (priv->responses_received, g_free); + priv->responses_received = NULL; + priv->n_responses_waiting = 0; + n_messages = read_int (message, message_length, offset); g_debug ("Prompt user with %d message(s)", n_messages); @@ -317,11 +323,11 @@ handle_prompt_authentication (LightDMGreeter *greeter, guint8 *message, gsize me switch (style) { case PAM_PROMPT_ECHO_OFF: - priv->n_prompts_waiting++; + priv->n_responses_waiting++; g_signal_emit (G_OBJECT (greeter), signals[SHOW_PROMPT], 0, text, LIGHTDM_PROMPT_TYPE_SECRET); break; case PAM_PROMPT_ECHO_ON: - priv->n_prompts_waiting++; + priv->n_responses_waiting++; g_signal_emit (G_OBJECT (greeter), signals[SHOW_PROMPT], 0, text, LIGHTDM_PROMPT_TYPE_QUESTION); break; case PAM_ERROR_MSG: @@ -845,15 +851,35 @@ lightdm_greeter_respond (LightDMGreeter *greeter, const gchar *response) priv = GET_PRIVATE (greeter); g_return_if_fail (priv->connected); - g_return_if_fail (priv->n_prompts_waiting > 0); + g_return_if_fail (priv->n_responses_waiting > 0); - priv->n_prompts_waiting--; + priv->n_responses_waiting--; + priv->responses_received = g_list_append (priv->responses_received, g_strdup (response)); - g_debug ("Providing response to display manager"); - write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_CONTINUE_AUTHENTICATION, int_length () + string_length (response), &offset); - write_int (message, MAX_MESSAGE_LENGTH, 1, &offset); - write_string (message, MAX_MESSAGE_LENGTH, response, &offset); - write_message (greeter, message, offset); + if (priv->n_responses_waiting == 0) + { + guint32 msg_length; + GList *iter; + + g_debug ("Providing response to display manager"); + + msg_length = int_length (); + for (iter = priv->responses_received; iter; iter = iter->next) + { + msg_length += string_length ((gchar *)iter->data); + } + + write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_CONTINUE_AUTHENTICATION, msg_length, &offset); + write_int (message, MAX_MESSAGE_LENGTH, g_list_length (priv->responses_received), &offset); + for (iter = priv->responses_received; iter; iter = iter->next) + { + write_string (message, MAX_MESSAGE_LENGTH, (gchar *)iter->data, &offset); + } + write_message (greeter, message, offset); + + g_list_free_full (priv->responses_received, g_free); + priv->responses_received = NULL; + } } /** |