/* Port to listen on */
guint port;
+ /* Address to listen on */
+ gchar *listen_address;
+
/* Listening sockets */
GSocket *socket, *socket6;
};
return server->priv->port;
}
+void
+vnc_server_set_listen_address (VNCServer *server, const gchar *listen_address)
+{
+ g_return_if_fail (server != NULL);
+
+ g_free (server->priv->listen_address);
+ server->priv->listen_address = g_strdup (listen_address);
+}
+
+const gchar *
+vnc_server_get_listen_address (VNCServer *server)
+{
+ g_return_val_if_fail (server != NULL, NULL);
+ return server->priv->listen_address;
+}
+
static gboolean
read_cb (GSocket *socket, GIOCondition condition, VNCServer *server)
{
}
static GSocket *
-open_tcp_socket (GSocketFamily family, guint port, GError **error)
+open_tcp_socket (GSocketFamily family, guint port, const gchar *listen_address, GError **error)
{
GSocket *socket;
GSocketAddress *address;
if (!socket)
return NULL;
- address = g_inet_socket_address_new (g_inet_address_new_any (family), port);
+ if (listen_address)
+ {
+ GList *addresses;
+
+ addresses = g_resolver_lookup_by_name (g_resolver_get_default (), listen_address, NULL, error);
+ if (!addresses)
+ {
+ g_object_unref (socket);
+ return NULL;
+ }
+ address = g_inet_socket_address_new (addresses->data, port);
+ g_resolver_free_addresses (addresses);
+ }
+ else
+ address = g_inet_socket_address_new (g_inet_address_new_any (family), port);
if (!g_socket_bind (socket, address, TRUE, error) ||
!g_socket_listen (socket, error))
{
g_return_val_if_fail (server != NULL, FALSE);
- server->priv->socket = open_tcp_socket (G_SOCKET_FAMILY_IPV4, server->priv->port, &error);
+ server->priv->socket = open_tcp_socket (G_SOCKET_FAMILY_IPV4, server->priv->port, server->priv->listen_address, &error);
if (error)
g_warning ("Failed to create IPv4 VNC socket: %s", error->message);
g_clear_error (&error);
g_source_attach (source, NULL);
}
- server->priv->socket6 = open_tcp_socket (G_SOCKET_FAMILY_IPV6, server->priv->port, &error);
+ server->priv->socket6 = open_tcp_socket (G_SOCKET_FAMILY_IPV6, server->priv->port, server->priv->listen_address, &error);
if (error)
g_warning ("Failed to create IPv6 VNC socket: %s", error->message);
g_clear_error (&error);
static void
vnc_server_finalize (GObject *object)
{
- VNCServer *self;
-
- self = VNC_SERVER (object);
+ VNCServer *self = VNC_SERVER (object);
- if (self->priv->socket)
- g_object_unref (self->priv->socket);
- if (self->priv->socket6)
- g_object_unref (self->priv->socket6);
+ g_free (self->priv->listen_address);
+ g_clear_object (&self->priv->socket);
+ g_clear_object (&self->priv->socket6);
G_OBJECT_CLASS (vnc_server_parent_class)->finalize (object);
}