Signed-off-by: Jim Fehlig <jfehlig@xxxxxxxx> --- src/libxl/libxl_conf.c | 72 +++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 66 insertions(+), 6 deletions(-) diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 8552c77..5bb0425 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -1337,22 +1337,82 @@ 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. + * Prefer SPICE, otherwise 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; + for (i = 0; i < def->ngraphics; i++) { + virDomainGraphicsDefPtr l_vfb = def->graphics[0]; + 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)) { @@ -1778,7 +1838,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) -- 1.8.4.5 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list