[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 06/25] monitor: Setup a dictionary with handler argu
From: |
Luiz Capitulino |
Subject: |
[Qemu-devel] [PATCH 06/25] monitor: Setup a dictionary with handler arguments |
Date: |
Tue, 28 Jul 2009 19:04:54 -0300 |
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
qemu_dict_exists()
Signed-off-by: Luiz Capitulino <address@hidden>
---
monitor.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 56 insertions(+), 0 deletions(-)
diff --git a/monitor.c b/monitor.c
index 082ee94..802edb7 100644
--- a/monitor.c
+++ b/monitor.c
@@ -41,6 +41,7 @@
#include "disas.h"
#include "balloon.h"
#include "qemu-timer.h"
+#include "qemu-dict.h"
#include "migration.h"
#include "kvm.h"
#include "acl.h"
@@ -2582,6 +2583,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;
@@ -2597,6 +2629,7 @@ static void monitor_handle_command(Monitor *mon, const
char *cmdline)
char *key;
void *str_allocated[MAX_ARGS];
void *args[MAX_ARGS];
+ struct qemu_dict *qdict;
void (*handler_0)(Monitor *mon);
void (*handler_1)(Monitor *mon, void *arg0);
void (*handler_2)(Monitor *mon, void *arg0, void *arg1);
@@ -2639,6 +2672,8 @@ static void monitor_handle_command(Monitor *mon, const
char *cmdline)
return;
}
+ qdict = qemu_dict_create();
+
for(i = 0; i < MAX_ARGS; i++)
str_allocated[i] = NULL;
@@ -2696,6 +2731,8 @@ static void monitor_handle_command(Monitor *mon, const
char *cmdline)
goto fail;
}
args[nb_args++] = str;
+ if (str)
+ qemu_dict_add(qdict, key, str);
}
break;
case '/':
@@ -2777,12 +2814,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;
+ qemu_dict_add(qdict, "count", (void*)(long)count);
+ qemu_dict_add(qdict, "format", (void*)(long)format);
+ qemu_dict_add(qdict, "size", (void*)(long)size);
}
break;
case 'i':
case 'l':
{
int64_t val;
+ int qdict_add = 1;
while (qemu_isspace(*p))
p++;
@@ -2805,6 +2846,7 @@ static void monitor_handle_command(Monitor *mon, const
char *cmdline)
typestr++;
if (nb_args >= MAX_ARGS)
goto error_args;
+ qdict_add = has_arg;
args[nb_args++] = (void *)(long)has_arg;
if (!has_arg) {
if (nb_args >= MAX_ARGS)
@@ -2820,15 +2862,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 (qdict_add)
+ qemu_dict_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);
+ qemu_dict_add(qdict, lkey,
+ (void *)(long)((val >> 32) & 0xffffffff));
+ qemu_free(lkey);
#else
args[nb_args++] = (void *)0;
+ qemu_dict_add(qdict, lkey, (void *)0);
+ qemu_free(lkey);
#endif
args[nb_args++] = (void *)(long)(val & 0xffffffff);
+ lkey = key_append_low(key);
+ qemu_dict_add(qdict, lkey,(void *)(long)(val &
0xffffffff));
+ qemu_free(lkey);
}
}
break;
@@ -2856,6 +2910,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;
+ qemu_dict_add(qdict, key, (void *)(long)has_option);
}
break;
default:
@@ -2930,6 +2985,7 @@ static void monitor_handle_command(Monitor *mon, const
char *cmdline)
}
fail:
qemu_free(key);
+ qemu_dict_destroy(qdict);
for(i = 0; i < MAX_ARGS; i++)
qemu_free(str_allocated[i]);
}
--
1.6.4.rc3.12.gdf73a
[Qemu-devel] [PATCH 02/25] net: Fix do_set_link() return type, Luiz Capitulino, 2009/07/28
[Qemu-devel] [PATCH 03/25] Add wrappers to functions used by the Monitor, Luiz Capitulino, 2009/07/28
[Qemu-devel] [PATCH 04/25] monitor: Document missing supported argument types, Luiz Capitulino, 2009/07/28
[Qemu-devel] [PATCH 05/25] monitor: New format for handlers argument types, Luiz Capitulino, 2009/07/28
[Qemu-devel] [PATCH 06/25] monitor: Setup a dictionary with handler arguments,
Luiz Capitulino <=
[Qemu-devel] [PATCH 07/25] monitor: Export qemu-dict.h header, Luiz Capitulino, 2009/07/28
[Qemu-devel] [PATCH 08/25] monitor: New GET_TLONG and GET_TPHYSADDR macros, Luiz Capitulino, 2009/07/28
[Qemu-devel] [PATCH 09/25] monitor: Port handler_0 to use the dictionary, Luiz Capitulino, 2009/07/28
[Qemu-devel] [PATCH 10/25] monitor: Port handler_1 to use the dictionary, Luiz Capitulino, 2009/07/28
[Qemu-devel] [PATCH 11/25] monitor: Port handler_2 to use the dictionary, Luiz Capitulino, 2009/07/28
[Qemu-devel] [PATCH 13/25] monitor: Port handler_4 to use the dictionary, Luiz Capitulino, 2009/07/28
[Qemu-devel] [PATCH 12/25] monitor: Port handler_3 to use the dictionary, Luiz Capitulino, 2009/07/28
[Qemu-devel] [PATCH 14/25] monitor: Port handler_5 to use the dictionary, Luiz Capitulino, 2009/07/28
[Qemu-devel] [PATCH 15/25] monitor: Port handler_6 to use the dictionary, Luiz Capitulino, 2009/07/28
[Qemu-devel] [PATCH 16/25] monitor: Port handler_7 to use the dictionary, Luiz Capitulino, 2009/07/28