#include <config.h>
+#include <errno.h>
+#include <sys/stat.h>
#include <gio/gio.h>
#include <gio/gunixsocketaddress.h>
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)
{
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;
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;
}