* [Qemu-devel] [Patch] vnc: support vnc port auto-allocation
@ 2008-10-24 11:19 Gerd Hoffmann
2008-10-24 11:24 ` [Qemu-devel] " Gerd Hoffmann
0 siblings, 1 reply; 2+ messages in thread
From: Gerd Hoffmann @ 2008-10-24 11:19 UTC (permalink / raw)
To: qemu-devel
[-- Attachment #1: Type: text/plain, Size: 174 bytes --]
Hi folks,
This patch makes qemu (optionally) find a free vnc display, using the
-vnc $host:$start,to=$end syntax as discussed on the list a few weeks ago.
cheers,
Gerd
[-- Attachment #2: 0039-vnc-support-vnc-port-auto-allocation.patch --]
[-- Type: text/plain, Size: 4009 bytes --]
>From 5c30379b58500c59d430d3257db65b33326adddf Mon Sep 17 00:00:00 2001
From: Gerd Hoffmann <kraxel@redhat.com>
Date: Fri, 24 Oct 2008 10:36:20 +0200
Subject: [PATCH] vnc: support vnc port auto-allocation.
This patch adds support for automatically allocating an unused vnc
display port. It adds a to= option for vnc, specifying the upper
limit for the display number to try. Scanning is started at the display
number given in the display specification, i.e. this command line:
-vnc localhost:7,to=11
will try displays 7 to 11 (inclusive).
The display actually allocated can be queried using the "info vnc"
monitor command.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
vnc.c | 55 +++++++++++++++++++++++++++++++++++++++++++------------
1 files changed, 43 insertions(+), 12 deletions(-)
diff --git a/vnc.c b/vnc.c
index 266460f..9d3c4a3 100644
--- a/vnc.c
+++ b/vnc.c
@@ -2303,16 +2303,16 @@ int vnc_display_open(DisplayState *ds, const char *display)
const char *options;
int password = 0;
int reverse = 0;
+ int to_port = 0;
#ifdef CONFIG_VNC_TLS
int tls = 0, x509 = 0;
#endif
vnc_display_close(ds);
- if (strcmp(display, "none") == 0)
- return 0;
-
if (!(vs->display = strdup(display)))
return -1;
+ if (strcmp(display, "none") == 0)
+ return 0;
options = display;
while ((options = strchr(options, ','))) {
@@ -2321,6 +2321,8 @@ int vnc_display_open(DisplayState *ds, const char *display)
password = 1; /* Require password auth */
} else if (strncmp(options, "reverse", 7) == 0) {
reverse = 1;
+ } else if (strncmp(options, "to=", 3) == 0) {
+ to_port = atoi(options+3) + 5900;
#ifdef CONFIG_VNC_TLS
} else if (strncmp(options, "tls", 3) == 0) {
tls = 1; /* Require TLS */
@@ -2416,6 +2418,14 @@ int vnc_display_open(DisplayState *ds, const char *display)
if (!reverse) {
unlink(uaddr.sun_path);
+ if (bind(vs->lsock, addr, addrlen) == -1) {
+ fprintf(stderr, "bind() failed\n");
+ close(vs->lsock);
+ vs->lsock = -1;
+ free(vs->display);
+ vs->display = NULL;
+ return -1;
+ }
}
} else
#endif
@@ -2451,6 +2461,36 @@ int vnc_display_open(DisplayState *ds, const char *display)
vs->display = NULL;
return -1;
}
+
+ if (!reverse) {
+ if (to_port < 5900)
+ to_port = ntohs(iaddr.sin_port);
+ while (ntohs(iaddr.sin_port) <= to_port) {
+ if (bind(vs->lsock, addr, addrlen) == 0)
+ break;
+ iaddr.sin_port = htons(ntohs(iaddr.sin_port) + 1);
+ }
+ if (ntohs(iaddr.sin_port) <= to_port) {
+ /* success: set vs->display so "info vnc" displays the actual port */
+ char *dpy, *opts, *h;
+ opts = strchr(vs->display,',');
+ h = strchr(vs->display, ':');
+ if (h)
+ *h = 0;
+ dpy = qemu_malloc(256);
+ snprintf(dpy, 256, "%s:%d%s", h ? vs->display : "",
+ ntohs(iaddr.sin_port) - 5900, opts);
+ qemu_free(vs->display);
+ vs->display = dpy;
+ } else {
+ fprintf(stderr, "didn't find free vnc display port\n");
+ close(vs->lsock);
+ vs->lsock = -1;
+ free(vs->display);
+ vs->display = NULL;
+ return -1;
+ }
+ }
}
if (reverse) {
@@ -2469,15 +2509,6 @@ int vnc_display_open(DisplayState *ds, const char *display)
}
}
- if (bind(vs->lsock, addr, addrlen) == -1) {
- fprintf(stderr, "bind() failed\n");
- close(vs->lsock);
- vs->lsock = -1;
- free(vs->display);
- vs->display = NULL;
- return -1;
- }
-
if (listen(vs->lsock, 1) == -1) {
fprintf(stderr, "listen() failed\n");
close(vs->lsock);
--
1.5.5.1
^ permalink raw reply related [flat|nested] 2+ messages in thread
* [Qemu-devel] Re: [Patch] vnc: support vnc port auto-allocation
2008-10-24 11:19 [Qemu-devel] [Patch] vnc: support vnc port auto-allocation Gerd Hoffmann
@ 2008-10-24 11:24 ` Gerd Hoffmann
0 siblings, 0 replies; 2+ messages in thread
From: Gerd Hoffmann @ 2008-10-24 11:24 UTC (permalink / raw)
To: qemu-devel
Hi,
> This patch makes qemu (optionally) find a free vnc display, using the
> -vnc $host:$start,to=$end syntax as discussed on the list a few weeks ago.
While being at it: I'm consider doing something simliar for
serial/parallel device tcp redirections. Needs the "info chardev"
monitor command patch sent earlier this week to be useful. Probably
makes sense to factor out the free tcp port scan then. And when being
busy hacking the networking code I'd might just make those bits ipv6
ready along the way.
Comments?
cheers,
Gerd
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2008-10-24 11:24 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-10-24 11:19 [Qemu-devel] [Patch] vnc: support vnc port auto-allocation Gerd Hoffmann
2008-10-24 11:24 ` [Qemu-devel] " Gerd Hoffmann
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).