On Thu, Aug 23, 2012 at 12:29:24PM +0900, MATSUDA Daiki wrote: > > Signed-off-by: MATSUDA Daiki <matsudadik@xxxxxxxxxxxxxxxxx> > --- > src/qemu/qemu_driver.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 71 insertions(+), 0 deletions(-) > > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c > index 109d18d..a62d1bb 100644 > --- a/src/qemu/qemu_driver.c > +++ b/src/qemu/qemu_driver.c > @@ -13437,6 +13437,76 @@ qemuListAllDomains(virConnectPtr conn, > return ret; > } > > +static char * > +qemuDrvDomainAgentCommand(virDomainPtr domain, > + const char *cmd, > + int timeout, > + unsigned int flags) > +{ > + struct qemud_driver *driver = domain->conn->privateData; > + virDomainObjPtr vm; > + int ret = -1; > + char *result = NULL; > + qemuDomainObjPrivatePtr priv; > + > + virCheckFlags(0, NULL); > + > + qemuDriverLock(driver); > + vm = virDomainFindByUUID(&driver->domains, domain->uuid); > + qemuDriverUnlock(driver); > + > + if (!vm) { > + char uuidstr[VIR_UUID_STRING_BUFLEN]; > + virUUIDFormat(domain->uuid, uuidstr); > + virReportError(VIR_ERR_NO_DOMAIN, > + _("no domain with matching uuid '%s'"), uuidstr); > + goto cleanup; > + } > + > + priv = vm->privateData; > + > + if (!virDomainObjIsActive(vm)) { > + virReportError(VIR_ERR_OPERATION_INVALID, > + "%s", _("domain is not running")); > + goto cleanup; > + } > + > + if (priv->agentError) { > + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", > + _("QEMU guest agent is not available due to an error")); > + goto cleanup; > + } > + > + if (!priv->agent) { > + virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s", > + _("QEMU guest agent is not configured")); > + goto cleanup; > + } > + > + if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0) > + goto cleanup; > + > + if (!virDomainObjIsActive(vm)) { > + virReportError(VIR_ERR_OPERATION_INVALID, > + "%s", _("domain is not running")); > + goto endjob; > + } > + > + qemuDomainObjEnterAgent(driver, vm); > + ret = qemuAgentArbitraryCommand(priv->agent, cmd, &result, timeout); > + qemuDomainObjExitAgent(driver, vm); The problem here is that ret is not looked at. I think that part really need to be improved especially as the possibility to run any command is far more likely to fail, a better error report is needed > +endjob: > + if (qemuDomainObjEndJob(driver, vm) == 0) { > + vm = NULL; > + } > + > +cleanup: > + if (vm) > + virDomainObjUnlock(vm); > + return result; > +} > + > static virDriver qemuDriver = { > .no = VIR_DRV_QEMU, > .name = QEMU_DRIVER_NAME, > @@ -13603,6 +13673,7 @@ static virDriver qemuDriver = { > .domainPMSuspendForDuration = qemuDomainPMSuspendForDuration, /* 0.9.11 */ > .domainPMWakeup = qemuDomainPMWakeup, /* 0.9.11 */ > .domainGetCPUStats = qemuDomainGetCPUStats, /* 0.9.11 */ > + .qemuDomainArbitraryAgentCommand = qemuDrvDomainAgentCommand, /* 0.10.1 */ > }; I squashed that in the meantime but something better need to be done here, report the domain name and command and if possible an error message sounds a minimum. Daniel diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index fc5fa52..3948bef 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -13857,6 +13857,11 @@ qemuDrvDomainAgentCommand(virDomainPtr domain, qemuDomainObjEnterAgent(driver, vm); ret = qemuAgentArbitraryCommand(priv->agent, cmd, &result, timeout); qemuDomainObjExitAgent(driver, vm); + if (ret < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Failed to execute agent command")); + goto endjob; + } endjob: if (qemuDomainObjEndJob(driver, vm) == 0) { -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@xxxxxxxxxxxx | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/ -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list