提交 9a337767 编写于 作者: M Michal Privoznik

qemu: Implement multiple screen support for virDomainScreenshot

According to virDomainScreenshot() documentation, screens are
numbered sequentially.  e.g. having two graphics cards, both with
four heads, screen ID 5 addresses the second head on the second
card.

But apart from that, there's nothing special happening here.
Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
上级 04dcc6e0
...@@ -3999,6 +3999,8 @@ qemuDomainScreenshot(virDomainPtr dom, ...@@ -3999,6 +3999,8 @@ qemuDomainScreenshot(virDomainPtr dom,
qemuDomainObjPrivatePtr priv; qemuDomainObjPrivatePtr priv;
char *tmp = NULL; char *tmp = NULL;
int tmp_fd = -1; int tmp_fd = -1;
size_t i;
const char *videoAlias = NULL;
char *ret = NULL; char *ret = NULL;
bool unlink_tmp = false; bool unlink_tmp = false;
virQEMUDriverConfigPtr cfg = NULL; virQEMUDriverConfigPtr cfg = NULL;
...@@ -4020,15 +4022,37 @@ qemuDomainScreenshot(virDomainPtr dom, ...@@ -4020,15 +4022,37 @@ qemuDomainScreenshot(virDomainPtr dom,
if (virDomainObjCheckActive(vm) < 0) if (virDomainObjCheckActive(vm) < 0)
goto endjob; goto endjob;
/* Well, even if qemu allows multiple graphic cards, heads, whatever, if (!vm->def->nvideos) {
* screenshot command does not */ virReportError(VIR_ERR_OPERATION_INVALID, "%s",
if (screen) { _("no screens to take screenshot from"));
virReportError(VIR_ERR_INVALID_ARG,
"%s", _("currently is supported only taking "
"screenshots of screen ID 0"));
goto endjob; 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) if (virAsprintf(&tmp, "%s/qemu.screendump.XXXXXX", cfg->cacheDir) < 0)
goto endjob; goto endjob;
...@@ -4041,7 +4065,7 @@ qemuDomainScreenshot(virDomainPtr dom, ...@@ -4041,7 +4065,7 @@ qemuDomainScreenshot(virDomainPtr dom,
qemuSecuritySetSavedStateLabel(driver->securityManager, vm->def, tmp); qemuSecuritySetSavedStateLabel(driver->securityManager, vm->def, tmp);
qemuDomainObjEnterMonitor(driver, vm); qemuDomainObjEnterMonitor(driver, vm);
if (qemuMonitorScreendump(priv->mon, tmp) < 0) { if (qemuMonitorScreendump(priv->mon, videoAlias, screen, tmp) < 0) {
ignore_value(qemuDomainObjExitMonitor(driver, vm)); ignore_value(qemuDomainObjExitMonitor(driver, vm));
goto endjob; goto endjob;
} }
......
...@@ -3477,6 +3477,8 @@ qemuMonitorSendKey(qemuMonitorPtr mon, ...@@ -3477,6 +3477,8 @@ qemuMonitorSendKey(qemuMonitorPtr mon,
int int
qemuMonitorScreendump(qemuMonitorPtr mon, qemuMonitorScreendump(qemuMonitorPtr mon,
const char *device,
unsigned int head,
const char *file) const char *file)
{ {
VIR_DEBUG("file=%s", file); VIR_DEBUG("file=%s", file);
...@@ -3484,7 +3486,7 @@ qemuMonitorScreendump(qemuMonitorPtr mon, ...@@ -3484,7 +3486,7 @@ qemuMonitorScreendump(qemuMonitorPtr mon,
QEMU_CHECK_MONITOR(mon); QEMU_CHECK_MONITOR(mon);
if (mon->json) if (mon->json)
return qemuMonitorJSONScreendump(mon, file); return qemuMonitorJSONScreendump(mon, device, head, file);
else else
return qemuMonitorTextScreendump(mon, file); return qemuMonitorTextScreendump(mon, file);
} }
......
...@@ -886,6 +886,8 @@ int qemuMonitorArbitraryCommand(qemuMonitorPtr mon, ...@@ -886,6 +886,8 @@ int qemuMonitorArbitraryCommand(qemuMonitorPtr mon,
int qemuMonitorInjectNMI(qemuMonitorPtr mon); int qemuMonitorInjectNMI(qemuMonitorPtr mon);
int qemuMonitorScreendump(qemuMonitorPtr mon, int qemuMonitorScreendump(qemuMonitorPtr mon,
const char *device,
unsigned int head,
const char *file); const char *file);
int qemuMonitorSendKey(qemuMonitorPtr mon, int qemuMonitorSendKey(qemuMonitorPtr mon,
......
...@@ -4483,6 +4483,8 @@ int qemuMonitorJSONSendKey(qemuMonitorPtr mon, ...@@ -4483,6 +4483,8 @@ int qemuMonitorJSONSendKey(qemuMonitorPtr mon,
} }
int qemuMonitorJSONScreendump(qemuMonitorPtr mon, int qemuMonitorJSONScreendump(qemuMonitorPtr mon,
const char *device,
unsigned int head,
const char *file) const char *file)
{ {
int ret = -1; int ret = -1;
...@@ -4490,6 +4492,8 @@ int qemuMonitorJSONScreendump(qemuMonitorPtr mon, ...@@ -4490,6 +4492,8 @@ int qemuMonitorJSONScreendump(qemuMonitorPtr mon,
cmd = qemuMonitorJSONMakeCommand("screendump", cmd = qemuMonitorJSONMakeCommand("screendump",
"s:filename", file, "s:filename", file,
"S:device", device,
"p:head", head,
NULL); NULL);
if (!cmd) if (!cmd)
......
...@@ -296,6 +296,8 @@ int qemuMonitorJSONSendKey(qemuMonitorPtr mon, ...@@ -296,6 +296,8 @@ int qemuMonitorJSONSendKey(qemuMonitorPtr mon,
unsigned int nkeycodes); unsigned int nkeycodes);
int qemuMonitorJSONScreendump(qemuMonitorPtr mon, int qemuMonitorJSONScreendump(qemuMonitorPtr mon,
const char *device,
unsigned int head,
const char *file); const char *file);
int qemuMonitorJSONBlockStream(qemuMonitorPtr mon, int qemuMonitorJSONBlockStream(qemuMonitorPtr mon,
......
...@@ -1348,7 +1348,7 @@ GEN_TEST_FUNC(qemuMonitorJSONDriveMirror, "vdb", "/foo/bar", NULL, 1024, 0, 0, ...@@ -1348,7 +1348,7 @@ GEN_TEST_FUNC(qemuMonitorJSONDriveMirror, "vdb", "/foo/bar", NULL, 1024, 0, 0,
VIR_DOMAIN_BLOCK_REBASE_SHALLOW | VIR_DOMAIN_BLOCK_REBASE_REUSE_EXT) 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(qemuMonitorJSONBlockCommit, "vdb", "/foo/bar1", "/foo/bar2", NULL, 1024)
GEN_TEST_FUNC(qemuMonitorJSONDrivePivot, "vdb") 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(qemuMonitorJSONOpenGraphics, "spice", "spicefd", false)
GEN_TEST_FUNC(qemuMonitorJSONNBDServerStart, "localhost", 12345, "test-alias") GEN_TEST_FUNC(qemuMonitorJSONNBDServerStart, "localhost", 12345, "test-alias")
GEN_TEST_FUNC(qemuMonitorJSONNBDServerAdd, "vda", true) GEN_TEST_FUNC(qemuMonitorJSONNBDServerAdd, "vda", true)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册