From patchwork Mon Aug 3 16:57:03 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Capitulino X-Patchwork-Id: 30659 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by bilbo.ozlabs.org (Postfix) with ESMTPS id 390C7B6F2B for ; Tue, 4 Aug 2009 05:31:23 +1000 (EST) Received: from localhost ([127.0.0.1]:33562 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MY3Fd-0001PF-Mh for incoming@patchwork.ozlabs.org; Mon, 03 Aug 2009 15:31:17 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MY0rp-00063g-Bd for qemu-devel@nongnu.org; Mon, 03 Aug 2009 12:58:33 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MY0rk-000616-2C for qemu-devel@nongnu.org; Mon, 03 Aug 2009 12:58:32 -0400 Received: from [199.232.76.173] (port=55276 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MY0rj-00060z-U6 for qemu-devel@nongnu.org; Mon, 03 Aug 2009 12:58:27 -0400 Received: from mx2.redhat.com ([66.187.237.31]:56295) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MY0rj-00039U-9R for qemu-devel@nongnu.org; Mon, 03 Aug 2009 12:58:27 -0400 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n73GwQ6M026270; Mon, 3 Aug 2009 12:58:26 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n73GwPPr015353; Mon, 3 Aug 2009 12:58:25 -0400 Received: from localhost (vpn-10-1.bos.redhat.com [10.16.10.1]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n73GwNld030088; Mon, 3 Aug 2009 12:58:24 -0400 From: Luiz Capitulino To: qemu-devel@nongnu.org Date: Mon, 3 Aug 2009 13:57:03 -0300 Message-Id: <1249318642-19324-7-git-send-email-lcapitulino@redhat.com> In-Reply-To: <1249318642-19324-1-git-send-email-lcapitulino@redhat.com> References: <1249318642-19324-1-git-send-email-lcapitulino@redhat.com> X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 3) Cc: jan.kiszka@siemens.com, aliguori@us.ibm.com, avi@redhat.com Subject: [Qemu-devel] [PATCH 06/25] monitor: Setup a dictionary with handler arguments X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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 --- monitor.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 56 insertions(+), 0 deletions(-) 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]); }