mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-25 01:34:11 +03:00
qemu: Setup infrastructure for HMP passthrough
JSON monitor command implementation can now just directly call text monitor implementation and it will be automatically encapsulated into QMP's human-monitor-command.
This commit is contained in:
parent
3b8bf4a3a9
commit
266265a560
@ -742,6 +742,18 @@ cleanup:
|
||||
}
|
||||
|
||||
|
||||
int qemuMonitorCommandWithFd(qemuMonitorPtr mon,
|
||||
const char *cmd,
|
||||
int scm_fd,
|
||||
char **reply)
|
||||
{
|
||||
if (mon->json)
|
||||
return qemuMonitorJSONHumanCommandWithFd(mon, cmd, scm_fd, reply);
|
||||
else
|
||||
return qemuMonitorTextCommandWithFd(mon, cmd, scm_fd, reply);
|
||||
}
|
||||
|
||||
|
||||
int qemuMonitorGetDiskSecret(qemuMonitorPtr mon,
|
||||
virConnectPtr conn,
|
||||
const char *path,
|
||||
|
@ -133,9 +133,15 @@ void qemuMonitorUnlock(qemuMonitorPtr mon);
|
||||
int qemuMonitorRef(qemuMonitorPtr mon);
|
||||
int qemuMonitorUnref(qemuMonitorPtr mon);
|
||||
|
||||
/* This API is for use by the internal Text/JSON monitor impl code only */
|
||||
/* These APIs are for use by the internal Text/JSON monitor impl code only */
|
||||
int qemuMonitorSend(qemuMonitorPtr mon,
|
||||
qemuMonitorMessagePtr msg);
|
||||
int qemuMonitorCommandWithFd(qemuMonitorPtr mon,
|
||||
const char *cmd,
|
||||
int scm_fd,
|
||||
char **reply);
|
||||
# define qemuMonitorCommand(mon, cmd, reply) \
|
||||
qemuMonitorCommandWithFd(mon, cmd, -1, reply)
|
||||
|
||||
/* XXX same comment about virConnectPtr as above */
|
||||
int qemuMonitorGetDiskSecret(qemuMonitorPtr mon,
|
||||
|
@ -675,6 +675,56 @@ static void qemuMonitorJSONHandleVNCDisconnect(qemuMonitorPtr mon, virJSONValueP
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
qemuMonitorJSONHumanCommandWithFd(qemuMonitorPtr mon,
|
||||
const char *cmd_str,
|
||||
int scm_fd,
|
||||
char **reply_str)
|
||||
{
|
||||
virJSONValuePtr cmd = NULL;
|
||||
virJSONValuePtr reply = NULL;
|
||||
virJSONValuePtr obj;
|
||||
int ret = -1;
|
||||
|
||||
cmd = qemuMonitorJSONMakeCommand("human-monitor-command",
|
||||
"s:command-line", cmd_str,
|
||||
NULL);
|
||||
|
||||
if (!cmd || qemuMonitorJSONCommandWithFd(mon, cmd, scm_fd, &reply) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (qemuMonitorJSONCheckError(cmd, reply))
|
||||
goto cleanup;
|
||||
|
||||
if (!(obj = virJSONValueObjectGet(reply, "return"))) {
|
||||
qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
_("human monitor command was missing return data"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (reply_str) {
|
||||
const char *data;
|
||||
|
||||
if ((data = virJSONValueGetString(obj)))
|
||||
*reply_str = strdup(data);
|
||||
else
|
||||
*reply_str = strdup("");
|
||||
|
||||
if (!*reply_str) {
|
||||
virReportOOMError();
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
virJSONValueFree(cmd);
|
||||
virJSONValueFree(reply);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
qemuMonitorJSONSetCapabilities(qemuMonitorPtr mon)
|
||||
{
|
||||
@ -2464,36 +2514,17 @@ int qemuMonitorJSONArbitraryCommand(qemuMonitorPtr mon,
|
||||
virJSONValuePtr reply = NULL;
|
||||
int ret = -1;
|
||||
|
||||
if (!hmp) {
|
||||
cmd = virJSONValueFromString(cmd_str);
|
||||
if (hmp) {
|
||||
return qemuMonitorJSONHumanCommandWithFd(mon, cmd_str, -1, reply_str);
|
||||
} else {
|
||||
cmd = qemuMonitorJSONMakeCommand("human-monitor-command",
|
||||
"s:command-line", cmd_str,
|
||||
NULL);
|
||||
}
|
||||
if (!(cmd = virJSONValueFromString(cmd_str)))
|
||||
goto cleanup;
|
||||
|
||||
if (!cmd)
|
||||
return -1;
|
||||
if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (!hmp) {
|
||||
if (!(*reply_str = virJSONValueToString(reply)))
|
||||
goto cleanup;
|
||||
} else if (qemuMonitorJSONCheckError(cmd, reply)) {
|
||||
goto cleanup;
|
||||
} else {
|
||||
const char *data;
|
||||
if (!(data = virJSONValueObjectGetString(reply, "return"))) {
|
||||
qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
_("human monitor command was missing return data"));
|
||||
goto cleanup;
|
||||
}
|
||||
if (!(*reply_str = strdup(data))) {
|
||||
virReportOOMError();
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
|
@ -34,6 +34,11 @@ int qemuMonitorJSONIOProcess(qemuMonitorPtr mon,
|
||||
size_t len,
|
||||
qemuMonitorMessagePtr msg);
|
||||
|
||||
int qemuMonitorJSONHumanCommandWithFd(qemuMonitorPtr mon,
|
||||
const char *cmd,
|
||||
int scm_fd,
|
||||
char **reply);
|
||||
|
||||
int qemuMonitorJSONSetCapabilities(qemuMonitorPtr mon);
|
||||
|
||||
int qemuMonitorJSONStartCPUs(qemuMonitorPtr mon,
|
||||
|
@ -259,21 +259,15 @@ qemuMonitorCommandWithHandler(qemuMonitorPtr mon,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
qemuMonitorCommandWithFd(qemuMonitorPtr mon,
|
||||
const char *cmd,
|
||||
int scm_fd,
|
||||
char **reply) {
|
||||
int
|
||||
qemuMonitorTextCommandWithFd(qemuMonitorPtr mon,
|
||||
const char *cmd,
|
||||
int scm_fd,
|
||||
char **reply)
|
||||
{
|
||||
return qemuMonitorCommandWithHandler(mon, cmd, NULL, NULL, scm_fd, reply);
|
||||
}
|
||||
|
||||
static int
|
||||
qemuMonitorCommand(qemuMonitorPtr mon,
|
||||
const char *cmd,
|
||||
char **reply) {
|
||||
return qemuMonitorCommandWithFd(mon, cmd, -1, reply);
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
qemuMonitorSendDiskPassphrase(qemuMonitorPtr mon,
|
||||
|
@ -35,6 +35,11 @@ int qemuMonitorTextIOProcess(qemuMonitorPtr mon,
|
||||
size_t len,
|
||||
qemuMonitorMessagePtr msg);
|
||||
|
||||
int qemuMonitorTextCommandWithFd(qemuMonitorPtr mon,
|
||||
const char *cmd,
|
||||
int scm_fd,
|
||||
char **reply);
|
||||
|
||||
int qemuMonitorTextStartCPUs(qemuMonitorPtr mon,
|
||||
virConnectPtr conn);
|
||||
int qemuMonitorTextStopCPUs(qemuMonitorPtr mon);
|
||||
|
Loading…
Reference in New Issue
Block a user