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:
parent
5fa737a479
commit
5e23f480df
20
monitor.c
20
monitor.c
@ -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");
|
||||
|
Loading…
Reference in New Issue
Block a user