From: Gerd Hoffmann <kraxel@redhat.com>
To: qemu-devel@nongnu.org
Cc: Gerd Hoffmann <kraxel@redhat.com>, Anthony Liguori <aliguori@amazon.com>
Subject: [Qemu-devel] [PULL 01/10] vnc: remove vnc_display global
Date: Fri, 19 Dec 2014 10:04:17 +0100 [thread overview]
Message-ID: <1418979866-1615-2-git-send-email-kraxel@redhat.com> (raw)
In-Reply-To: <1418979866-1615-1-git-send-email-kraxel@redhat.com>
Replace with a vnc_displays list, so we can have multiple vnc server
instances. Add vnc_server_find function to lookup a display by id.
With no id supplied return the first vnc server, for backward
compatibility reasons.
It is not possible (yet) to actually create multiple vnc server
instances.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Gonglei <arei.gonglei@huawei.com>
---
ui/vnc.c | 63 +++++++++++++++++++++++++++++++++++++++++----------------------
ui/vnc.h | 2 ++
2 files changed, 43 insertions(+), 22 deletions(-)
diff --git a/ui/vnc.c b/ui/vnc.c
index 5707015..a6549c8 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -46,7 +46,8 @@ static const struct timeval VNC_REFRESH_LOSSY = { 2, 0 };
#include "vnc_keysym.h"
#include "d3des.h"
-static VncDisplay *vnc_display; /* needed for info vnc */
+static QTAILQ_HEAD(, VncDisplay) vnc_displays =
+ QTAILQ_HEAD_INITIALIZER(vnc_displays);
static int vnc_cursor_define(VncState *vs);
static void vnc_release_modifiers(VncState *vs);
@@ -226,10 +227,10 @@ static const char *vnc_auth_name(VncDisplay *vd) {
return "unknown";
}
-static VncServerInfo *vnc_server_info_get(void)
+static VncServerInfo *vnc_server_info_get(VncDisplay *vd)
{
VncServerInfo *info;
- VncBasicInfo *bi = vnc_basic_info_get_from_server_addr(vnc_display->lsock);
+ VncBasicInfo *bi = vnc_basic_info_get_from_server_addr(vd->lsock);
if (!bi) {
return NULL;
}
@@ -237,7 +238,7 @@ static VncServerInfo *vnc_server_info_get(void)
info = g_malloc(sizeof(*info));
info->base = bi;
info->has_auth = true;
- info->auth = g_strdup(vnc_auth_name(vnc_display));
+ info->auth = g_strdup(vnc_auth_name(vd));
return info;
}
@@ -282,7 +283,7 @@ static void vnc_qmp_event(VncState *vs, QAPIEvent event)
}
g_assert(vs->info->base);
- si = vnc_server_info_get();
+ si = vnc_server_info_get(vs->vd);
if (!si) {
return;
}
@@ -345,11 +346,27 @@ static VncClientInfo *qmp_query_vnc_client(const VncState *client)
return info;
}
+static VncDisplay *vnc_display_find(const char *id)
+{
+ VncDisplay *vd;
+
+ if (id == NULL) {
+ return QTAILQ_FIRST(&vnc_displays);
+ }
+ QTAILQ_FOREACH(vd, &vnc_displays, next) {
+ if (strcmp(id, vd->id) == 0) {
+ return vd;
+ }
+ }
+ return NULL;
+}
+
VncInfo *qmp_query_vnc(Error **errp)
{
VncInfo *info = g_malloc0(sizeof(*info));
+ VncDisplay *vd = vnc_display_find(NULL);
- if (vnc_display == NULL || vnc_display->display == NULL) {
+ if (vd == NULL || vd->display == NULL) {
info->enabled = false;
} else {
VncClientInfoList *cur_item = NULL;
@@ -364,7 +381,7 @@ VncInfo *qmp_query_vnc(Error **errp)
/* for compatibility with the original command */
info->has_clients = true;
- QTAILQ_FOREACH(client, &vnc_display->clients, next) {
+ QTAILQ_FOREACH(client, &vd->clients, next) {
VncClientInfoList *cinfo = g_malloc0(sizeof(*info));
cinfo->value = qmp_query_vnc_client(client);
@@ -377,11 +394,11 @@ VncInfo *qmp_query_vnc(Error **errp)
}
}
- if (vnc_display->lsock == -1) {
+ if (vd->lsock == -1) {
return info;
}
- if (getsockname(vnc_display->lsock, (struct sockaddr *)&sa,
+ if (getsockname(vd->lsock, (struct sockaddr *)&sa,
&salen) == -1) {
error_set(errp, QERR_UNDEFINED_ERROR);
goto out_error;
@@ -405,7 +422,7 @@ VncInfo *qmp_query_vnc(Error **errp)
info->family = inet_netfamily(sa.ss_family);
info->has_auth = true;
- info->auth = g_strdup(vnc_auth_name(vnc_display));
+ info->auth = g_strdup(vnc_auth_name(vd));
}
return info;
@@ -853,7 +870,7 @@ static int vnc_cursor_define(VncState *vs)
static void vnc_dpy_cursor_define(DisplayChangeListener *dcl,
QEMUCursor *c)
{
- VncDisplay *vd = vnc_display;
+ VncDisplay *vd = container_of(dcl, VncDisplay, dcl);
VncState *vs;
cursor_put(vd->cursor);
@@ -2818,6 +2835,7 @@ static void vnc_connect(VncDisplay *vd, int csock,
int i;
vs->csock = csock;
+ vs->vd = vd;
if (skipauth) {
vs->auth = VNC_AUTH_NONE;
@@ -2862,8 +2880,6 @@ static void vnc_connect(VncDisplay *vd, int csock,
vnc_qmp_event(vs, QAPI_EVENT_VNC_CONNECTED);
vnc_set_share_mode(vs, VNC_SHARE_MODE_CONNECTING);
- vs->vd = vd;
-
#ifdef CONFIG_VNC_WS
if (!vs->websocket)
#endif
@@ -2955,7 +2971,7 @@ void vnc_display_init(DisplayState *ds)
{
VncDisplay *vs = g_malloc0(sizeof(*vs));
- vnc_display = vs;
+ QTAILQ_INSERT_TAIL(&vnc_displays, vs, next);
vs->lsock = -1;
#ifdef CONFIG_VNC_WS
@@ -2985,7 +3001,7 @@ void vnc_display_init(DisplayState *ds)
static void vnc_display_close(DisplayState *ds)
{
- VncDisplay *vs = vnc_display;
+ VncDisplay *vs = vnc_display_find(NULL);
if (!vs)
return;
@@ -3014,7 +3030,7 @@ static void vnc_display_close(DisplayState *ds)
int vnc_display_password(DisplayState *ds, const char *password)
{
- VncDisplay *vs = vnc_display;
+ VncDisplay *vs = vnc_display_find(NULL);
if (!vs) {
return -EINVAL;
@@ -3033,7 +3049,7 @@ int vnc_display_password(DisplayState *ds, const char *password)
int vnc_display_pw_expire(DisplayState *ds, time_t expires)
{
- VncDisplay *vs = vnc_display;
+ VncDisplay *vs = vnc_display_find(NULL);
if (!vs) {
return -EINVAL;
@@ -3045,14 +3061,14 @@ int vnc_display_pw_expire(DisplayState *ds, time_t expires)
char *vnc_display_local_addr(DisplayState *ds)
{
- VncDisplay *vs = vnc_display;
-
+ VncDisplay *vs = vnc_display_find(NULL);
+
return vnc_socket_local_addr("%s:%s", vs->lsock);
}
void vnc_display_open(DisplayState *ds, const char *display, Error **errp)
{
- VncDisplay *vs = vnc_display;
+ VncDisplay *vs = vnc_display_find(NULL);
const char *options;
int password = 0;
int reverse = 0;
@@ -3068,7 +3084,7 @@ void vnc_display_open(DisplayState *ds, const char *display, Error **errp)
#endif
int lock_key_sync = 1;
- if (!vnc_display) {
+ if (!vs) {
error_setg(errp, "VNC display not active");
return;
}
@@ -3367,7 +3383,10 @@ fail:
void vnc_display_add_client(DisplayState *ds, int csock, bool skipauth)
{
- VncDisplay *vs = vnc_display;
+ VncDisplay *vs = vnc_display_find(NULL);
+ if (!vs) {
+ return;
+ }
vnc_connect(vs, csock, skipauth, false);
}
diff --git a/ui/vnc.h b/ui/vnc.h
index 334de9d..6fe8278 100644
--- a/ui/vnc.h
+++ b/ui/vnc.h
@@ -171,6 +171,8 @@ struct VncDisplay
struct VncSurface guest; /* guest visible surface (aka ds->surface) */
pixman_image_t *server; /* vnc server surface */
+ const char *id;
+ QTAILQ_ENTRY(VncDisplay) next;
char *display;
char *password;
time_t expires;
--
1.8.3.1
next prev parent reply other threads:[~2014-12-19 9:04 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-12-19 9:04 [Qemu-devel] [PULL 00/10] vnc: add support for multiple vnc displays Gerd Hoffmann
2014-12-19 9:04 ` Gerd Hoffmann [this message]
2014-12-19 9:04 ` [Qemu-devel] [PULL 02/10] vnc: remove unused DisplayState parameter, add id instead Gerd Hoffmann
2014-12-19 9:04 ` [Qemu-devel] [PULL 03/10] vnc: add display id to acl names Gerd Hoffmann
2014-12-19 9:04 ` [Qemu-devel] [PULL 04/10] vnc: switch to QemuOpts, allow multiple servers Gerd Hoffmann
2014-12-19 9:04 ` [Qemu-devel] [PULL 05/10] vnc: allow binding servers to qemu consoles Gerd Hoffmann
2014-12-19 9:04 ` [Qemu-devel] [PULL 06/10] vnc: update docs/multiseat.txt Gerd Hoffmann
2014-12-19 9:04 ` [Qemu-devel] [PULL 07/10] vnc: track & limit connections Gerd Hoffmann
2014-12-19 9:04 ` [Qemu-devel] [PULL 08/10] vnc: factor out qmp_query_client_list Gerd Hoffmann
2014-12-19 9:04 ` [Qemu-devel] [PULL 09/10] monitor: add query-vnc2 command Gerd Hoffmann
2014-12-19 13:04 ` Markus Armbruster
2014-12-19 18:05 ` Eric Blake
2015-01-06 10:39 ` Gerd Hoffmann
2015-01-12 15:53 ` Markus Armbruster
2015-01-06 10:36 ` Gerd Hoffmann
2015-01-08 15:44 ` Gerd Hoffmann
2014-12-19 9:04 ` [Qemu-devel] [PULL 10/10] monitor: add vnc websockets Gerd Hoffmann
2014-12-19 13:06 ` Markus Armbruster
2014-12-19 18:09 ` Eric Blake
2014-12-19 12:51 ` [Qemu-devel] [PULL 00/10] vnc: add support for multiple vnc displays Markus Armbruster
-- strict thread matches above, loose matches on Subject: below --
2015-01-22 11:03 Gerd Hoffmann
2015-01-22 11:03 ` [Qemu-devel] [PULL 01/10] vnc: remove vnc_display global Gerd Hoffmann
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=1418979866-1615-2-git-send-email-kraxel@redhat.com \
--to=kraxel@redhat.com \
--cc=aliguori@amazon.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).