From f69ce3feb0eaa170420b5287f3512c18af29c630 Mon Sep 17 00:00:00 2001 From: KAMEZAWA Hiroyuki Date: Thu, 28 Oct 2010 17:51:18 +0900 Subject: [PATCH] qemu: check compression program availability of virsh save and dump --- src/qemu/qemu_driver.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 8aa593175e..a7cce6ae41 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -5742,6 +5742,22 @@ cleanup: return ret; } +/* Returns true if a compression program is available in PATH */ +static bool qemudCompressProgramAvailable(enum qemud_save_formats compress) +{ + const char *prog; + char *c; + + if (compress == QEMUD_SAVE_FORMAT_RAW) + return true; + prog = qemudSaveCompressionTypeToString(compress); + c = virFindFileInPath(prog); + if (!c) + return false; + VIR_FREE(c); + return true; +} + static int qemudDomainSave(virDomainPtr dom, const char *path) { struct qemud_driver *driver = dom->conn->privateData; @@ -5761,6 +5777,12 @@ static int qemudDomainSave(virDomainPtr dom, const char *path) "in configuration file")); return -1; } + if (!qemudCompressProgramAvailable(compressed)) { + qemuReportError(VIR_ERR_OPERATION_FAILED, + "%s", _("Compression program for image format " + "in configuration file isn't available")); + return -1; + } } vm = virDomainFindByUUID(&driver->domains, dom->uuid); @@ -5924,6 +5946,12 @@ static int qemudDomainCoreDump(virDomainPtr dom, "configuration file")); return -1; } + if (!qemudCompressProgramAvailable(compress)) { + qemuReportError(VIR_ERR_OPERATION_FAILED, + "%s", _("Compression program for dump image format " + "in configuration file isn't available")); + return -1; + } } qemuDriverLock(driver); -- 2.39.5