From: Eddie Kohler <kohler@cs.ucla.edu>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH] add VNC reverse connections
Date: Tue, 15 Jan 2008 23:27:15 -0800 [thread overview]
Message-ID: <478DB1D3.60905@cs.ucla.edu> (raw)
[-- Attachment #1: Type: text/plain, Size: 365 bytes --]
Hi all,
This patch against current CVS adds VNC reverse connections, where the server
connects actively to a waiting client, as in "-vnc rev:5500" or "-vnc
rev:read.cs.ucla.edu:5500". This is quite useful if the user expects to run
QEMU many times in succession (for example, is debugging a toy OS), and
doesn't want to reopen a VNC client each time.
Eddie
[-- Attachment #2: qemu-cvs-vnc-rev.patch --]
[-- Type: text/x-patch, Size: 3943 bytes --]
Index: qemu-doc.texi
===================================================================
RCS file: /sources/qemu/qemu/qemu-doc.texi,v
retrieving revision 1.179
diff -u -r1.179 qemu-doc.texi
--- qemu-doc.texi 14 Jan 2008 22:09:11 -0000 1.179
+++ qemu-doc.texi 16 Jan 2008 07:25:30 -0000
@@ -429,10 +429,16 @@
Connections will be allowed over UNIX domain sockets where @var{path} is the
location of a unix socket to listen for connections on.
+@item @var{rev}:@var{interface}:@var{port}
+
+Makes a reverse connection to a VNC viewer listening on
+@var{interface} on port @var{port}. Optionally, @var{interface} can be
+omitted in which case QEMU will connect to @var{port} on the local machine.
+
@item none
-VNC is initialized by not started. The monitor @code{change} command can be used
-to later start the VNC server.
+VNC is initialized but not started. The monitor @code{change} command
+can be used to later start the VNC server.
@end table
Index: vnc.c
===================================================================
RCS file: /sources/qemu/qemu/vnc.c,v
retrieving revision 1.33
diff -u -r1.33 vnc.c
--- vnc.c 14 Jan 2008 21:45:55 -0000 1.33
+++ vnc.c 16 Jan 2008 07:25:30 -0000
@@ -1898,6 +1898,22 @@
return 0;
}
+static void vnc_connect(VncState *vs)
+{
+ VNC_DEBUG("New client on socket %d\n", vs->csock);
+ socket_set_nonblock(vs->csock);
+ qemu_set_fd_handler2(vs->csock, NULL, vnc_client_read, NULL, vs);
+ vnc_write(vs, "RFB 003.008\n", 12);
+ vnc_flush(vs);
+ vnc_read_when(vs, protocol_version, 12);
+ memset(vs->old_data, 0, vs->ds->linesize * vs->ds->height);
+ memset(vs->dirty_row, 0xFF, sizeof(vs->dirty_row));
+ vs->has_resize = 0;
+ vs->has_hextile = 0;
+ vs->ds->dpy_copy = NULL;
+ vnc_update_client(vs);
+}
+
static void vnc_listen_read(void *opaque)
{
VncState *vs = opaque;
@@ -1909,18 +1925,7 @@
vs->csock = accept(vs->lsock, (struct sockaddr *)&addr, &addrlen);
if (vs->csock != -1) {
- VNC_DEBUG("New client on socket %d\n", vs->csock);
- socket_set_nonblock(vs->csock);
- qemu_set_fd_handler2(vs->csock, NULL, vnc_client_read, NULL, opaque);
- vnc_write(vs, "RFB 003.008\n", 12);
- vnc_flush(vs);
- vnc_read_when(vs, protocol_version, 12);
- memset(vs->old_data, 0, vs->ds->linesize * vs->ds->height);
- memset(vs->dirty_row, 0xFF, sizeof(vs->dirty_row));
- vs->has_resize = 0;
- vs->has_hextile = 0;
- vs->ds->dpy_copy = NULL;
- vnc_update_client(vs);
+ vnc_connect(vs);
}
}
@@ -2087,6 +2092,7 @@
VncState *vs = ds ? (VncState *)ds->opaque : vnc_state;
const char *options;
int password = 0;
+ int reverse = 0;
#if CONFIG_VNC_TLS
int tls = 0, x509 = 0;
#endif
@@ -2179,6 +2185,13 @@
}
#endif
}
+ if (strstart(display, "rev:", &p)) {
+ reverse = 1;
+ display = p;
+ if (!strchr(display, ':')) {
+ display = p - 1;
+ }
+ }
#ifndef _WIN32
if (strstart(display, "unix:", &p)) {
addr = (struct sockaddr *)&uaddr;
@@ -2196,7 +2209,9 @@
memset(uaddr.sun_path, 0, 108);
snprintf(uaddr.sun_path, 108, "%s", p);
- unlink(uaddr.sun_path);
+ if (!reverse) {
+ unlink(uaddr.sun_path);
+ }
} else
#endif
{
@@ -2210,7 +2225,7 @@
return -1;
}
- iaddr.sin_port = htons(ntohs(iaddr.sin_port) + 5900);
+ iaddr.sin_port = htons(ntohs(iaddr.sin_port) + (reverse ? 0 : 5900));
vs->lsock = socket(PF_INET, SOCK_STREAM, 0);
if (vs->lsock == -1) {
@@ -2233,6 +2248,22 @@
}
}
+ if (reverse) {
+ if (connect(vs->lsock, addr, addrlen) == -1) {
+ fprintf(stderr, "Connection to VNC client failed\n");
+ close(vs->lsock);
+ vs->lsock = -1;
+ free(vs->display);
+ vs->display = NULL;
+ return -1;
+ } else {
+ vs->csock = vs->lsock;
+ vs->lsock = -1;
+ vnc_connect(vs);
+ return 0;
+ }
+ }
+
if (bind(vs->lsock, addr, addrlen) == -1) {
fprintf(stderr, "bind() failed\n");
close(vs->lsock);
next reply other threads:[~2008-01-16 7:29 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-01-16 7:27 Eddie Kohler [this message]
2008-01-16 8:55 ` [Qemu-devel] [PATCH] add VNC reverse connections Avi Kivity
2008-01-16 12:42 ` Daniel P. Berrange
2008-01-16 15:00 ` Anthony Liguori
2008-01-16 15:09 ` Eddie Kohler
2008-01-16 16:31 ` Anthony Liguori
2008-01-16 16:35 ` Daniel P. Berrange
2008-01-17 0:04 ` Anthony Liguori
2008-01-17 0:51 ` Eddie Kohler
2008-01-17 16:29 ` Eddie Kohler
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=478DB1D3.60905@cs.ucla.edu \
--to=kohler@cs.ucla.edu \
--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.