The xend protocol as actually implemented is:
* xend writes:
/vm/UUID/vncpasswd = "PASS" (n0,rDOMID)
/local/domain/0/backend/vfb/DOMID/0/vncunused = "0" (n0,rDOMID)
/local/domain/0/backend/vfb/DOMID/0/vnc = "1" (n0,rDOMID)
/local/domain/0/backend/vfb/DOMID/0/vnclisten = "ADDR" (n0,rDOMID)
/local/domain/0/backend/vfb/DOMID/0/vncdisplay = "PORT" (n0,rDOMID)
/local/domain/0/backend/vfb/DOMID/0/vncpasswd = "PASS" (n0,rDOMID)
* qemu reads /vm/UUID/vncpasswd and overwrites it with "\0"
* qemu writes
/local/domain/DOMID/console/vnc-port = "PORT" (n0,rDOMID)
* xm vncviewer reads entries from backend/vfb,
as well as console/vnc-port.
Much of this is insane.
xl quite properly does not create anything in backend/vfb for an HVM
domain with no vfb. But xl vncviewer needs to know the port number
and the address and the password.
So, for now, have qemu write these nodes too:
/local/domain/DOMID/console/vnc-listen = "ADDR" (n0,rDOMID)
/local/domain/DOMID/console/vnc-pass = "PASS" (n0,rDOMID)
This corresponds to the protocol actually currently implemented in
libxl.
We will revisit this after the 4.1 release and invent a non-insane
protocol.
Signed-off-by: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
---
qemu-common.h | 6 ++++++
qemu-xen.h | 1 -
vl.c | 1 -
vnc.c | 3 +++
xenstore.c | 57 ++++++++++++++++++++++++++++++++++++++++-----------------
5 files changed, 49 insertions(+), 19 deletions(-)
diff --git a/qemu-common.h b/qemu-common.h
index 50dfb6b..02d4cc4 100644
--- a/qemu-common.h
+++ b/qemu-common.h
@@ -209,4 +209,10 @@ void qemu_iovec_from_buffer(QEMUIOVector *qiov, const void
*buf, size_t count);
#endif /* dyngen-exec.h hack */
+#include "qemu_socket.h"
+
+void xenstore_write_vncinfo(int port,
+ const struct sockaddr *addr,
+ socklen_t addrlen,
+ const char *password);
#endif
diff --git a/qemu-xen.h b/qemu-xen.h
index 0e70dbe..d50c89f 100644
--- a/qemu-xen.h
+++ b/qemu-xen.h
@@ -71,7 +71,6 @@ void xenstore_process_event(void *opaque);
void xenstore_record_dm(const char *subpath, const char *state);
void xenstore_record_dm_state(const char *state);
void xenstore_check_new_media_present(int timeout);
-void xenstore_write_vncport(int vnc_display);
void xenstore_read_vncpasswd(int domid, char *pwbuf, size_t pwbuflen);
void xenstore_write_vslots(char *vslots);
diff --git a/vl.c b/vl.c
index 5f48e1f..f07a659 100644
--- a/vl.c
+++ b/vl.c
@@ -6003,7 +6003,6 @@ int main(int argc, char **argv, char **envp)
vnc_display_port = vnc_display_open(ds, vnc_display,
vncunused);
if (vnc_display_port < 0)
exit(1);
- xenstore_write_vncport(vnc_display_port);
}
#if defined(CONFIG_SDL)
if (sdl || !vnc_display)
diff --git a/vnc.c b/vnc.c
index ba26f9e..7629dfa 100644
--- a/vnc.c
+++ b/vnc.c
@@ -2768,6 +2768,9 @@ int vnc_display_open(DisplayState *ds, const char
*display, int find_unused)
return -1;
}
+ xenstore_write_vncinfo(ntohs(iaddr.sin_port), addr, addrlen,
+ vs->password);
+
if (qemu_set_fd_handler2(vs->lsock, vnc_listen_poll, vnc_listen_read,
NULL, vs) < 0)
return -1;
diff --git a/xenstore.c b/xenstore.c
index d364a5e..173a7c0 100644
--- a/xenstore.c
+++ b/xenstore.c
@@ -1149,32 +1149,55 @@ void xenstore_process_event(void *opaque)
free(vec);
}
-void xenstore_write_vncport(int display)
+static void xenstore_write_domain_console_item
+ (const char *item, const char *val)
{
- char *buf = NULL, *path;
- char *portstr = NULL;
+ char *dompath;
+ char *path = NULL;
if (xsh == NULL)
return;
- path = xs_get_domain_path(xsh, domid);
- if (path == NULL) {
- fprintf(logfile, "xs_get_domain_path() error\n");
- goto out;
- }
+ dompath = xs_get_domain_path(xsh, domid);
+ if (dompath == NULL) goto out_err;
- if (pasprintf(&buf, "%s/console/vnc-port", path) == -1)
- goto out;
-
- if (pasprintf(&portstr, "%d", display) == -1)
- goto out;
+ if (pasprintf(&path, "%s/console/%s", dompath, item) == -1) goto out_err;
- if (xs_write(xsh, XBT_NULL, buf, portstr, strlen(portstr)) == 0)
- fprintf(logfile, "xs_write() vncport failed\n");
+ if (xs_write(xsh, XBT_NULL, path, val, strlen(val)) == 0)
+ goto out_err;
out:
- free(portstr);
- free(buf);
+ free(path);
+ return;
+
+ out_err:
+ fprintf(logfile, "write console item %s (%s) failed\n", item, path);
+ goto out;
+}
+
+void xenstore_write_vncinfo(int port,
+ const struct sockaddr *addr,
+ socklen_t addrlen,
+ const char *password)
+{
+ char *portstr = NULL;
+ const char *addrstr;
+
+ if (pasprintf(&portstr, "%d", port) != -1) {
+ xenstore_write_domain_console_item("vnc-port", portstr);
+ free(portstr);
+ }
+
+ assert(addr->sa_family == AF_INET);
+ addrstr = inet_ntoa(((const struct sockaddr_in*)addr)->sin_addr);
+ if (!addrstr) {
+ fprintf(logfile, "inet_ntop on vnc-addr failed\n");
+ } else {
+ xenstore_write_domain_console_item("vnc-listen", addrstr);
+ }
+
+ if (password)
+ xenstore_write_domain_console_item("vnc-pass", password);
}
void xenstore_write_vslots(char *vslots)
--
1.5.6.5
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|