From 2b3fcdc378e7bec5c1a78b81632756e92930fd24 Mon Sep 17 00:00:00 2001 From: Daniel P. Berrange Date: Mon, 11 May 2009 15:14:24 +0000 Subject: [PATCH 1/1] Fix QEMU ARGV detection with kvm >= 85 --- src/qemu_conf.c | 18 ++++++++++++++---- src/qemu_driver.c | 12 ++---------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/qemu_conf.c b/src/qemu_conf.c index 9cb71eb..a57d3ab 100644 --- a/src/qemu_conf.c +++ b/src/qemu_conf.c @@ -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, µ, &kvm_version) != 4) kvm_version = 0; - if (!kvm_version && sscanf(help, "QEMU PC emulator version %u.%u.%u", - &major, &minor, µ) != 3) + if (!kvm_version && + sscanf(help, "QEMU PC emulator version %u.%u.%u", + &major, &minor, µ) != 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; diff --git a/src/qemu_driver.c b/src/qemu_driver.c index 30642d5..bd60b29 100644 --- a/src/qemu_driver.c +++ b/src/qemu_driver.c @@ -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))) -- 1.6.0.6