]> xenbits.xensource.com Git - libvirt.git/commitdiff
Fix QEMU ARGV detection with kvm >= 85
authorDaniel P. Berrange <berrange@redhat.com>
Mon, 11 May 2009 15:14:24 +0000 (15:14 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Mon, 11 May 2009 15:14:24 +0000 (15:14 +0000)
ChangeLog
src/qemu_conf.c
src/qemu_driver.c

index 98cb653405435b0a13f1983564a5b2baea47478e..5f033806341d73302a2a96bee71b93f9e34b00e6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Mon May 11 16:15:22 BST 2009 Daniel P. Berrange <berrange@redhat.com>
+
+       Fix QEMU ARGV detection with kvm >= 85
+       * src/qemu_conf.c: Increase limit on QEMU -help output size.
+       Improve error reporting when handling help output
+       * src/qemu_driver.c: Don't overwrite errors when extracting
+       QEMU versio ninfo
+
 Mon May 11 15:55:22 BST 2009 Daniel P. Berrange <berrange@redhat.com>
 
        * src/virsh.c: Report detailed error if initial connection open
index 9cb71eb107e3dd5ec0694a3bb09a0d70361d777b..a57d3abbac1e92a71d7c245749db12c558197806 100644 (file)
@@ -431,18 +431,28 @@ int qemudExtractVersionInfo(const char *qemu,
         return -1;
 
     char *help = NULL;
-    enum { MAX_HELP_OUTPUT_SIZE = 8192 };
+    enum { MAX_HELP_OUTPUT_SIZE = 1024*64 };
     int len = virFileReadLimFD(newstdout, MAX_HELP_OUTPUT_SIZE, &help);
-    if (len < 0)
+    if (len < 0) {
+        virReportSystemError(NULL, errno, "%s",
+                             _("Unable to read QEMU help output"));
         goto cleanup2;
+    }
 
     if (sscanf(help, "QEMU PC emulator version %u.%u.%u (kvm-%u)",
                &major, &minor, &micro, &kvm_version) != 4)
         kvm_version = 0;
 
-    if (!kvm_version && sscanf(help, "QEMU PC emulator version %u.%u.%u",
-               &major, &minor, &micro) != 3)
+    if (!kvm_version &&
+        sscanf(help, "QEMU PC emulator version %u.%u.%u",
+               &major, &minor, &micro) != 3) {
+        char *eol = strchr(help, '\n');
+        if (eol) *eol = '\0';
+        qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
+                         _("cannot parse QEMU version number in '%s'"),
+                         help);
         goto cleanup2;
+    }
 
     version = (major * 1000 * 1000) + (minor * 1000) + micro;
 
index 30642d50092681b1be60275c37ba3963a30aed83..bd60b29c1a4213b20195eecbda97515dd8dbc255 100644 (file)
@@ -1391,12 +1391,8 @@ static int qemudStartVMDaemon(virConnectPtr conn,
 
     if (qemudExtractVersionInfo(emulator,
                                 NULL,
-                                &qemuCmdFlags) < 0) {
-        qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
-                         _("Cannot determine QEMU argv syntax %s"),
-                         emulator);
+                                &qemuCmdFlags) < 0)
         goto cleanup;
-    }
 
     if (qemuPrepareHostDevices(conn, vm->def) < 0)
         goto cleanup;
@@ -3715,12 +3711,8 @@ static int qemudDomainChangeEjectableMedia(virConnectPtr conn,
 
     if (qemudExtractVersionInfo(vm->def->emulator,
                                 NULL,
-                                &qemuCmdFlags) < 0) {
-        qemudReportError(conn, dom, NULL, VIR_ERR_INTERNAL_ERROR,
-                         _("Cannot determine QEMU argv syntax %s"),
-                         vm->def->emulator);
+                                &qemuCmdFlags) < 0)
         return -1;
-    }
 
     if (qemuCmdFlags & QEMUD_CMD_FLAG_DRIVE) {
         if (!(devname = qemudDiskDeviceName(conn, newdisk)))