diff options
author | Robert Ancell <robert.ancell@canonical.com> | 2014-11-10 11:04:45 +1300 |
---|---|---|
committer | Robert Ancell <robert.ancell@canonical.com> | 2014-11-10 11:04:45 +1300 |
commit | cb72ae149f4dc5f85ec7b6c1c529a79980b6321b (patch) | |
tree | f83ea25469e2b3b3d3e9b681e36f10b60df9c132 /src | |
parent | 490bbc43ae05c0ae7fcac9fd781ffa899634930a (diff) | |
download | lightdm-cb72ae149f4dc5f85ec7b6c1c529a79980b6321b.tar.gz |
Add an option for XDMCP and VNC servers to only listen on one address
Diffstat (limited to 'src')
-rw-r--r-- | src/vnc-server.c | 42 | ||||
-rw-r--r-- | src/vnc-server.h | 4 | ||||
-rw-r--r-- | src/xdmcp-server.c | 42 | ||||
-rw-r--r-- | src/xdmcp-server.h | 4 |
4 files changed, 84 insertions, 8 deletions
diff --git a/src/vnc-server.c b/src/vnc-server.c index 2ccb2292..d4e6e9d9 100644 --- a/src/vnc-server.c +++ b/src/vnc-server.c @@ -24,6 +24,9 @@ struct VNCServerPrivate /* Port to listen on */ guint port; + /* Address to listen on */ + gchar *listen_address; + /* Listening sockets */ GSocket *socket, *socket6; }; @@ -50,6 +53,22 @@ vnc_server_get_port (VNCServer *server) 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) { @@ -78,7 +97,7 @@ 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; @@ -87,7 +106,21 @@ open_tcp_socket (GSocketFamily family, guint port, GError **error) 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)) { @@ -106,7 +139,7 @@ vnc_server_start (VNCServer *server) 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); @@ -118,7 +151,7 @@ vnc_server_start (VNCServer *server) 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); @@ -150,6 +183,7 @@ vnc_server_finalize (GObject *object) self = VNC_SERVER (object); + g_free (self->priv->listen_address); if (self->priv->socket) g_object_unref (self->priv->socket); if (self->priv->socket6) diff --git a/src/vnc-server.h b/src/vnc-server.h index 64fe1daf..889fdb74 100644 --- a/src/vnc-server.h +++ b/src/vnc-server.h @@ -44,6 +44,10 @@ void vnc_server_set_port (VNCServer *server, guint port); guint vnc_server_get_port (VNCServer *server); +void vnc_server_set_listen_address (VNCServer *server, const gchar *listen_address); + +const gchar *vnc_server_get_listen_address (VNCServer *server); + gboolean vnc_server_start (VNCServer *server); G_END_DECLS diff --git a/src/xdmcp-server.c b/src/xdmcp-server.c index d240e380..d92b57d9 100644 --- a/src/xdmcp-server.c +++ b/src/xdmcp-server.c @@ -32,6 +32,9 @@ struct XDMCPServerPrivate /* Port to listen on */ guint port; + /* Address to listen on */ + gchar *listen_address; + /* Listening sockets */ GSocket *socket, *socket6; @@ -74,6 +77,22 @@ xdmcp_server_get_port (XDMCPServer *server) } void +xdmcp_server_set_listen_address (XDMCPServer *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 * +xdmcp_server_get_listen_address (XDMCPServer *server) +{ + g_return_val_if_fail (server != NULL, NULL); + return server->priv->listen_address; +} + +void xdmcp_server_set_hostname (XDMCPServer *server, const gchar *hostname) { g_return_if_fail (server != NULL); @@ -604,7 +623,7 @@ read_cb (GSocket *socket, GIOCondition condition, XDMCPServer *server) } static GSocket * -open_udp_socket (GSocketFamily family, guint port, GError **error) +open_udp_socket (GSocketFamily family, guint port, const gchar *listen_address, GError **error) { GSocket *socket; GSocketAddress *address; @@ -614,7 +633,21 @@ open_udp_socket (GSocketFamily family, guint port, GError **error) 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); result = g_socket_bind (socket, address, TRUE, error); if (!result) { @@ -633,7 +666,7 @@ xdmcp_server_start (XDMCPServer *server) g_return_val_if_fail (server != NULL, FALSE); - server->priv->socket = open_udp_socket (G_SOCKET_FAMILY_IPV4, server->priv->port, &error); + server->priv->socket = open_udp_socket (G_SOCKET_FAMILY_IPV4, server->priv->port, server->priv->listen_address, &error); if (error) g_warning ("Failed to create IPv4 XDMCP socket: %s", error->message); g_clear_error (&error); @@ -645,7 +678,7 @@ xdmcp_server_start (XDMCPServer *server) g_source_attach (source, NULL); } - server->priv->socket6 = open_udp_socket (G_SOCKET_FAMILY_IPV6, server->priv->port, &error); + server->priv->socket6 = open_udp_socket (G_SOCKET_FAMILY_IPV6, server->priv->port, server->priv->listen_address, &error); if (error) g_warning ("Failed to create IPv6 XDMCP socket: %s", error->message); g_clear_error (&error); @@ -685,6 +718,7 @@ xdmcp_server_finalize (GObject *object) g_object_unref (self->priv->socket); if (self->priv->socket6) g_object_unref (self->priv->socket6); + g_free (self->priv->listen_address); g_free (self->priv->hostname); g_free (self->priv->status); g_free (self->priv->key); diff --git a/src/xdmcp-server.h b/src/xdmcp-server.h index 32ca63b4..d3b824b9 100644 --- a/src/xdmcp-server.h +++ b/src/xdmcp-server.h @@ -46,6 +46,10 @@ void xdmcp_server_set_port (XDMCPServer *server, guint port); guint xdmcp_server_get_port (XDMCPServer *server); +void xdmcp_server_set_listen_address (XDMCPServer *server, const gchar *listen_address); + +const gchar *xdmcp_server_get_listen_address (XDMCPServer *server); + void xdmcp_server_set_hostname (XDMCPServer *server, const gchar *hostname); const gchar *xdmcp_server_get_hostname (XDMCPServer *server); |