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

Re: [Xen-devel] [PATCH] libxl: Query VNC listening port through QMP



On Mon, 2012-04-16 at 19:15 +0100, Anthony PERARD wrote:
> Currently `xl vncviewer $dom` does not work because the VNC port is not
> registered in xenstore when using qemu-upstream. This patch attempted to fix
> this.

libxl_vncviewer_exec also potentially reads vnc-pass, although frankly
having such a thing in xenstore strikes me as something of a
misfeature...

Otherwise: 
Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>

> Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx>
> 
> ---
>  tools/libxl/libxl_qmp.c |   59 
> +++++++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 59 insertions(+), 0 deletions(-)
> 
> diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c
> index f5a3edc..72ff4a4 100644
> --- a/tools/libxl/libxl_qmp.c
> +++ b/tools/libxl/libxl_qmp.c
> @@ -154,6 +154,55 @@ static int 
> register_serials_chardev_callback(libxl__qmp_handler *qmp,
>      return ret;
>  }
>  
> +static int qmp_write_domain_console_item(libxl__gc *gc, int domid,
> +                                         const char *item, const char *value)
> +{
> +    char *path;
> +
> +    path = libxl__xs_get_dompath(gc, domid);
> +    path = libxl__sprintf(gc, "%s/console/%s", path, item);
> +
> +    return libxl__xs_write(gc, XBT_NULL, path, "%s", value);
> +}
> +
> +static int qmp_register_vnc_callback(libxl__qmp_handler *qmp,
> +                                     const libxl__json_object *o,
> +                                     void *unused)
> +{
> +    GC_INIT(qmp->ctx);
> +    const libxl__json_object *obj;
> +    const char *listen, *port;
> +    int rc = -1;
> +
> +    if (!libxl__json_object_is_map(o)) {
> +        goto out;
> +    }
> +
> +    if (libxl__json_map_get("enabled", o, JSON_FALSE)) {
> +        rc = 0;
> +        goto out;
> +    }
> +
> +    obj = libxl__json_map_get("host", o, JSON_STRING);
> +    listen = libxl__json_object_get_string(obj);
> +    obj = libxl__json_map_get("service", o, JSON_STRING);
> +    port = libxl__json_object_get_string(obj);
> +
> +    if (!listen || !port) {
> +        LIBXL__LOG(qmp->ctx, LIBXL__LOG_ERROR,
> +                   "Failed to retreive VNC connect information.");
> +        goto out;
> +    }
> +
> +    rc = qmp_write_domain_console_item(gc, qmp->domid, "vnc-listen", listen);
> +    if (!rc)
> +        rc = qmp_write_domain_console_item(gc, qmp->domid, "vnc-port", port);
> +
> +out:
> +    GC_FREE;
> +    return rc;
> +}
> +
>  static int qmp_capabilities_callback(libxl__qmp_handler *qmp,
>                                       const libxl__json_object *o, void 
> *unused)
>  {
> @@ -688,6 +737,13 @@ int libxl__qmp_query_serial(libxl__qmp_handler *qmp)
>                                  NULL, qmp->timeout);
>  }
>  
> +static int qmp_query_vnc(libxl__qmp_handler *qmp)
> +{
> +    return qmp_synchronous_send(qmp, "query-vnc", NULL,
> +                                qmp_register_vnc_callback,
> +                                NULL, qmp->timeout);
> +}
> +
>  static int pci_add_callback(libxl__qmp_handler *qmp,
>                              const libxl__json_object *response, void *opaque)
>  {
> @@ -917,6 +973,9 @@ int libxl__qmp_initializations(libxl__gc *gc, uint32_t 
> domid,
>      if (!ret && vnc && vnc->passwd) {
>          ret = qmp_change(gc, qmp, "vnc", "password", vnc->passwd);
>      }
> +    if (!ret) {
> +        ret = qmp_query_vnc(qmp);
> +    }
>      libxl__qmp_close(qmp);
>      return ret;
>  }



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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