1
0
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:
Michal Privoznik 2018-05-17 13:53:34 +02:00
parent 04dcc6e0e0
commit 9a33776715
6 changed files with 43 additions and 9 deletions

View File

@ -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;
}

View File

@ -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);
}

View 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,

View File

@ -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)

View File

@ -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,

View File

@ -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)