QMP: Allow 'query-' commands

The 'info' command makes sense for the user protocol, but for QMP
it doesn't, as its return data is not well defined. That is, it
can return anything.

To fix this Avi proposes having 'query-' commands when in protocol
mode. For example, 'info balloon' would become 'query-balloon'.

The right way of supporting this would probably be to move all
info handlers to qemu-monitor.hx, add a flags field to mon_cmd_t
to identify them and then modify do_info() to do its search based
on that flag.

Unfortunately, this would require a big change in the Monitor.

To make things simpler for now, this commit takes a different
approach: a check for commands starting with "query-" is added to
toplevel QMP code, if it's true we setup things so that do_info()
is called with the appropriate arguments.

This is a hack, but is a temporary one and guarantees that query-
commands will work from the first day.

Also note that 'info' is not allowed in protocol mode.

Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
Luiz Capitulino 2009-11-26 22:59:02 -02:00 committed by Anthony Liguori
parent 5fa737a479
commit 5e23f480df

View File

@ -3728,9 +3728,9 @@ static void handle_qmp_command(JSONMessageParser *parser, QList *tokens)
int err;
QObject *obj;
QDict *input, *args;
const char *cmd_name;
const mon_cmd_t *cmd;
Monitor *mon = cur_mon;
const char *cmd_name, *info_item;
args = NULL;
qemu_errors_to_mon(mon);
@ -3761,10 +3761,24 @@ static void handle_qmp_command(JSONMessageParser *parser, QList *tokens)
}
cmd_name = qstring_get_str(qobject_to_qstring(obj));
cmd = monitor_find_command(cmd_name);
if (!cmd) {
/*
* XXX: We need this special case until we get info handlers
* converted into 'query-' commands
*/
if (compare_cmd(cmd_name, "info")) {
qemu_error_new(QERR_COMMAND_NOT_FOUND, cmd_name);
goto err_input;
} else if (strstart(cmd_name, "query-", &info_item)) {
cmd = monitor_find_command("info");
qdict_put_obj(input, "arguments",
qobject_from_jsonf("{ 'item': %s }", info_item));
} else {
cmd = monitor_find_command(cmd_name);
if (!cmd) {
qemu_error_new(QERR_COMMAND_NOT_FOUND, cmd_name);
goto err_input;
}
}
obj = qdict_get(input, "arguments");