Fix QEMU ARGV detection with kvm >= 85

This commit is contained in:
Daniel P. Berrange 2009-05-11 15:14:24 +00:00
parent 9927ca6274
commit 426f9772b8
3 changed files with 24 additions and 14 deletions

View File

@ -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> Mon May 11 15:55:22 BST 2009 Daniel P. Berrange <berrange@redhat.com>
* src/virsh.c: Report detailed error if initial connection open * src/virsh.c: Report detailed error if initial connection open

View File

@ -431,18 +431,28 @@ int qemudExtractVersionInfo(const char *qemu,
return -1; return -1;
char *help = NULL; 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); 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; goto cleanup2;
}
if (sscanf(help, "QEMU PC emulator version %u.%u.%u (kvm-%u)", if (sscanf(help, "QEMU PC emulator version %u.%u.%u (kvm-%u)",
&major, &minor, &micro, &kvm_version) != 4) &major, &minor, &micro, &kvm_version) != 4)
kvm_version = 0; kvm_version = 0;
if (!kvm_version && sscanf(help, "QEMU PC emulator version %u.%u.%u", if (!kvm_version &&
&major, &minor, &micro) != 3) 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; goto cleanup2;
}
version = (major * 1000 * 1000) + (minor * 1000) + micro; version = (major * 1000 * 1000) + (minor * 1000) + micro;

View File

@ -1391,12 +1391,8 @@ static int qemudStartVMDaemon(virConnectPtr conn,
if (qemudExtractVersionInfo(emulator, if (qemudExtractVersionInfo(emulator,
NULL, NULL,
&qemuCmdFlags) < 0) { &qemuCmdFlags) < 0)
qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
_("Cannot determine QEMU argv syntax %s"),
emulator);
goto cleanup; goto cleanup;
}
if (qemuPrepareHostDevices(conn, vm->def) < 0) if (qemuPrepareHostDevices(conn, vm->def) < 0)
goto cleanup; goto cleanup;
@ -3715,12 +3711,8 @@ static int qemudDomainChangeEjectableMedia(virConnectPtr conn,
if (qemudExtractVersionInfo(vm->def->emulator, if (qemudExtractVersionInfo(vm->def->emulator,
NULL, NULL,
&qemuCmdFlags) < 0) { &qemuCmdFlags) < 0)
qemudReportError(conn, dom, NULL, VIR_ERR_INTERNAL_ERROR,
_("Cannot determine QEMU argv syntax %s"),
vm->def->emulator);
return -1; return -1;
}
if (qemuCmdFlags & QEMUD_CMD_FLAG_DRIVE) { if (qemuCmdFlags & QEMUD_CMD_FLAG_DRIVE) {
if (!(devname = qemudDiskDeviceName(conn, newdisk))) if (!(devname = qemudDiskDeviceName(conn, newdisk)))