On Tue, 1 Feb 2011, Ian Jackson wrote:
> 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);
>
why did you add xenstore_write_vncinfo to qemu-common.h instead of
qemu-xen.h?
> 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
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|