# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1273220809 -3600
# Node ID 7af536406c255bdc9d3429679710b0827d52bdaf
# Parent 06581072daf549fef7fd17a540b70187ef4e5bea
libxl: support vncpassword in device-model specification
From: Gihan Munasinghe <GMunasinghe@xxxxxxxxxxxx>
Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
tools/libxl/libxl.c | 32 +++++++++++++++++++++++++++++++-
tools/libxl/libxl.h | 2 ++
tools/libxl/xl_cmdimpl.c | 4 ++++
3 files changed, 37 insertions(+), 1 deletion(-)
diff -r 06581072daf5 -r 7af536406c25 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c Fri May 07 09:15:19 2010 +0100
+++ b/tools/libxl/libxl.c Fri May 07 09:26:49 2010 +0100
@@ -769,7 +769,12 @@ static char ** libxl_build_device_model_
flexarray_set(dm_args, num++, "-vnc");
if (info->vncdisplay) {
if (info->vnclisten && strchr(info->vnclisten, ':') == NULL) {
- flexarray_set(dm_args, num++, libxl_sprintf(ctx, "%s:%d",
info->vnclisten, info->vncdisplay));
+ flexarray_set(
+ dm_args, num++,
+ libxl_sprintf(ctx, "%s:%d%s",
+ info->vnclisten,
+ info->vncdisplay,
+ info->vncpasswd ? ",password" : ""));
} else {
flexarray_set(dm_args, num++, libxl_sprintf(ctx,
"127.0.0.1:%d", info->vncdisplay));
}
@@ -892,6 +897,7 @@ static int libxl_vfb_and_vkb_from_device
vfb->vnclisten = info->vnclisten;
vfb->vncdisplay = info->vncdisplay;
vfb->vncunused = info->vncunused;
+ vfb->vncpasswd = info->vncpasswd;
vfb->keymap = info->keymap;
vfb->sdl = info->sdl;
vfb->opengl = info->opengl;
@@ -1082,6 +1088,9 @@ int libxl_create_device_model(struct lib
int rc;
char **args;
struct libxl_device_model_starting buf_starting, *p;
+ xs_transaction_t t;
+ char *vm_path;
+ char **pass_stuff;
if (strstr(info->device_model, "stubdom-dm")) {
libxl_device_vfb vfb;
@@ -1117,6 +1126,23 @@ int libxl_create_device_model(struct lib
p->domid = info->domid;
p->dom_path = libxl_xs_get_dompath(ctx, info->domid);
if (!p->dom_path) { libxl_free(ctx, p); return ERROR_FAIL; }
+
+ if (info->vncpasswd) {
+ retry_transaction:
+ /* Find uuid and the write the vnc password to xenstore for qemu. */
+ t = xs_transaction_start(ctx->xsh);
+ vm_path = libxl_xs_read(ctx,t,libxl_sprintf(ctx, "%s/vm",
p->dom_path));
+ if (vm_path) {
+ /* Now write the vncpassword into it. */
+ pass_stuff = libxl_calloc(ctx, 2, sizeof(char *));
+ pass_stuff[0] = "vncpasswd";
+ pass_stuff[1] = info->vncpasswd;
+ libxl_xs_writev(ctx,t,vm_path,pass_stuff);
+ if (!xs_transaction_end(ctx->xsh, t, 0))
+ if (errno == EAGAIN)
+ goto retry_transaction;
+ }
+ }
rc = libxl_spawn_spawn(ctx, p, "device model", dm_xenstore_record_pid);
if (rc < 0) goto xit;
@@ -1672,6 +1698,8 @@ static int libxl_build_xenpv_qemu_args(s
info->vnclisten = libxl_sprintf(ctx, "%s", vfb->vnclisten);
info->vncdisplay = vfb->vncdisplay;
info->vncunused = vfb->vncunused;
+ if (vfb->vncpasswd)
+ info->vncpasswd = vfb->vncpasswd;
if (vfb->keymap)
info->keymap = libxl_sprintf(ctx, "%s", vfb->keymap);
info->sdl = vfb->sdl;
@@ -1753,6 +1781,8 @@ int libxl_device_vfb_add(struct libxl_ct
flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", vfb->vnc));
flexarray_set(back, boffset++, "vnclisten");
flexarray_set(back, boffset++, vfb->vnclisten);
+ flexarray_set(back, boffset++, "vncpasswd");
+ flexarray_set(back, boffset++, vfb->vncpasswd);
flexarray_set(back, boffset++, "vncdisplay");
flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d", vfb->vncdisplay));
flexarray_set(back, boffset++, "vncunused");
diff -r 06581072daf5 -r 7af536406c25 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h Fri May 07 09:15:19 2010 +0100
+++ b/tools/libxl/libxl.h Fri May 07 09:26:49 2010 +0100
@@ -148,6 +148,7 @@ typedef struct {
bool stdvga; /* stdvga enabled or disabled */
bool vnc; /* vnc enabled or disabled */
char *vnclisten; /* address:port that should be listened on for the VNC
server if vnc is set */
+ char *vncpasswd; /* the VNC password */
int vncdisplay; /* set VNC display number */
bool vncunused; /* try to find an unused port for the VNC server */
char *keymap; /* set keyboard layout, default is en-us keyboard */
@@ -169,6 +170,7 @@ typedef struct {
int devid;
bool vnc; /* vnc enabled or disabled */
char *vnclisten; /* address:port that should be listened on for the VNC
server if vnc is set */
+ char *vncpasswd; /* the VNC password */
int vncdisplay; /* set VNC display number */
bool vncunused; /* try to find an unused port for the VNC server */
char *keymap; /* set keyboard layout, default is en-us keyboard */
diff -r 06581072daf5 -r 7af536406c25 tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c Fri May 07 09:15:19 2010 +0100
+++ b/tools/libxl/xl_cmdimpl.c Fri May 07 09:26:49 2010 +0100
@@ -627,6 +627,8 @@ skip:
(*vfbs)[*num_vfbs].vnc = atoi(p2 + 1);
} else if (!strcmp(p, "vnclisten")) {
(*vfbs)[*num_vfbs].vnclisten = strdup(p2 + 1);
+ } else if (!strcmp(p, "vncpasswd")) {
+ (*vfbs)[*num_vfbs].vncpasswd = strdup(p2 + 1);
} else if (!strcmp(p, "vncdisplay")) {
(*vfbs)[*num_vfbs].vncdisplay = atoi(p2 + 1);
} else if (!strcmp(p, "vncunused")) {
@@ -705,6 +707,8 @@ skip_pci:
dm_info->vnc = l;
if (!xlu_cfg_get_string (config, "vnclisten", &buf))
dm_info->vnclisten = strdup(buf);
+ if (!xlu_cfg_get_string (config, "vncpasswd", &buf))
+ dm_info->vncpasswd = strdup(buf);
if (!xlu_cfg_get_long (config, "vncdisplay", &l))
dm_info->vncdisplay = l;
if (!xlu_cfg_get_long (config, "vncunused", &l))
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|