diff options
Diffstat (limited to 'src/greeter-socket.c')
-rw-r--r-- | src/greeter-socket.c | 76 |
1 files changed, 42 insertions, 34 deletions
diff --git a/src/greeter-socket.c b/src/greeter-socket.c index 94ba1d19..7400b932 100644 --- a/src/greeter-socket.c +++ b/src/greeter-socket.c @@ -23,7 +23,7 @@ enum { }; static guint signals[LAST_SIGNAL] = { 0 }; -struct GreeterSocketPrivate +typedef struct { /* Path of socket to use */ gchar *path; @@ -39,7 +39,7 @@ struct GreeterSocketPrivate /* Greeter connected on this socket */ Greeter *greeter; -}; +} GreeterSocketPrivate; G_DEFINE_TYPE_WITH_PRIVATE (GreeterSocket, greeter_socket, G_TYPE_OBJECT) @@ -47,7 +47,9 @@ GreeterSocket * greeter_socket_new (const gchar *path) { GreeterSocket *socket = g_object_new (GREETER_SOCKET_TYPE, NULL); - socket->priv->path = g_strdup (path); + GreeterSocketPrivate *priv = greeter_socket_get_instance_private (socket); + + priv->path = g_strdup (path); return socket; } @@ -55,34 +57,38 @@ greeter_socket_new (const gchar *path) static void greeter_disconnected_cb (Greeter *greeter, GreeterSocket *socket) { - if (greeter == socket->priv->greeter) + GreeterSocketPrivate *priv = greeter_socket_get_instance_private (socket); + + if (greeter == priv->greeter) { - g_clear_object (&socket->priv->greeter); - g_clear_object (&socket->priv->greeter_socket); + g_clear_object (&priv->greeter); + g_clear_object (&priv->greeter_socket); } } static gboolean greeter_connect_cb (GSocket *s, GIOCondition condition, GreeterSocket *socket) { + GreeterSocketPrivate *priv = greeter_socket_get_instance_private (socket); + g_autoptr(GError) error = NULL; - g_autoptr(GSocket) new_socket = g_socket_accept (socket->priv->socket, NULL, &error); + g_autoptr(GSocket) new_socket = g_socket_accept (priv->socket, NULL, &error); if (error) g_warning ("Failed to accept greeter connection: %s", error->message); if (!new_socket) return G_SOURCE_CONTINUE; /* Greeter already connected */ - if (socket->priv->greeter) + if (priv->greeter) { g_socket_close (new_socket, NULL); return G_SOURCE_CONTINUE; } - socket->priv->greeter_socket = g_steal_pointer (&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 (socket->priv->greeter_socket), g_socket_get_fd (socket->priv->greeter_socket)); + priv->greeter_socket = g_steal_pointer (&new_socket); + g_signal_emit (socket, signals[CREATE_GREETER], 0, &priv->greeter); + g_signal_connect (priv->greeter, GREETER_SIGNAL_DISCONNECTED, G_CALLBACK (greeter_disconnected_cb), socket); + greeter_set_file_descriptors (priv->greeter, g_socket_get_fd (priv->greeter_socket), g_socket_get_fd (priv->greeter_socket)); return G_SOURCE_CONTINUE; } @@ -90,34 +96,36 @@ greeter_connect_cb (GSocket *s, GIOCondition condition, GreeterSocket *socket) gboolean greeter_socket_start (GreeterSocket *socket, GError **error) { + GreeterSocketPrivate *priv = greeter_socket_get_instance_private (socket); + g_return_val_if_fail (socket != NULL, FALSE); - g_return_val_if_fail (socket->priv->socket == NULL, FALSE); + g_return_val_if_fail (priv->socket == NULL, FALSE); - socket->priv->socket = g_socket_new (G_SOCKET_FAMILY_UNIX, G_SOCKET_TYPE_STREAM, G_SOCKET_PROTOCOL_DEFAULT, error); - if (!socket->priv->socket) + priv->socket = g_socket_new (G_SOCKET_FAMILY_UNIX, G_SOCKET_TYPE_STREAM, G_SOCKET_PROTOCOL_DEFAULT, error); + if (!priv->socket) return FALSE; - unlink (socket->priv->path); - g_autoptr(GSocketAddress) address = g_unix_socket_address_new (socket->priv->path); - gboolean result = g_socket_bind (socket->priv->socket, address, FALSE, error); + unlink (priv->path); + g_autoptr(GSocketAddress) address = g_unix_socket_address_new (priv->path); + gboolean result = g_socket_bind (priv->socket, address, FALSE, error); if (!result) return FALSE; - if (!g_socket_listen (socket->priv->socket, error)) + if (!g_socket_listen (priv->socket, error)) return FALSE; - socket->priv->source = g_socket_create_source (socket->priv->socket, G_IO_IN, NULL); - g_source_set_callback (socket->priv->source, (GSourceFunc) greeter_connect_cb, socket, NULL); - g_source_attach (socket->priv->source, NULL); + priv->source = g_socket_create_source (priv->socket, G_IO_IN, NULL); + g_source_set_callback (priv->source, (GSourceFunc) greeter_connect_cb, socket, NULL); + g_source_attach (priv->source, NULL); /* Allow to be written to */ - if (chmod (socket->priv->path, S_IRWXU | S_IRWXG | S_IRWXO) < 0) + if (chmod (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)); + priv->path, + g_strerror (errno)); return FALSE; } @@ -127,21 +135,21 @@ greeter_socket_start (GreeterSocket *socket, GError **error) static void greeter_socket_init (GreeterSocket *socket) { - socket->priv = G_TYPE_INSTANCE_GET_PRIVATE (socket, GREETER_SOCKET_TYPE, GreeterSocketPrivate); } static void greeter_socket_finalize (GObject *object) { GreeterSocket *self = GREETER_SOCKET (object); - - if (self->priv->path) - unlink (self->priv->path); - g_clear_pointer (&self->priv->path, g_free); - g_clear_object (&self->priv->socket); - g_clear_object (&self->priv->source); - g_clear_object (&self->priv->greeter_socket); - g_clear_object (&self->priv->greeter); + GreeterSocketPrivate *priv = greeter_socket_get_instance_private (self); + + if (priv->path) + unlink (priv->path); + g_clear_pointer (&priv->path, g_free); + g_clear_object (&priv->socket); + g_clear_object (&priv->source); + g_clear_object (&priv->greeter_socket); + g_clear_object (&priv->greeter); G_OBJECT_CLASS (greeter_socket_parent_class)->finalize (object); } |