qemuDomainObjPrivatePtr priv;
char *tmp = NULL;
int tmp_fd = -1;
+ size_t i;
+ const char *videoAlias = NULL;
char *ret = NULL;
bool unlink_tmp = false;
virQEMUDriverConfigPtr cfg = NULL;
if (virDomainObjCheckActive(vm) < 0)
goto endjob;
- /* Well, even if qemu allows multiple graphic cards, heads, whatever,
- * screenshot command does not */
- if (screen) {
- virReportError(VIR_ERR_INVALID_ARG,
- "%s", _("currently is supported only taking "
- "screenshots of screen ID 0"));
+ if (!vm->def->nvideos) {
+ virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+ _("no screens to take screenshot from"));
goto endjob;
}
+ if (screen) {
+ if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SCREENDUMP_DEVICE)) {
+ virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
+ _("qemu does not allow specifying screen ID"));
+ goto endjob;
+ }
+
+ for (i = 0; i < vm->def->nvideos; i++) {
+ const virDomainVideoDef *video = vm->def->videos[i];
+
+ if (screen < video->heads) {
+ videoAlias = video->info.alias;
+ break;
+ }
+
+ screen -= video->heads;
+ }
+
+ if (i == vm->def->nvideos) {
+ virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+ _("no such screen ID"));
+ goto endjob;
+ }
+ }
+
if (virAsprintf(&tmp, "%s/qemu.screendump.XXXXXX", cfg->cacheDir) < 0)
goto endjob;
qemuSecuritySetSavedStateLabel(driver->securityManager, vm->def, tmp);
qemuDomainObjEnterMonitor(driver, vm);
- if (qemuMonitorScreendump(priv->mon, tmp) < 0) {
+ if (qemuMonitorScreendump(priv->mon, videoAlias, screen, tmp) < 0) {
ignore_value(qemuDomainObjExitMonitor(driver, vm));
goto endjob;
}
int
qemuMonitorScreendump(qemuMonitorPtr mon,
+ const char *device,
+ unsigned int head,
const char *file)
{
VIR_DEBUG("file=%s", file);
QEMU_CHECK_MONITOR(mon);
if (mon->json)
- return qemuMonitorJSONScreendump(mon, file);
+ return qemuMonitorJSONScreendump(mon, device, head, file);
else
return qemuMonitorTextScreendump(mon, file);
}
VIR_DOMAIN_BLOCK_REBASE_SHALLOW | VIR_DOMAIN_BLOCK_REBASE_REUSE_EXT)
GEN_TEST_FUNC(qemuMonitorJSONBlockCommit, "vdb", "/foo/bar1", "/foo/bar2", NULL, 1024)
GEN_TEST_FUNC(qemuMonitorJSONDrivePivot, "vdb")
-GEN_TEST_FUNC(qemuMonitorJSONScreendump, "/foo/bar")
+GEN_TEST_FUNC(qemuMonitorJSONScreendump, NULL, 0, "/foo/bar")
GEN_TEST_FUNC(qemuMonitorJSONOpenGraphics, "spice", "spicefd", false)
GEN_TEST_FUNC(qemuMonitorJSONNBDServerStart, "localhost", 12345, "test-alias")
GEN_TEST_FUNC(qemuMonitorJSONNBDServerAdd, "vda", true)