From patchwork Wed Sep 16 21:32:35 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Capitulino X-Patchwork-Id: 33744 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 ozlabs.org (Postfix) with ESMTPS id F021DB7B71 for ; Thu, 17 Sep 2009 07:38:04 +1000 (EST) Received: from localhost ([127.0.0.1]:51915 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Mo2CJ-00086V-5w for incoming@patchwork.ozlabs.org; Wed, 16 Sep 2009 17:37:55 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Mo27a-0006kd-IU for qemu-devel@nongnu.org; Wed, 16 Sep 2009 17:33:02 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Mo27V-0006em-UF for qemu-devel@nongnu.org; Wed, 16 Sep 2009 17:33:01 -0400 Received: from [199.232.76.173] (port=58003 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Mo27V-0006eL-G0 for qemu-devel@nongnu.org; Wed, 16 Sep 2009 17:32:57 -0400 Received: from mx1.redhat.com ([209.132.183.28]:24970) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1Mo27U-0002iP-U0 for qemu-devel@nongnu.org; Wed, 16 Sep 2009 17:32:57 -0400 Received: from int-mx03.intmail.prod.int.phx2.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id n8GLWucM001973 for ; Wed, 16 Sep 2009 17:32:56 -0400 Received: from localhost (vpn-12-10.rdu.redhat.com [10.11.12.10]) by int-mx03.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id n8GLWsHS025768 for ; Wed, 16 Sep 2009 17:32:55 -0400 From: Luiz Capitulino To: qemu-devel@nongnu.org Date: Wed, 16 Sep 2009 18:32:35 -0300 Message-Id: <1253136760-3614-3-git-send-email-lcapitulino@redhat.com> In-Reply-To: <1253136760-3614-1-git-send-email-lcapitulino@redhat.com> References: <1253136760-3614-1-git-send-email-lcapitulino@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.16 X-detected-operating-system: by monty-python.gnu.org: Genre and OS details not recognized. Subject: [Qemu-devel] [PATCH 2/7] monitor: Handle new and old style handlers 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 This commit changes monitor_handle_command() to support old style and new style handlers. New style handlers are protocol independent, they return their data to the Monitor, which in turn decides how to print them (ie. user protocol vs. machine protocol). Converted handlers will use the 'user_print' member of 'mon_cmd_t' to define its user protocol function, which will be called to print data in the user protocol format. Handlers which don't have 'user_print' defined are not converted. Signed-off-by: Luiz Capitulino --- monitor.c | 32 ++++++++++++++++++++++++++------ 1 files changed, 26 insertions(+), 6 deletions(-) diff --git a/monitor.c b/monitor.c index fe604d8..17754fb 100644 --- a/monitor.c +++ b/monitor.c @@ -210,6 +210,11 @@ static int monitor_fprintf(FILE *stream, const char *fmt, ...) return 0; } +static int monitor_handler_ported(const mon_cmd_t *cmd) +{ + return (cmd->user_print == NULL ? 0 : 1); +} + static int compare_cmd(const char *name, const char *list) { const char *p, *pstart; @@ -3041,17 +3046,32 @@ static void monitor_handle_command(Monitor *mon, const char *cmdline) qdict = qdict_new(); cmd = monitor_parse_command(mon, cmdline, qdict); - if (cmd) { - void (*handler)(Monitor *mon, const QDict *qdict); + if (!cmd) + goto out; + + qemu_errors_to_mon(mon); - qemu_errors_to_mon(mon); + if (monitor_handler_ported(cmd)) { + QObject *data = NULL; + int (*handler_new)(Monitor *mon, + const QDict *params, QObject **ret_data); - handler = cmd->handler; - handler(mon, qdict); + handler_new = cmd->handler; + handler_new(mon, qdict, &data); - qemu_errors_to_previous(); + cmd->user_print(mon, data); + + if (data) + qobject_decref(data); + } else { + void (*handler_old)(Monitor *mon, const QDict *qdict); + handler_old = cmd->handler; + handler_old(mon, qdict); } + qemu_errors_to_previous(); + +out: QDECREF(qdict); }