mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
qemu_capabilities: Introduce virQEMUCapsInitQMPMonitor
This basically covers the talking-to-monitor part of virQEMUCapsInitQMP. The patch itself has no real value, but it creates an entity to be tested in the next patches. Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
a72940f954
commit
64f1e1688d
@ -2493,6 +2493,85 @@ cleanup:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
virQEMUCapsInitQMPMonitor(virQEMUCapsPtr qemuCaps,
|
||||||
|
qemuMonitorPtr mon)
|
||||||
|
{
|
||||||
|
int ret = -1;
|
||||||
|
int major, minor, micro;
|
||||||
|
char *package = NULL;
|
||||||
|
|
||||||
|
/* @mon is supposed to be locked by callee */
|
||||||
|
|
||||||
|
if (qemuMonitorSetCapabilities(mon) < 0) {
|
||||||
|
virErrorPtr err = virGetLastError();
|
||||||
|
VIR_DEBUG("Failed to set monitor capabilities %s",
|
||||||
|
err ? err->message : "<unknown problem>");
|
||||||
|
ret = 0;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (qemuMonitorGetVersion(mon,
|
||||||
|
&major, &minor, µ,
|
||||||
|
&package) < 0) {
|
||||||
|
virErrorPtr err = virGetLastError();
|
||||||
|
VIR_DEBUG("Failed to query monitor version %s",
|
||||||
|
err ? err->message : "<unknown problem>");
|
||||||
|
ret = 0;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
VIR_DEBUG("Got version %d.%d.%d (%s)",
|
||||||
|
major, minor, micro, NULLSTR(package));
|
||||||
|
|
||||||
|
if (major < 1 || (major == 1 && minor < 2)) {
|
||||||
|
VIR_DEBUG("Not new enough for QMP capabilities detection");
|
||||||
|
ret = 0;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
qemuCaps->version = major * 1000000 + minor * 1000 + micro;
|
||||||
|
qemuCaps->usedQMP = true;
|
||||||
|
|
||||||
|
virQEMUCapsInitQMPBasic(qemuCaps);
|
||||||
|
|
||||||
|
if (virQEMUCapsInitArchQMPBasic(qemuCaps, mon) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
/* USB option is supported v1.3.0 onwards */
|
||||||
|
if (qemuCaps->version >= 1003000)
|
||||||
|
virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACHINE_USB_OPT);
|
||||||
|
|
||||||
|
/* WebSockets were introduced between 1.3.0 and 1.3.1 */
|
||||||
|
if (qemuCaps->version >= 1003001)
|
||||||
|
virQEMUCapsSet(qemuCaps, QEMU_CAPS_VNC_WEBSOCKET);
|
||||||
|
|
||||||
|
if (qemuCaps->version >= 1006000)
|
||||||
|
virQEMUCapsSet(qemuCaps, QEMU_CAPS_DEVICE_VIDEO_PRIMARY);
|
||||||
|
|
||||||
|
if (virQEMUCapsProbeQMPCommands(qemuCaps, mon) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
if (virQEMUCapsProbeQMPEvents(qemuCaps, mon) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
if (virQEMUCapsProbeQMPObjects(qemuCaps, mon) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
if (virQEMUCapsProbeQMPMachineTypes(qemuCaps, mon) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
if (virQEMUCapsProbeQMPCPUDefinitions(qemuCaps, mon) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
if (virQEMUCapsProbeQMPKVMState(qemuCaps, mon) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
if (virQEMUCapsProbeQMPTPM(qemuCaps, mon) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
if (virQEMUCapsProbeQMPCommandLine(qemuCaps, mon) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
cleanup:
|
||||||
|
VIR_FREE(package);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
virQEMUCapsInitQMP(virQEMUCapsPtr qemuCaps,
|
virQEMUCapsInitQMP(virQEMUCapsPtr qemuCaps,
|
||||||
const char *libDir,
|
const char *libDir,
|
||||||
@ -2502,8 +2581,6 @@ virQEMUCapsInitQMP(virQEMUCapsPtr qemuCaps,
|
|||||||
int ret = -1;
|
int ret = -1;
|
||||||
virCommandPtr cmd = NULL;
|
virCommandPtr cmd = NULL;
|
||||||
qemuMonitorPtr mon = NULL;
|
qemuMonitorPtr mon = NULL;
|
||||||
int major, minor, micro;
|
|
||||||
char *package = NULL;
|
|
||||||
int status = 0;
|
int status = 0;
|
||||||
virDomainChrSourceDef config;
|
virDomainChrSourceDef config;
|
||||||
char *monarg = NULL;
|
char *monarg = NULL;
|
||||||
@ -2583,67 +2660,7 @@ virQEMUCapsInitQMP(virQEMUCapsPtr qemuCaps,
|
|||||||
|
|
||||||
virObjectLock(mon);
|
virObjectLock(mon);
|
||||||
|
|
||||||
if (qemuMonitorSetCapabilities(mon) < 0) {
|
if (virQEMUCapsInitQMPMonitor(qemuCaps, mon) < 0)
|
||||||
virErrorPtr err = virGetLastError();
|
|
||||||
VIR_DEBUG("Failed to set monitor capabilities %s",
|
|
||||||
err ? err->message : "<unknown problem>");
|
|
||||||
ret = 0;
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (qemuMonitorGetVersion(mon,
|
|
||||||
&major, &minor, µ,
|
|
||||||
&package) < 0) {
|
|
||||||
virErrorPtr err = virGetLastError();
|
|
||||||
VIR_DEBUG("Failed to query monitor version %s",
|
|
||||||
err ? err->message : "<unknown problem>");
|
|
||||||
ret = 0;
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
VIR_DEBUG("Got version %d.%d.%d (%s)",
|
|
||||||
major, minor, micro, NULLSTR(package));
|
|
||||||
|
|
||||||
if (major < 1 || (major == 1 && minor < 2)) {
|
|
||||||
VIR_DEBUG("Not new enough for QMP capabilities detection");
|
|
||||||
ret = 0;
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
qemuCaps->version = major * 1000000 + minor * 1000 + micro;
|
|
||||||
qemuCaps->usedQMP = true;
|
|
||||||
|
|
||||||
virQEMUCapsInitQMPBasic(qemuCaps);
|
|
||||||
|
|
||||||
if (virQEMUCapsInitArchQMPBasic(qemuCaps, mon) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
/* USB option is supported v1.3.0 onwards */
|
|
||||||
if (qemuCaps->version >= 1003000)
|
|
||||||
virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACHINE_USB_OPT);
|
|
||||||
|
|
||||||
/* WebSockets were introduced between 1.3.0 and 1.3.1 */
|
|
||||||
if (qemuCaps->version >= 1003001)
|
|
||||||
virQEMUCapsSet(qemuCaps, QEMU_CAPS_VNC_WEBSOCKET);
|
|
||||||
|
|
||||||
if (qemuCaps->version >= 1006000)
|
|
||||||
virQEMUCapsSet(qemuCaps, QEMU_CAPS_DEVICE_VIDEO_PRIMARY);
|
|
||||||
|
|
||||||
if (virQEMUCapsProbeQMPCommands(qemuCaps, mon) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
if (virQEMUCapsProbeQMPEvents(qemuCaps, mon) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
if (virQEMUCapsProbeQMPObjects(qemuCaps, mon) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
if (virQEMUCapsProbeQMPMachineTypes(qemuCaps, mon) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
if (virQEMUCapsProbeQMPCPUDefinitions(qemuCaps, mon) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
if (virQEMUCapsProbeQMPKVMState(qemuCaps, mon) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
if (virQEMUCapsProbeQMPTPM(qemuCaps, mon) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
if (virQEMUCapsProbeQMPCommandLine(qemuCaps, mon) < 0)
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
@ -2656,7 +2673,6 @@ cleanup:
|
|||||||
virCommandFree(cmd);
|
virCommandFree(cmd);
|
||||||
VIR_FREE(monarg);
|
VIR_FREE(monarg);
|
||||||
VIR_FREE(monpath);
|
VIR_FREE(monpath);
|
||||||
VIR_FREE(package);
|
|
||||||
|
|
||||||
if (pid != 0) {
|
if (pid != 0) {
|
||||||
char ebuf[1024];
|
char ebuf[1024];
|
||||||
|
@ -214,6 +214,9 @@ virQEMUCapsPtr virQEMUCapsNewForBinary(const char *binary,
|
|||||||
uid_t runUid,
|
uid_t runUid,
|
||||||
gid_t runGid);
|
gid_t runGid);
|
||||||
|
|
||||||
|
int virQEMUCapsInitQMPMonitor(virQEMUCapsPtr qemuCaps,
|
||||||
|
qemuMonitorPtr mon);
|
||||||
|
|
||||||
int virQEMUCapsProbeQMP(virQEMUCapsPtr qemuCaps,
|
int virQEMUCapsProbeQMP(virQEMUCapsPtr qemuCaps,
|
||||||
qemuMonitorPtr mon);
|
qemuMonitorPtr mon);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user