Patchwork [12/20] QMP: Allow 'query-' commands

login
register
mail settings
Submitter Luiz Capitulino
Date Nov. 27, 2009, 12:59 a.m.
Message ID <1259283550-3597-13-git-send-email-lcapitulino@redhat.com>
Download mbox | patch
Permalink /patch/39603/
State New
Headers show

Comments

Luiz Capitulino - Nov. 27, 2009, 12:59 a.m.
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>
---
 monitor.c |   20 +++++++++++++++++---
 1 files changed, 17 insertions(+), 3 deletions(-)

Patch

diff --git a/monitor.c b/monitor.c
index c172343..0d4380d 100644
--- a/monitor.c
+++ b/monitor.c
@@ -3813,9 +3813,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);
@@ -3846,10 +3846,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");