From 5e23f480df7a451dab6f82c4f13520b089daaf0e Mon Sep 17 00:00:00 2001 From: Luiz Capitulino Date: Thu, 26 Nov 2009 22:59:02 -0200 Subject: [PATCH] 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 Signed-off-by: Anthony Liguori --- monitor.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/monitor.c b/monitor.c index 845e405472..beaff6425e 100644 --- a/monitor.c +++ b/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");