]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Make socket writing code used between greeter and daemon more robust
authorRobert Ancell <robert.ancell@canonical.com>
Thu, 4 Sep 2014 05:09:02 +0000 (17:09 +1200)
committerRobert Ancell <robert.ancell@canonical.com>
Thu, 4 Sep 2014 05:09:02 +0000 (17:09 +1200)
liblightdm-gobject/greeter.c
src/greeter.c

index 13fdada9f7776ea29f6efc2559bc45acf0dba84f..c2d2c6938eccdd3005ca3f5f6d43a27af1842faa 100644 (file)
@@ -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;
 }
index 9e8829df275bc99ccbe5da512fa1bd75a7181162..bfc77094666160a8c1b13b10a0852e0b46842b65 100644 (file)
@@ -183,13 +183,31 @@ int_length (void)
 static void
 write_message (Greeter *greeter, guint8 *message, gsize message_length)
 {
+    gchar *data;
+    gsize data_length;
     GError *error = NULL;
 
-    g_io_channel_write_chars (greeter->priv->to_greeter_channel, (gchar *) message, message_length, NULL, &error);
+    data = (gchar *) message;
+    data_length = message_length;
+    while (data_length > 0)
+    {
+        GIOStatus status;
+        gsize n_written;
+
+        status = g_io_channel_write_chars (greeter->priv->to_greeter_channel, data, data_length, &n_written, &error);
+        if (error)
+            l_warning (greeter, "Error writing to greeter: %s", error->message);
+        g_clear_error (&error);
+        if (status != G_IO_STATUS_NORMAL)
+            return;
+        data_length -= n_written;
+        data += n_written;
+    }
+
+    g_io_channel_flush (greeter->priv->to_greeter_channel, &error);
     if (error)
-        l_warning (greeter, "Error writing to greeter: %s", error->message);
+        l_warning (greeter, "Failed to flush data to greeter: %s", error->message);
     g_clear_error (&error);
-    g_io_channel_flush (greeter->priv->to_greeter_channel, NULL);
 }
 
 static void