mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 17:34:18 +03:00
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: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
04dcc6e0e0
commit
9a33776715
@ -3999,6 +3999,8 @@ qemuDomainScreenshot(virDomainPtr dom,
|
||||
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;
|
||||
@ -4020,15 +4022,37 @@ qemuDomainScreenshot(virDomainPtr dom,
|
||||
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;
|
||||
|
||||
@ -4041,7 +4065,7 @@ qemuDomainScreenshot(virDomainPtr dom,
|
||||
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;
|
||||
}
|
||||
|
@ -3477,6 +3477,8 @@ qemuMonitorSendKey(qemuMonitorPtr mon,
|
||||
|
||||
int
|
||||
qemuMonitorScreendump(qemuMonitorPtr mon,
|
||||
const char *device,
|
||||
unsigned int head,
|
||||
const char *file)
|
||||
{
|
||||
VIR_DEBUG("file=%s", file);
|
||||
@ -3484,7 +3486,7 @@ qemuMonitorScreendump(qemuMonitorPtr mon,
|
||||
QEMU_CHECK_MONITOR(mon);
|
||||
|
||||
if (mon->json)
|
||||
return qemuMonitorJSONScreendump(mon, file);
|
||||
return qemuMonitorJSONScreendump(mon, device, head, file);
|
||||
else
|
||||
return qemuMonitorTextScreendump(mon, file);
|
||||
}
|
||||
|
@ -886,6 +886,8 @@ int qemuMonitorArbitraryCommand(qemuMonitorPtr mon,
|
||||
int qemuMonitorInjectNMI(qemuMonitorPtr mon);
|
||||
|
||||
int qemuMonitorScreendump(qemuMonitorPtr mon,
|
||||
const char *device,
|
||||
unsigned int head,
|
||||
const char *file);
|
||||
|
||||
int qemuMonitorSendKey(qemuMonitorPtr mon,
|
||||
|
@ -4483,6 +4483,8 @@ int qemuMonitorJSONSendKey(qemuMonitorPtr mon,
|
||||
}
|
||||
|
||||
int qemuMonitorJSONScreendump(qemuMonitorPtr mon,
|
||||
const char *device,
|
||||
unsigned int head,
|
||||
const char *file)
|
||||
{
|
||||
int ret = -1;
|
||||
@ -4490,6 +4492,8 @@ int qemuMonitorJSONScreendump(qemuMonitorPtr mon,
|
||||
|
||||
cmd = qemuMonitorJSONMakeCommand("screendump",
|
||||
"s:filename", file,
|
||||
"S:device", device,
|
||||
"p:head", head,
|
||||
NULL);
|
||||
|
||||
if (!cmd)
|
||||
|
@ -296,6 +296,8 @@ int qemuMonitorJSONSendKey(qemuMonitorPtr mon,
|
||||
unsigned int nkeycodes);
|
||||
|
||||
int qemuMonitorJSONScreendump(qemuMonitorPtr mon,
|
||||
const char *device,
|
||||
unsigned int head,
|
||||
const char *file);
|
||||
|
||||
int qemuMonitorJSONBlockStream(qemuMonitorPtr mon,
|
||||
|
@ -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)
|
||||
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)
|
||||
|
Loading…
Reference in New Issue
Block a user