[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 1/1] vnc, xen: write vnc address and password to xenstore



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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.