]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blobdiff - src/greeter-socket.c
Load all users only when really needed
[sojka/lightdm.git] / src / greeter-socket.c
index 4e2b7a3391261e2874168a5f7e3a340fc1ca5f1e..4a7beb53d254ec43e57650352e4bfc816ade3dcf 100644 (file)
@@ -10,6 +10,8 @@
 
 #include <config.h>
 
+#include <errno.h>
+#include <sys/stat.h>
 #include <gio/gio.h>
 #include <gio/gunixsocketaddress.h>
 
@@ -52,6 +54,16 @@ greeter_socket_new (const gchar *path)
     return socket;
 }
 
+static void
+greeter_disconnected_cb (Greeter *greeter, GreeterSocket *socket)
+{
+    if (greeter == socket->priv->greeter)
+    {
+        g_clear_object (&socket->priv->greeter);
+        g_clear_object (&socket->priv->greeter_socket);
+    }
+}
+
 static gboolean
 greeter_connect_cb (GSocket *s, GIOCondition condition, GreeterSocket *socket)
 {
@@ -75,6 +87,7 @@ greeter_connect_cb (GSocket *s, GIOCondition condition, GreeterSocket *socket)
 
     socket->priv->greeter_socket = new_socket;
     g_signal_emit (socket, signals[CREATE_GREETER], 0, &socket->priv->greeter);
+    g_signal_connect (socket->priv->greeter, GREETER_SIGNAL_DISCONNECTED, G_CALLBACK (greeter_disconnected_cb), socket);
     greeter_set_file_descriptors (socket->priv->greeter, g_socket_get_fd (new_socket), g_socket_get_fd (new_socket));
 
     return G_SOURCE_CONTINUE;
@@ -106,6 +119,18 @@ greeter_socket_start (GreeterSocket *socket, GError **error)
     g_source_set_callback (socket->priv->source, (GSourceFunc) greeter_connect_cb, socket, NULL);
     g_source_attach (socket->priv->source, NULL);
 
+    /* Allow to be written to */
+    if (chmod (socket->priv->path, S_IRWXU | S_IRWXG | S_IRWXO) < 0)
+    {
+        g_set_error (error,
+                     G_FILE_ERROR,
+                     g_file_error_from_errno (errno),
+                     "Failed to set permissions on greeter socket %s: %s",
+                     socket->priv->path,
+                     g_strerror (errno));     
+        return FALSE;
+    }
+
     return TRUE;
 }