]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blobdiff - src/greeter.c
Make socket writing code used between greeter and daemon more robust
[sojka/lightdm.git] / src / greeter.c
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