libxl: support SPICE graphics for HVM domains

Signed-off-by: Jim Fehlig <jfehlig@suse.com>
This commit is contained in:
Jim Fehlig 2015-04-27 16:27:52 -06:00
parent 5a10fb1d2c
commit 6baf881441

View File

@ -1339,22 +1339,85 @@ libxlMakeVfbList(virPortAllocatorPtr graphicsports,
/*
* Populate vfb info in libxl_domain_build_info struct for HVM domains.
* Use first libxl_device_vfb device in libxl_domain_config->vfbs.
* Prior to calling this function, libxlMakeVfbList must be called to
* populate libxl_domain_config->vfbs.
*/
static int
libxlMakeBuildInfoVfb(virDomainDefPtr def, libxl_domain_config *d_config)
libxlMakeBuildInfoVfb(virPortAllocatorPtr graphicsports,
virDomainDefPtr def,
libxl_domain_config *d_config)
{
libxl_domain_build_info *b_info = &d_config->b_info;
libxl_device_vfb x_vfb;
size_t i;
if (def->os.type != VIR_DOMAIN_OSTYPE_HVM)
return 0;
if (d_config->num_vfbs == 0)
if (def->ngraphics == 0)
return 0;
/*
* Prefer SPICE, otherwise use first libxl_device_vfb device in
* libxl_domain_config->vfbs. Prior to calling this function,
*/
for (i = 0; i < def->ngraphics; i++) {
virDomainGraphicsDefPtr l_vfb = def->graphics[i];
unsigned short port;
const char *listenAddr;
if (l_vfb->type != VIR_DOMAIN_GRAPHICS_TYPE_SPICE)
continue;
libxl_defbool_set(&b_info->u.hvm.spice.enable, true);
if (l_vfb->data.spice.autoport) {
if (virPortAllocatorAcquire(graphicsports, &port) < 0)
return -1;
l_vfb->data.spice.port = port;
}
b_info->u.hvm.spice.port = l_vfb->data.spice.port;
listenAddr = virDomainGraphicsListenGetAddress(l_vfb, 0);
if (VIR_STRDUP(b_info->u.hvm.spice.host, listenAddr) < 0)
return -1;
if (VIR_STRDUP(b_info->u.hvm.keymap, l_vfb->data.spice.keymap) < 0)
return -1;
if (l_vfb->data.spice.auth.passwd) {
if (VIR_STRDUP(b_info->u.hvm.spice.passwd,
l_vfb->data.spice.auth.passwd) < 0)
return -1;
libxl_defbool_set(&b_info->u.hvm.spice.disable_ticketing, false);
} else {
libxl_defbool_set(&b_info->u.hvm.spice.disable_ticketing, true);
}
switch (l_vfb->data.spice.mousemode) {
/* client mouse mode is default in xl.cfg */
case VIR_DOMAIN_GRAPHICS_SPICE_MOUSE_MODE_DEFAULT:
case VIR_DOMAIN_GRAPHICS_SPICE_MOUSE_MODE_CLIENT:
libxl_defbool_set(&b_info->u.hvm.spice.agent_mouse, true);
break;
case VIR_DOMAIN_GRAPHICS_SPICE_MOUSE_MODE_SERVER:
libxl_defbool_set(&b_info->u.hvm.spice.agent_mouse, false);
break;
}
#ifdef LIBXL_HAVE_SPICE_VDAGENT
if (l_vfb->data.spice.copypaste == VIR_TRISTATE_BOOL_YES) {
libxl_defbool_set(&b_info->u.hvm.spice.vdagent, true);
libxl_defbool_set(&b_info->u.hvm.spice.clipboard_sharing, true);
} else {
libxl_defbool_set(&b_info->u.hvm.spice.vdagent, false);
libxl_defbool_set(&b_info->u.hvm.spice.clipboard_sharing, false);
}
#endif
return 0;
}
x_vfb = d_config->vfbs[0];
if (libxl_defbool_val(x_vfb.vnc.enable)) {
@ -1780,7 +1843,7 @@ libxlBuildDomainConfig(virPortAllocatorPtr graphicsports,
if (libxlMakeVfbList(graphicsports, def, d_config) < 0)
return -1;
if (libxlMakeBuildInfoVfb(def, d_config) < 0)
if (libxlMakeBuildInfoVfb(graphicsports, def, d_config) < 0)
return -1;
if (libxlMakePCIList(def, d_config) < 0)