[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 08/10] ui: let VNC server listen on all resolved IP a
From: |
Gerd Hoffmann |
Subject: |
[Qemu-devel] [PULL 08/10] ui: let VNC server listen on all resolved IP addresses |
Date: |
Thu, 9 Feb 2017 14:01:15 +0100 |
From: "Daniel P. Berrange" <address@hidden>
Remove the limitation that the VNC server can only listen on
a single resolved IP address. This uses the new DNS resolver
API to resolve a SocketAddress struct into an array of
SocketAddress structs containing raw IP addresses. The VNC
server will then attempt to listen on all resolved IP addresses.
The server must successfully listen on at least one of the
resolved IP addresses, otherwise an error will be reported.
Reviewed-by: Eric Blake <address@hidden>
Signed-off-by: Daniel P. Berrange <address@hidden>
Message-id: address@hidden
Signed-off-by: Gerd Hoffmann <address@hidden>
---
ui/vnc.c | 52 +++++++++++++++++++++++++++++++++++++++++++---------
1 file changed, 43 insertions(+), 9 deletions(-)
diff --git a/ui/vnc.c b/ui/vnc.c
index 49ce19a..36e50e7 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -45,6 +45,7 @@
#include "crypto/tlscredsx509.h"
#include "qom/object_interfaces.h"
#include "qemu/cutils.h"
+#include "io/dns-resolver.h"
#define VNC_REFRESH_INTERVAL_BASE GUI_REFRESH_INTERVAL_DEFAULT
#define VNC_REFRESH_INTERVAL_INC 50
@@ -3698,19 +3699,52 @@ static int vnc_display_listen_addr(VncDisplay *vd,
size_t *nlsock,
Error **errp)
{
- *nlsock = 1;
- *lsock = g_new0(QIOChannelSocket *, 1);
- *lsock_tag = g_new0(guint, 1);
+ QIODNSResolver *resolver = qio_dns_resolver_get_instance();
+ SocketAddress **rawaddrs = NULL;
+ size_t nrawaddrs = 0;
+ Error *listenerr = NULL;
+ size_t i;
- (*lsock)[0] = qio_channel_socket_new();
- qio_channel_set_name(QIO_CHANNEL((*lsock)[0]), name);
- if (qio_channel_socket_listen_sync((*lsock)[0], addr, errp) < 0) {
+ if (qio_dns_resolver_lookup_sync(resolver, addr, &nrawaddrs,
+ &rawaddrs, errp) < 0) {
return -1;
}
- (*lsock_tag)[0] = qio_channel_add_watch(
- QIO_CHANNEL((*lsock)[0]),
- G_IO_IN, vnc_listen_io, vd, NULL);
+ for (i = 0; i < nrawaddrs; i++) {
+ QIOChannelSocket *sioc = qio_channel_socket_new();
+
+ qio_channel_set_name(QIO_CHANNEL(sioc), name);
+ if (qio_channel_socket_listen_sync(
+ sioc, rawaddrs[i], listenerr == NULL ? &listenerr : NULL) < 0)
{
+ continue;
+ }
+ (*nlsock)++;
+ *lsock = g_renew(QIOChannelSocket *, *lsock, *nlsock);
+ *lsock_tag = g_renew(guint, *lsock_tag, *nlsock);
+
+ (*lsock)[*nlsock - 1] = sioc;
+ (*lsock_tag)[*nlsock - 1] = 0;
+ }
+
+ for (i = 0; i < nrawaddrs; i++) {
+ qapi_free_SocketAddress(rawaddrs[i]);
+ }
+ g_free(rawaddrs);
+
+ if (listenerr) {
+ if (*nlsock == 0) {
+ error_propagate(errp, listenerr);
+ return -1;
+ } else {
+ error_free(listenerr);
+ }
+ }
+
+ for (i = 0; i < *nlsock; i++) {
+ (*lsock_tag)[i] = qio_channel_add_watch(
+ QIO_CHANNEL((*lsock)[i]),
+ G_IO_IN, vnc_listen_io, vd, NULL);
+ }
return 0;
}
--
1.8.3.1
- [Qemu-devel] [PULL 00/10] vnc: add support for multiple listening sockets., Gerd Hoffmann, 2017/02/09
- [Qemu-devel] [PULL 01/10] ui/vnc: Drop unused vnc_has_job() and vnc_jobs_clear(), Gerd Hoffmann, 2017/02/09
- [Qemu-devel] [PULL 03/10] ui: fix regression handling bare 'websocket' option to -vnc, Gerd Hoffmann, 2017/02/09
- [Qemu-devel] [PULL 07/10] ui: extract code to connect/listen from vnc_display_open, Gerd Hoffmann, 2017/02/09
- [Qemu-devel] [PULL 05/10] ui: refactor VncDisplay to allow multiple listening sockets, Gerd Hoffmann, 2017/02/09
- [Qemu-devel] [PULL 08/10] ui: let VNC server listen on all resolved IP addresses,
Gerd Hoffmann <=
- [Qemu-devel] [PULL 09/10] util: add iterators for QemuOpts values, Gerd Hoffmann, 2017/02/09
- [Qemu-devel] [PULL 10/10] ui: add ability to specify multiple VNC listen addresses, Gerd Hoffmann, 2017/02/09
- [Qemu-devel] [PULL 06/10] ui: refactor code for populating SocketAddress from vnc_display_open, Gerd Hoffmann, 2017/02/09
- [Qemu-devel] [PULL 04/10] ui: fix reporting of VNC auth in query-vnc-servers, Gerd Hoffmann, 2017/02/09
- [Qemu-devel] [PULL 02/10] vnc: do not disconnect on EAGAIN, Gerd Hoffmann, 2017/02/09
- Re: [Qemu-devel] [PULL 00/10] vnc: add support for multiple listening sockets., Peter Maydell, 2017/02/09