From: "Daniel P. Berrange" <berrange@redhat.com>
To: qemu-devel@nongnu.org
Cc: Gerd Hoffmann <kraxel@redhat.com>, Eric Blake <eblake@redhat.com>,
"Daniel P. Berrange" <berrange@redhat.com>
Subject: [Qemu-devel] [PATCH v2 5/8] ui: extract code to connect/listen from vnc_display_open
Date: Tue, 24 Jan 2017 09:53:29 +0000 [thread overview]
Message-ID: <20170124095332.23955-6-berrange@redhat.com> (raw)
In-Reply-To: <20170124095332.23955-1-berrange@redhat.com>
The code which takes a SocketAddress and connects/listens on the
network is going to get more complicated to deal with multiple
listeners. Pull it out into a separate method to avoid making the
vnc_display_open method even more complex.
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
---
ui/vnc.c | 122 +++++++++++++++++++++++++++++++++++++++++----------------------
1 file changed, 80 insertions(+), 42 deletions(-)
diff --git a/ui/vnc.c b/ui/vnc.c
index f0335d8..8e05c33 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -3695,6 +3695,84 @@ static int vnc_display_get_addresses(QemuOpts *opts,
return -1;
}
+static int vnc_display_connect(VncDisplay *vd,
+ SocketAddress *saddr,
+ SocketAddress *wsaddr,
+ Error **errp)
+{
+ /* connect to viewer */
+ QIOChannelSocket *sioc = NULL;
+ if (wsaddr) {
+ error_setg(errp, "Cannot use websockets in reverse mode");
+ return -1;
+ }
+ vd->is_unix = saddr->type == SOCKET_ADDRESS_KIND_UNIX;
+ sioc = qio_channel_socket_new();
+ qio_channel_set_name(QIO_CHANNEL(sioc), "vnc-reverse");
+ if (qio_channel_socket_connect_sync(sioc, saddr, errp) < 0) {
+ return -1;
+ }
+ vnc_connect(vd, sioc, false, false);
+ object_unref(OBJECT(sioc));
+ return 0;
+}
+
+
+static int vnc_display_listen_addr(VncDisplay *vd,
+ SocketAddress *addr,
+ const char *name,
+ QIOChannelSocket ***lsock,
+ guint **lsock_tag,
+ size_t *nlsock,
+ Error **errp)
+{
+ *nlsock = 1;
+ *lsock = g_new0(QIOChannelSocket *, 1);
+ *lsock_tag = g_new0(guint, 1);
+
+ (*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) {
+ return -1;
+ }
+
+ (*lsock_tag)[0] = qio_channel_add_watch(
+ QIO_CHANNEL((*lsock)[0]),
+ G_IO_IN, vnc_listen_io, vd, NULL);
+
+ return 0;
+}
+
+
+static int vnc_display_listen(VncDisplay *vd,
+ SocketAddress *saddr,
+ SocketAddress *wsaddr,
+ Error **errp)
+{
+ vd->is_unix = saddr->type == SOCKET_ADDRESS_KIND_UNIX;
+
+ if (vnc_display_listen_addr(vd, saddr,
+ "vnc-listen",
+ &vd->lsock,
+ &vd->lsock_tag,
+ &vd->nlsock,
+ errp) < 0) {
+ return -1;
+ }
+ if (wsaddr &&
+ vnc_display_listen_addr(vd, wsaddr,
+ "vnc-ws-listen",
+ &vd->lwebsock,
+ &vd->lwebsock_tag,
+ &vd->nlwebsock,
+ errp) < 0) {
+ return -1;
+ }
+
+ return 0;
+}
+
+
void vnc_display_open(const char *id, Error **errp)
{
VncDisplay *vd = vnc_display_find(id);
@@ -3913,53 +3991,13 @@ void vnc_display_open(const char *id, Error **errp)
}
if (reverse) {
- /* connect to viewer */
- QIOChannelSocket *sioc = NULL;
- if (wsaddr) {
- error_setg(errp, "Cannot use websockets in reverse mode");
- goto fail;
- }
- vd->is_unix = saddr->type == SOCKET_ADDRESS_KIND_UNIX;
- sioc = qio_channel_socket_new();
- qio_channel_set_name(QIO_CHANNEL(sioc), "vnc-reverse");
- if (qio_channel_socket_connect_sync(sioc, saddr, errp) < 0) {
+ if (vnc_display_connect(vd, saddr, wsaddr, errp) < 0) {
goto fail;
}
- vnc_connect(vd, sioc, false, false);
- object_unref(OBJECT(sioc));
} else {
- vd->nlsock = 1;
- vd->lsock = g_new0(QIOChannelSocket *, 1);
- vd->lsock_tag = g_new0(guint, 1);
-
- vd->lsock[0] = qio_channel_socket_new();
- qio_channel_set_name(QIO_CHANNEL(vd->lsock[0]), "vnc-listen");
- if (qio_channel_socket_listen_sync(vd->lsock[0], saddr, errp) < 0) {
+ if (vnc_display_listen(vd, saddr, wsaddr, errp) < 0) {
goto fail;
}
- vd->is_unix = saddr->type == SOCKET_ADDRESS_KIND_UNIX;
-
- if (wsaddr) {
- vd->nlwebsock = 1;
- vd->lwebsock = g_new0(QIOChannelSocket *, 1);
- vd->lwebsock_tag = g_new0(guint, 1);
-
- vd->lwebsock[0] = qio_channel_socket_new();
- qio_channel_set_name(QIO_CHANNEL(vd->lwebsock[0]), "vnc-ws-listen");
- if (qio_channel_socket_listen_sync(vd->lwebsock[0],
- wsaddr, errp) < 0) {
- goto fail;
- }
- }
-
- vd->lsock_tag[0] = qio_channel_add_watch(
- QIO_CHANNEL(vd->lsock[0]),
- G_IO_IN, vnc_listen_io, vd, NULL);
- if (wsaddr) {
- vd->lwebsock_tag[0] = qio_channel_add_watch(
- QIO_CHANNEL(vd->lwebsock[0]),
- G_IO_IN, vnc_listen_io, vd, NULL);
- }
}
if (qemu_opt_get(opts, "to")) {
--
2.9.3
next prev parent reply other threads:[~2017-01-24 9:53 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-01-24 9:53 [Qemu-devel] [PATCH v2 0/8] Support multiple listening sockets per VNC server Daniel P. Berrange
2017-01-24 9:53 ` [Qemu-devel] [PATCH v2 1/8] ui: fix regression handling bare 'websocket' option to -vnc Daniel P. Berrange
2017-01-24 9:53 ` [Qemu-devel] [PATCH v2 2/8] ui: fix reporting of VNC auth in query-vnc-servers Daniel P. Berrange
2017-01-24 9:53 ` [Qemu-devel] [PATCH v2 3/8] ui: refactor VncDisplay to allow multiple listening sockets Daniel P. Berrange
2017-01-24 9:53 ` [Qemu-devel] [PATCH v2 4/8] ui: refactor code for populating SocketAddress from vnc_display_open Daniel P. Berrange
2017-01-24 9:53 ` Daniel P. Berrange [this message]
2017-01-24 9:53 ` [Qemu-devel] [PATCH v2 6/8] ui: let VNC server listen on all resolved IP addresses Daniel P. Berrange
2017-01-24 9:53 ` [Qemu-devel] [PATCH v2 7/8] util: add iterators for QemuOpts values Daniel P. Berrange
2017-01-24 18:58 ` Eric Blake
2017-01-24 9:53 ` [Qemu-devel] [PATCH v2 8/8] ui: add ability to specify multiple VNC listen addresses Daniel P. Berrange
2017-01-24 19:15 ` Eric Blake
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170124095332.23955-6-berrange@redhat.com \
--to=berrange@redhat.com \
--cc=eblake@redhat.com \
--cc=kraxel@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.