<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>