diff --git a/ChangeLog b/ChangeLog index a58a6bc3e6..f2210ca762 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Fri May 15 11:41:46 CEST 2009 Daniel Veillard + + * docs/schemas/domain.rng src/domain_conf.[ch] src/qemu_driver.c: + extend the generic code for the RDP and desktop extensions of + the graphic tag needed for vbox, patch by Pritesh Kothari + Thu May 14 12:29:41 CEST 2009 Daniel Veillard * src/xend_internal.c: remove [] around cpumaps for recent xend diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng index f1fc8c7f88..204c6333d9 100644 --- a/docs/schemas/domain.rng +++ b/docs/schemas/domain.rng @@ -725,6 +725,63 @@ + + + rdp + + + + + + + + + + yes + no + + + + + + + yes + no + + + + + + + yes + no + + + + + + + + + + + + desktop + + + + + + + + + + yes + no + + + + diff --git a/src/domain_conf.c b/src/domain_conf.c index 00aceef5b3..d7c4166d4c 100644 --- a/src/domain_conf.c +++ b/src/domain_conf.c @@ -151,7 +151,9 @@ VIR_ENUM_IMPL(virDomainInputBus, VIR_DOMAIN_INPUT_BUS_LAST, VIR_ENUM_IMPL(virDomainGraphics, VIR_DOMAIN_GRAPHICS_TYPE_LAST, "sdl", - "vnc") + "vnc", + "rdp", + "desktop") VIR_ENUM_IMPL(virDomainHostdevMode, VIR_DOMAIN_HOSTDEV_MODE_LAST, "subsystem", @@ -245,6 +247,14 @@ void virDomainGraphicsDefFree(virDomainGraphicsDefPtr def) VIR_FREE(def->data.sdl.display); VIR_FREE(def->data.sdl.xauth); break; + + case VIR_DOMAIN_GRAPHICS_TYPE_RDP: + VIR_FREE(def->data.rdp.listenAddr); + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP: + VIR_FREE(def->data.desktop.display); + break; } VIR_FREE(def); @@ -1521,6 +1531,68 @@ virDomainGraphicsDefParseXML(virConnectPtr conn, def->data.sdl.fullscreen = 0; def->data.sdl.xauth = virXMLPropString(node, "xauth"); def->data.sdl.display = virXMLPropString(node, "display"); + } else if (def->type == VIR_DOMAIN_GRAPHICS_TYPE_RDP) { + char *port = virXMLPropString(node, "port"); + char *autoport; + char *replaceUser; + char *multiUser; + + if (port) { + if (virStrToLong_i(port, NULL, 10, &def->data.rdp.port) < 0) { + virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR, + _("cannot parse rdp port %s"), port); + VIR_FREE(port); + goto error; + } + VIR_FREE(port); + } else { + def->data.rdp.port = 0; + def->data.rdp.autoport = 1; + } + + if ((autoport = virXMLPropString(node, "autoport")) != NULL) { + if (STREQ(autoport, "yes")) { + if (flags & VIR_DOMAIN_XML_INACTIVE) + def->data.rdp.port = 0; + def->data.rdp.autoport = 1; + } + VIR_FREE(autoport); + } + + if ((replaceUser = virXMLPropString(node, "replaceUser")) != NULL) { + if (STREQ(replaceUser, "yes")) { + def->data.rdp.replaceUser = 1; + } + VIR_FREE(replaceUser); + } + + if ((multiUser = virXMLPropString(node, "multiUser")) != NULL) { + if (STREQ(multiUser, "yes")) { + def->data.rdp.multiUser = 1; + } + VIR_FREE(multiUser); + } + + def->data.rdp.listenAddr = virXMLPropString(node, "listen"); + } else if (def->type == VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP) { + char *fullscreen = virXMLPropString(node, "fullscreen"); + + if (fullscreen != NULL) { + if (STREQ(fullscreen, "yes")) { + def->data.desktop.fullscreen = 1; + } else if (STREQ(fullscreen, "no")) { + def->data.desktop.fullscreen = 0; + } else { + virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR, + _("unknown fullscreen value '%s'"), fullscreen); + VIR_FREE(fullscreen); + goto error; + } + VIR_FREE(fullscreen); + } else + def->data.desktop.fullscreen = 0; + + def->data.desktop.display = virXMLPropString(node, "display"); } cleanup: @@ -3295,6 +3367,38 @@ virDomainGraphicsDefFormat(virConnectPtr conn, virBufferAddLit(buf, " fullscreen='yes'"); break; + + case VIR_DOMAIN_GRAPHICS_TYPE_RDP: + if (def->data.rdp.port) + virBufferVSprintf(buf, " port='%d'", + def->data.rdp.port); + else if (def->data.rdp.autoport) + virBufferAddLit(buf, " port='0'"); + + if (def->data.rdp.autoport) + virBufferVSprintf(buf, " autoport='yes'"); + + if (def->data.rdp.replaceUser) + virBufferVSprintf(buf, " replaceUser='yes'"); + + if (def->data.rdp.multiUser) + virBufferVSprintf(buf, " multiUser='yes'"); + + if (def->data.rdp.listenAddr) + virBufferVSprintf(buf, " listen='%s'", def->data.rdp.listenAddr); + + break; + + case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP: + if (def->data.desktop.display) + virBufferEscapeString(buf, " display='%s'", + def->data.desktop.display); + + if (def->data.desktop.fullscreen) + virBufferAddLit(buf, " fullscreen='yes'"); + + break; + } virBufferAddLit(buf, "/>\n"); diff --git a/src/domain_conf.h b/src/domain_conf.h index c0a5288cbf..a8ab99ebdc 100644 --- a/src/domain_conf.h +++ b/src/domain_conf.h @@ -268,6 +268,8 @@ struct _virDomainSoundDef { enum virDomainGraphicsType { VIR_DOMAIN_GRAPHICS_TYPE_SDL, VIR_DOMAIN_GRAPHICS_TYPE_VNC, + VIR_DOMAIN_GRAPHICS_TYPE_RDP, + VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP, VIR_DOMAIN_GRAPHICS_TYPE_LAST, }; @@ -289,6 +291,17 @@ struct _virDomainGraphicsDef { char *xauth; int fullscreen; } sdl; + struct { + int port; + char *listenAddr; + int autoport : 1; + int replaceUser : 1; + int multiUser : 1; + } rdp; + struct { + char *display; + int fullscreen : 1; + } desktop; } data; }; diff --git a/src/qemu_driver.c b/src/qemu_driver.c index bd60b29c1a..67b5e1c963 100644 --- a/src/qemu_driver.c +++ b/src/qemu_driver.c @@ -4841,6 +4841,7 @@ qemudDomainMigratePrepare2 (virConnectPtr dconn, vm->def->name); goto cleanup; } + virDomainObjUnlock(vm); } if (!(vm = virDomainAssignDef(dconn,