[libvirt] [PATCH v4 7/8] qemu: Implement the driver methods
Daniel P. Berrange
berrange at redhat.com
Fri May 13 09:19:27 UTC 2011
On Thu, May 12, 2011 at 06:29:14PM +0200, Michal Privoznik wrote:
> * src/qemu/qemu_driver.c: new qemuDomainScreenshot() function
> * src/qemu/qemu_monitor.c, src/qemu/qemu_monitor.h,
> src/qemu/qemu_monitor_json.c, src/qemu/qemu_monitor_json.h,
> src/qemu/qemu_monitor_text.c, src/qemu/qemu_monitor_text.h:
> Monitor command
> ---
> src/qemu/qemu_driver.c | 90 +++++++++++++++++++++++++++++++++++++++++-
> src/qemu/qemu_monitor.c | 20 +++++++++
> src/qemu/qemu_monitor.h | 3 +
> src/qemu/qemu_monitor_json.c | 23 +++++++++++
> src/qemu/qemu_monitor_json.h | 5 ++
> src/qemu/qemu_monitor_text.c | 31 ++++++++++++++
> src/qemu/qemu_monitor_text.h | 3 +
> 7 files changed, 174 insertions(+), 1 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 482f177..c0cd407 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -2486,6 +2486,94 @@ cleanup:
> return ret;
> }
>
> +static char *
> +qemuDomainScreenshot(virDomainPtr dom,
> + virStreamPtr st,
> + unsigned int screen,
> + unsigned int flags ATTRIBUTE_UNUSED)
> +{
> + struct qemud_driver *driver = dom->conn->privateData;
> + virDomainObjPtr vm;
> + qemuDomainObjPrivatePtr priv;
> + char *tmp = NULL;
> + int tmp_fd = -1;
> + char *ret = NULL;
> +
> + qemuDriverLock(driver);
> + vm = virDomainFindByUUID(&driver->domains, dom->uuid);
> + qemuDriverUnlock(driver);
> +
> + if (!vm) {
> + char uuidstr[VIR_UUID_STRING_BUFLEN];
> + virUUIDFormat(dom->uuid, uuidstr);
> + qemuReportError(VIR_ERR_NO_DOMAIN,
> + _("no domain matching uuid '%s'"), uuidstr);
> + goto cleanup;
> + }
> +
> + priv = vm->privateData;
> +
> + if (qemuDomainObjBeginJob(vm) < 0)
> + goto cleanup;
> +
> + if (!virDomainObjIsActive(vm)) {
> + qemuReportError(VIR_ERR_OPERATION_INVALID,
> + "%s", _("domain is not running"));
> + goto endjob;
> + }
> +
> + /* Well, even if qemu allows multiple graphic cards, heads, whatever,
> + * screenshot command does not */
> + if (screen) {
> + qemuReportError(VIR_ERR_INVALID_ARG,
> + "%s", _("currently is supported only taking "
> + "screenshots of screen ID 0"));
> + goto endjob;
> + }
> +
> + if (virAsprintf(&tmp, "%s/qemu.screendump.XXXXXX", driver->cacheDir) < 0) {
> + virReportOOMError();
> + goto endjob;
> + }
> +
> + if ((tmp_fd = mkstemp(tmp)) == -1) {
> + virReportSystemError(errno, _("mkstemp(\"%s\") failed"), tmp);
> + goto endjob;
> + }
> +
> + qemuDomainObjEnterMonitor(vm);
> + if (qemuMonitorScreendump(priv->mon, tmp) < 0) {
> + qemuDomainObjExitMonitor(vm);
> + goto endjob;
> + }
> + qemuDomainObjExitMonitor(vm);
> +
> + if (VIR_CLOSE(tmp_fd) < 0) {
> + virReportSystemError(errno, _("unable to close %s"), tmp);
> + goto endjob;
> + }
> +
> + if (virFDStreamOpenFile(st, tmp, 0, 0, O_RDONLY, true) < 0) {
> + qemuReportError(VIR_ERR_OPERATION_FAILED, "%s",
> + _("unable to open stream"));
> + goto endjob;
> + }
> +
> + ret = strdup("image/x-portable-pixmap; charset=binary");
I don't think we need the '; charset=binary' bit - just use
the mimetype on its own.
ACK if that change is made
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list