<div>Hi,everyone,</div>
<div> </div>
<div>I used the patch file to modify the libvirt,but it seems not to work right.</div>
<div> </div>
<div>It looks like that libvirt accpet the graphices type of spice,but it's can use "virsh start xp" to start the machine,with the error is:</div>
<div><font color="#ff0000">internal error unable to start guest:Supported machines are:</font></div>
<div><font color="#ff0000">pc Standard PC(default)</font></div>
<div><font color="#ff0000">isapc ISA-only PC<br clear="all"></font></div>
<div>So,anyone have ideas about that?</div>
<div>thanks,</div>
<div> </div>
<div> </div>
<div>PATCH file:</div>
<div> This adds an element<br><br><graphics type='spice' port='5903' tlsPort='5904' listen='127.0.0.1'/><br><br>This is the bare minimum that should be exposed in the guest<br>config for SPICE. Other parameters are better handled as per<br>
host level configuration tunables<br><br>* docs/schemas/domain.rng: Define the SPICE <graphics> schema<br>* src/domain_conf.h, src/domain_conf.c: Add parsing and formatting<br> for SPICE graphics config<br>* src/qemu_conf.c: Complain about unsupported graphics types<br>
---<br>docs/schemas/domain.rng | 30 +++++++++++++++++++++<br>src/conf/domain_conf.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++-<br>src/conf/domain_conf.h | 8 ++++++<br>src/qemu/qemu_conf.c | 9 ++++++<br>
4 files changed, 111 insertions(+), 1 deletions(-)<br><br>diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng<br>index f9d6d7e..8aa2079 100644<br>--- a/docs/schemas/domain.rng<br>+++ b/docs/schemas/domain.rng<br>
@@ -746,6 +746,36 @@<br> </group><br> <group><br> <attribute name="type"><br>+ <value>spice</value><br>+ </attribute><br>+ <optional><br>
+ <attribute name="port"><br>+ <ref name="PortNumber"/><br>+ </attribute><br>+ </optional><br>+ <optional><br>+ <attribute name="tlsPort"><br>
+ <ref name="PortNumber"/><br>+ </attribute><br>+ </optional><br>+ <optional><br>+ <attribute name="listen"><br>+ <ref name="addrIP"/><br>
+ </attribute><br>+ </optional><br>+ <optional><br>+ <attribute name="passwd"><br>+ <text/><br>+ </attribute><br>
+ </optional><br>+ <optional><br>+ <attribute name="keymap"><br>+ <text/><br>+ </attribute><br>+ </optional><br>+ </group><br>
+ <group><br>+ <attribute name="type"><br> <value>rdp</value><br> </attribute><br> <optional><br>diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c<br>
index 4930c38..ca5dfc3 100644<br>--- a/src/conf/domain_conf.c<br>+++ b/src/conf/domain_conf.c<br>@@ -165,7 +165,8 @@ VIR_ENUM_IMPL(virDomainGraphics, VIR_DOMAIN_GRAPHICS_TYPE_LAST,<br> "sdl",<br> "vnc",<br>
"rdp",<br>- "desktop")<br>+ "desktop",<br>+ "spice")<br><br>VIR_ENUM_IMPL(virDomainHostdevMode, VIR_DOMAIN_HOSTDEV_MODE_LAST,<br>
"subsystem",<br>@@ -267,6 +268,12 @@ void virDomainGraphicsDefFree(virDomainGraphicsDefPtr def)<br> case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:<br> VIR_FREE(def->data.desktop.display);<br>
break;<br>+<br>+ case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:<br>+ VIR_FREE(def->data.spice.listenAddr);<br>+ VIR_FREE(def->data.spice.keymap);<br>+ VIR_FREE(def->data.spice.passwd);<br>+ break;<br>
}<br><br> VIR_FREE(def);<br>@@ -1692,6 +1699,38 @@ virDomainGraphicsDefParseXML(virConnectPtr conn,<br> def->data.desktop.fullscreen = 0;<br><br> def->data.desktop.display = virXMLPropString(node, "display");<br>
+ } else if (def->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE) {<br>+ char *port = virXMLPropString(node, "port");<br>+ char *tlsPort;<br>+<br>+ if (port) {<br>+ if (virStrToLong_i(port, NULL, 10, &def->data.spice.port) < 0) {<br>
+ virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,<br>+ _("cannot parse spice port %s"), port);<br>+ VIR_FREE(port);<br>+ goto error;<br>
+ }<br>+ VIR_FREE(port);<br>+ } else {<br>+ def->data.spice.port = 5900;<br>+ }<br>+<br>+ tlsPort = virXMLPropString(node, "tlsPort");<br>+ if (tlsPort) {<br>
+ if (virStrToLong_i(tlsPort, NULL, 10, &def->data.spice.tlsPort) < 0) {<br>+ virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,<br>+ _("cannot parse spice tlsPort %s"), tlsPort);<br>
+ VIR_FREE(tlsPort);<br>+ goto error;<br>+ }<br>+ VIR_FREE(tlsPort);<br>+ } else {<br>+ def->data.spice.tlsPort = 0;<br>+ }<br>+<br>+ def->data.spice.listenAddr = virXMLPropString(node, "listen");<br>
+ def->data.spice.passwd = virXMLPropString(node, "passwd");<br>+ def->data.spice.keymap = virXMLPropString(node, "keymap");<br> }<br><br>cleanup:<br>@@ -4100,6 +4139,30 @@ virDomainGraphicsDefFormat(virConnectPtr conn,<br>
<br> break;<br><br>+ case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:<br>+ if (def->data.spice.port)<br>+ virBufferVSprintf(buf, " port='%d'",<br>+ def->data.spice.port);<br>
+<br>+ if (def->data.spice.tlsPort)<br>+ virBufferVSprintf(buf, " tlsPort='%d'",<br>+ def->data.spice.tlsPort);<br>+<br>+ if (def->data.spice.listenAddr)<br>
+ virBufferVSprintf(buf, " listen='%s'",<br>+ def->data.spice.listenAddr);<br>+<br>+ if (def->data.spice.keymap)<br>+ virBufferEscapeString(buf, " keymap='%s'",<br>
+ def->data.spice.keymap);<br>+<br>+ if (def->data.spice.passwd &&<br>+ (flags & VIR_DOMAIN_XML_SECURE))<br>+ virBufferEscapeString(buf, " passwd='%s'",<br>
+ def->data.spice.passwd);<br>+<br>+ break;<br>+<br> }<br><br> virBufferAddLit(buf, "/>\n");<br>diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h<br>
index 7ea1152..4cb10d3 100644<br>--- a/src/conf/domain_conf.h<br>+++ b/src/conf/domain_conf.h<br>@@ -334,6 +334,7 @@ enum virDomainGraphicsType {<br> VIR_DOMAIN_GRAPHICS_TYPE_VNC,<br> VIR_DOMAIN_GRAPHICS_TYPE_RDP,<br>
VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP,<br>+ VIR_DOMAIN_GRAPHICS_TYPE_SPICE,<br><br> VIR_DOMAIN_GRAPHICS_TYPE_LAST,<br>};<br>@@ -366,6 +367,13 @@ struct _virDomainGraphicsDef {<br> char *display;<br> int fullscreen : 1;<br>
} desktop;<br>+ struct {<br>+ int port;<br>+ int tlsPort;<br>+ char *listenAddr;<br>+ char *keymap;<br>+ char *passwd;<br>+ } spice;<br> } data;<br>
};<br><br>diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c<br>index 7ba0ac2..ae171bc 100644<br>--- a/src/qemu/qemu_conf.c<br>+++ b/src/qemu/qemu_conf.c<br>@@ -2067,6 +2067,12 @@ int qemudBuildCommandLine(virConnectPtr conn,<br>
}<br> }<br><br>+ if (def->ngraphics > 1) {<br>+ qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,<br>+ "%s", _("only one graphics output is currently supported"));<br>
+ goto error;<br>+ }<br>+<br> if ((def->ngraphics == 1) &&<br> def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC) {<br> virBuffer opt = VIR_BUFFER_INITIALIZER;<br>@@ -2155,6 +2161,9 @@ int qemudBuildCommandLine(virConnectPtr conn,<br>
*/<br> ADD_ENV_COPY("QEMU_AUDIO_DRV");<br> ADD_ENV_COPY("SDL_AUDIODRIVER");<br>+ } else if (def->ngraphics) {<br>+ qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,<br>
+ "%s", _("unsupported graphics output requested"));<br> }<br><br> if (def->nvideos) {<br>-- <br><br>-- <br></div>
<div>Name: Ben<br>-------------------------------------------<br>Msn: <a href="mailto:liaosongwen@live.cn" target="_blank">liaosongwen@live.cn</a></div>
<div> </div><br>