[Libvir] PATCH: Fix paravirt FB with xm driver

Daniel P. Berrange berrange at redhat.com
Fri Aug 10 15:39:03 UTC 2007


The code for dealing with the paravirt framebuffer was missing code to deal
with an explicit vncdisplay=N  setting - only working for vncunused=1. It
was also not flexible enough in processing the 2 different styles of FB
config.

Dan.
-- 
|=- Red Hat, Engineering, Emerging Technologies, Boston.  +1 978 392 2496 -=|
|=-           Perl modules: http://search.cpan.org/~danberr/              -=|
|=-               Projects: http://freshmeat.net/~danielpb/               -=|
|=-  GnuPG: 7D3B9505   F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505  -=| 
-------------- next part --------------
diff -rup libvirt-0.2.3.orig/src/xm_internal.c libvirt-0.2.3.new/src/xm_internal.c
--- libvirt-0.2.3.orig/src/xm_internal.c	2007-07-24 14:32:41.000000000 -0400
+++ libvirt-0.2.3.new/src/xm_internal.c	2007-08-09 12:46:58.000000000 -0400
@@ -916,7 +916,8 @@ char *xenXMDomainFormatXML(virConnectPtr
         }
         if (xenXMConfigGetInt(conf, "sdl", &val) == 0 && val)
             sdl = 1;
-    } else { /* New PV guests use this format */
+    }
+    if (!hvm && !sdl && !vnc) { /* New PV guests use this format */
         list = virConfGetValue(conf, "vfb");
         if (list && list->type == VIR_CONF_LIST &&
             list->list && list->list->type == VIR_CONF_STRING &&
@@ -943,6 +944,8 @@ char *xenXMDomainFormatXML(virConnectPtr
                     sdl = 1;
                 } else if (!strncmp(key, "type=vnc", 8)) {
                     vnc = 1;
+                } else if (!strncmp(key, "vncunused=", 10)) {
+                    vncunused = strtol(key+10, NULL, 10);
                 } else if (!strncmp(key, "vnclisten=", 10)) {
                     vnclisten = key + 10;
                 } else if (!strncmp(key, "vncpasswd=", 10)) {
@@ -950,11 +953,7 @@ char *xenXMDomainFormatXML(virConnectPtr
                 } else if (!strncmp(key, "keymap=", 7)) {
                     keymap = key + 7;
                 } else if (!strncmp(key, "vncdisplay=", 11)) {
-                    int port = strtol(key+11, NULL, 10);
-                    if (port == -1)
-                        vncunused = 1;
-                    else
-                        port = port - 5900;
+                    vncdisplay = strtol(key+11, NULL, 10);
                 }
 
                 while (nextkey && (nextkey[0] == ',' ||
@@ -1899,11 +1917,18 @@ virConfPtr xenXMParseXMLToConfig(virConn
                                           "cannot set the keymap parameter") < 0)
             goto error;
 
-        /* XXX vncdisplay */
-        /*
-          if (xenXMConfigSetIntFromXPath(conn, conf, ctxt, "vncdisplay", "string(int(/domain/devices/graphics[@type='vnc']/@vncport) - 5900))", 0, 0) < 0)
-          goto error;
-        */
+        obj = xmlXPathEval(BAD_CAST "string(/domain/devices/graphics[@type='vnc']/@port)", ctxt);
+        if ((obj != NULL) && (obj->type == XPATH_STRING) &&
+            (obj->stringval != NULL)) {
+            int port = strtol((const char *)obj->stringval, NULL, 10);
+            if (port != -1) {
+                char portstr[50];
+                snprintf(portstr, sizeof(portstr), "%d", port-5900);
+                if (xenXMConfigSetString(conf, "vncdisplay", portstr) < 0)
+                    goto error;
+            }
+        }
+        xmlXPathFreeObject(obj);
     } else {
         virConfValuePtr vfb;
         obj = xmlXPathEval(BAD_CAST "/domain/devices/graphics", ctxt);


More information about the libvir-list mailing list