From 426f9772b84752b4901b72fd382ff6e28e258efd Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Mon, 11 May 2009 15:14:24 +0000 Subject: [PATCH] Fix QEMU ARGV detection with kvm >= 85 --- ChangeLog | 8 ++++++++ src/qemu_conf.c | 18 ++++++++++++++---- src/qemu_driver.c | 12 ++---------- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/ChangeLog b/ChangeLog index 98cb653405..5f03380634 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Mon May 11 16:15:22 BST 2009 Daniel P. Berrange + + 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 * src/virsh.c: Report detailed error if initial connection open diff --git a/src/qemu_conf.c b/src/qemu_conf.c index 9cb71eb107..a57d3abbac 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 30642d5009..bd60b29c1a 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)))