mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-11 15:27:47 +00:00
qemu: Detect support for HMP passthrough
This commit is contained in:
parent
3415eeb53e
commit
abdfca09f5
@ -72,6 +72,7 @@ struct _qemuMonitor {
|
||||
int lastErrno;
|
||||
|
||||
unsigned json: 1;
|
||||
unsigned json_hmp: 1;
|
||||
};
|
||||
|
||||
|
||||
@ -924,14 +925,31 @@ int qemuMonitorSetCapabilities(qemuMonitorPtr mon)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (mon->json)
|
||||
if (mon->json) {
|
||||
ret = qemuMonitorJSONSetCapabilities(mon);
|
||||
else
|
||||
mon->json_hmp = qemuMonitorJSONCheckHMP(mon);
|
||||
} else {
|
||||
ret = 0;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
qemuMonitorCheckHMP(qemuMonitorPtr mon, const char *cmd)
|
||||
{
|
||||
if (!mon->json || mon->json_hmp)
|
||||
return 1;
|
||||
|
||||
if (cmd) {
|
||||
VIR_DEBUG("HMP passthrough not supported by qemu process;"
|
||||
" not trying HMP for command %s", cmd);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
qemuMonitorStartCPUs(qemuMonitorPtr mon,
|
||||
virConnectPtr conn)
|
||||
|
@ -127,6 +127,8 @@ void qemuMonitorClose(qemuMonitorPtr mon);
|
||||
|
||||
int qemuMonitorSetCapabilities(qemuMonitorPtr mon);
|
||||
|
||||
int qemuMonitorCheckHMP(qemuMonitorPtr mon, const char *cmd);
|
||||
|
||||
void qemuMonitorLock(qemuMonitorPtr mon);
|
||||
void qemuMonitorUnlock(qemuMonitorPtr mon);
|
||||
|
||||
|
@ -746,6 +746,48 @@ qemuMonitorJSONSetCapabilities(qemuMonitorPtr mon)
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
qemuMonitorJSONCheckHMP(qemuMonitorPtr mon)
|
||||
{
|
||||
int ret = 0;
|
||||
virJSONValuePtr cmd = qemuMonitorJSONMakeCommand("query-commands", NULL);
|
||||
virJSONValuePtr reply = NULL;
|
||||
virJSONValuePtr data;
|
||||
int i, n;
|
||||
|
||||
if (!cmd)
|
||||
return ret;
|
||||
|
||||
if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0 ||
|
||||
qemuMonitorJSONCheckError(cmd, reply) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (!(data = virJSONValueObjectGet(reply, "return")) ||
|
||||
data->type != VIR_JSON_TYPE_ARRAY ||
|
||||
(n = virJSONValueArraySize(data)) <= 0)
|
||||
goto cleanup;
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
virJSONValuePtr entry;
|
||||
const char *name;
|
||||
|
||||
if (!(entry = virJSONValueArrayGet(data, i)) ||
|
||||
!(name = virJSONValueObjectGetString(entry, "name")))
|
||||
goto cleanup;
|
||||
|
||||
if (STREQ(name, "human-monitor-command")) {
|
||||
ret = 1;
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
cleanup:
|
||||
virJSONValueFree(cmd);
|
||||
virJSONValueFree(reply);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
qemuMonitorJSONStartCPUs(qemuMonitorPtr mon,
|
||||
virConnectPtr conn ATTRIBUTE_UNUSED)
|
||||
|
@ -41,6 +41,8 @@ int qemuMonitorJSONHumanCommandWithFd(qemuMonitorPtr mon,
|
||||
|
||||
int qemuMonitorJSONSetCapabilities(qemuMonitorPtr mon);
|
||||
|
||||
int qemuMonitorJSONCheckHMP(qemuMonitorPtr mon);
|
||||
|
||||
int qemuMonitorJSONStartCPUs(qemuMonitorPtr mon,
|
||||
virConnectPtr conn);
|
||||
int qemuMonitorJSONStopCPUs(qemuMonitorPtr mon);
|
||||
|
Loading…
Reference in New Issue
Block a user