diff options
author | Robert Ancell <robert.ancell@canonical.com> | 2014-09-04 17:09:02 +1200 |
---|---|---|
committer | Robert Ancell <robert.ancell@canonical.com> | 2014-09-04 17:09:02 +1200 |
commit | 9a7b6696bad660ded7baa50760bf441daeb7cc0b (patch) | |
tree | 950784549467a98d22e61a7267bf2a62cf9f7a4e /liblightdm-gobject | |
parent | 93115a79e1be38c93d05e0fd511900167973cd04 (diff) | |
download | lightdm-9a7b6696bad660ded7baa50760bf441daeb7cc0b.tar.gz |
Make socket writing code used between greeter and daemon more robust
Diffstat (limited to 'liblightdm-gobject')
-rw-r--r-- | liblightdm-gobject/greeter.c | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/liblightdm-gobject/greeter.c b/liblightdm-gobject/greeter.c index 13fdada9..c2d2c693 100644 --- a/liblightdm-gobject/greeter.c +++ b/liblightdm-gobject/greeter.c @@ -314,7 +314,8 @@ static gboolean send_message (LightDMGreeter *greeter, guint8 *message, gsize message_length) { LightDMGreeterPrivate *priv = GET_PRIVATE (greeter); - GIOStatus status; + gchar *data; + gsize data_length; GError *error = NULL; guint32 stated_length; @@ -333,15 +334,28 @@ send_message (LightDMGreeter *greeter, guint8 *message, gsize message_length) return FALSE; } - status = g_io_channel_write_chars (priv->to_server_channel, (gchar *) message, message_length, NULL, &error); - if (error) - g_warning ("Error writing to daemon: %s", error->message); - g_clear_error (&error); - if (status != G_IO_STATUS_NORMAL) - return FALSE; + data = (gchar *) message; + data_length = message_length; + while (data_length > 0) + { + GIOStatus status; + gsize n_written; + + status = g_io_channel_write_chars (priv->to_server_channel, data, data_length, &n_written, &error); + if (error) + g_warning ("Error writing to daemon: %s", error->message); + g_clear_error (&error); + if (status != G_IO_STATUS_NORMAL) + return FALSE; + data_length -= n_written; + data += n_written; + } g_debug ("Wrote %zi bytes to daemon", message_length); - g_io_channel_flush (priv->to_server_channel, NULL); + g_io_channel_flush (priv->to_server_channel, &error); + if (error) + g_warning ("Failed to flush data to daemon: %s", error->message); + g_clear_error (&error); return TRUE; } |