summaryrefslogtreecommitdiff
path: root/liblightdm-gobject/greeter.c
diff options
context:
space:
mode:
authorRobert Ancell <robert.ancell@canonical.com>2014-09-04 17:09:02 +1200
committerRobert Ancell <robert.ancell@canonical.com>2014-09-04 17:09:02 +1200
commit9a7b6696bad660ded7baa50760bf441daeb7cc0b (patch)
tree950784549467a98d22e61a7267bf2a62cf9f7a4e /liblightdm-gobject/greeter.c
parent93115a79e1be38c93d05e0fd511900167973cd04 (diff)
downloadlightdm-git-9a7b6696bad660ded7baa50760bf441daeb7cc0b.tar.gz
Make socket writing code used between greeter and daemon more robust
Diffstat (limited to 'liblightdm-gobject/greeter.c')
-rw-r--r--liblightdm-gobject/greeter.c30
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;
}