Patchwork [06/25] monitor: Setup a dictionary with handler arguments

login
register
mail settings
Submitter Luiz Capitulino
Date Aug. 3, 2009, 4:57 p.m.
Message ID <1249318642-19324-7-git-send-email-lcapitulino@redhat.com>
Download mbox | patch
Permalink /patch/30659/
State Superseded
Headers show

Comments

Luiz Capitulino - Aug. 3, 2009, 4:57 p.m.
With this commit monitor_handle_command() will be able to setup a
QEMU dictionary with arguments to command handlers.

However, the current 'args' method is still being used, next changes
will port commands to use the new dictionary.

There are three changes introduced by the dictionary that are worth
noting:

1. The '/' argument type always adds the following standard keys in the
dictionary: 'count', 'format' and 'size'. This way, the argument
name used in the 'args_type' string doesn't matter

2. The 'l' argument type always adds a 'high' order value and a 'low'
order value. To do this the Monitor will append '_h' and '_l' to the
argument name used in the 'args_type' (this is the job of
key_append_str() & friends)

3. The optional argument type '?' doesn't need to pass the additional
'has_arg' argument, instead hanlders can do the same check with
qdict_exists()

Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
---
 monitor.c |   56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 56 insertions(+), 0 deletions(-)

Patch

diff --git a/monitor.c b/monitor.c
index 83c50a8..676ce7d 100644
--- a/monitor.c
+++ b/monitor.c
@@ -41,6 +41,7 @@ 
 #include "disas.h"
 #include "balloon.h"
 #include "qemu-timer.h"
+#include "qdict.h"
 #include "migration.h"
 #include "kvm.h"
 #include "acl.h"
@@ -2584,6 +2585,37 @@  static char *key_get_info(const char *type, char **key)
     return ++p;
 }
 
+/**
+ * Append '_' plus the character from 'c' to 'key' and returns
+ * the new string.
+ */
+static char *key_append_chr(const char *key, int c)
+{
+    char *p;
+    size_t len;
+
+    len = strlen(key);
+    p = qemu_malloc(len + 3);
+    memcpy(p, key, len);
+    p[len++] = '_';
+    p[len++] = c;
+    p[len] = '\0';
+
+    return p;
+}
+
+/* Append "_l" to 'key' */
+static char *key_append_low(const char *key)
+{
+    return key_append_chr(key, 'l');
+}
+
+/* Append "_h" to 'key' */
+static char *key_append_high(const char *key)
+{
+    return key_append_chr(key, 'h');
+}
+
 static int default_fmt_format = 'x';
 static int default_fmt_size = 4;
 
@@ -2599,6 +2631,7 @@  static void monitor_handle_command(Monitor *mon, const char *cmdline)
     char *key;
     void *str_allocated[MAX_ARGS];
     void *args[MAX_ARGS];
+    QDict *qdict;
     void (*handler_0)(Monitor *mon);
     void (*handler_1)(Monitor *mon, void *arg0);
     void (*handler_2)(Monitor *mon, void *arg0, void *arg1);
@@ -2641,6 +2674,8 @@  static void monitor_handle_command(Monitor *mon, const char *cmdline)
         return;
     }
 
+    qdict = qdict_new();
+
     for(i = 0; i < MAX_ARGS; i++)
         str_allocated[i] = NULL;
 
@@ -2698,6 +2733,8 @@  static void monitor_handle_command(Monitor *mon, const char *cmdline)
                     goto fail;
                 }
                 args[nb_args++] = str;
+                if (str)
+                    qdict_add(qdict, key, str);
             }
             break;
         case '/':
@@ -2779,12 +2816,16 @@  static void monitor_handle_command(Monitor *mon, const char *cmdline)
                 args[nb_args++] = (void*)(long)count;
                 args[nb_args++] = (void*)(long)format;
                 args[nb_args++] = (void*)(long)size;
+                qdict_add(qdict, "count", (void*)(long)count);
+                qdict_add(qdict, "format", (void*)(long)format);
+                qdict_add(qdict, "size", (void*)(long)size);
             }
             break;
         case 'i':
         case 'l':
             {
                 int64_t val;
+                int dict_add = 1;
 
                 while (qemu_isspace(*p))
                     p++;
@@ -2807,6 +2848,7 @@  static void monitor_handle_command(Monitor *mon, const char *cmdline)
                     typestr++;
                     if (nb_args >= MAX_ARGS)
                         goto error_args;
+                    dict_add = has_arg;
                     args[nb_args++] = (void *)(long)has_arg;
                     if (!has_arg) {
                         if (nb_args >= MAX_ARGS)
@@ -2822,15 +2864,27 @@  static void monitor_handle_command(Monitor *mon, const char *cmdline)
                     if (nb_args >= MAX_ARGS)
                         goto error_args;
                     args[nb_args++] = (void *)(long)val;
+                    if (dict_add)
+                        qdict_add(qdict, key, (void *)(long) val);
                 } else {
+                    char *lkey;
                     if ((nb_args + 1) >= MAX_ARGS)
                         goto error_args;
+                    lkey = key_append_high(key);
 #if TARGET_PHYS_ADDR_BITS > 32
                     args[nb_args++] = (void *)(long)((val >> 32) & 0xffffffff);
+                    qdict_add(qdict, lkey,
+                                    (void *)(long)((val >> 32) & 0xffffffff));
+                    qemu_free(lkey);
 #else
                     args[nb_args++] = (void *)0;
+                    qdict_add(qdict, lkey, (void *)0);
+                    qemu_free(lkey);
 #endif
                     args[nb_args++] = (void *)(long)(val & 0xffffffff);
+                    lkey = key_append_low(key);
+                    qdict_add(qdict, lkey,(void *)(long)(val & 0xffffffff));
+                    qemu_free(lkey);
                 }
             }
             break;
@@ -2858,6 +2912,7 @@  static void monitor_handle_command(Monitor *mon, const char *cmdline)
                 if (nb_args >= MAX_ARGS)
                     goto error_args;
                 args[nb_args++] = (void *)(long)has_option;
+                qdict_add(qdict, key, (void *)(long)has_option);
             }
             break;
         default:
@@ -2932,6 +2987,7 @@  static void monitor_handle_command(Monitor *mon, const char *cmdline)
     }
  fail:
     qemu_free(key);
+    qdict_destroy(qdict);
     for(i = 0; i < MAX_ARGS; i++)
         qemu_free(str_allocated[i]);
 }