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:
Jiri Denemark 2011-03-09 21:24:04 +01:00
parent 3b8bf4a3a9
commit 266265a560
6 changed files with 91 additions and 38 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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