From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NaUeX-0000Gt-L3 for qemu-devel@nongnu.org; Thu, 28 Jan 2010 08:43:21 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NaUeS-0000By-Q5 for qemu-devel@nongnu.org; Thu, 28 Jan 2010 08:43:21 -0500 Received: from [199.232.76.173] (port=57162 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NaUeS-0000Bl-LB for qemu-devel@nongnu.org; Thu, 28 Jan 2010 08:43:16 -0500 Received: from mx1.redhat.com ([209.132.183.28]:62037) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NaUeR-0003vp-Cx for qemu-devel@nongnu.org; Thu, 28 Jan 2010 08:43:15 -0500 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 o0SDhELQ025283 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 28 Jan 2010 08:43:14 -0500 Received: from localhost (vpn-10-249.rdu.redhat.com [10.11.10.249]) by int-mx03.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o0SDhDUY014012 for ; Thu, 28 Jan 2010 08:43:13 -0500 From: Luiz Capitulino Date: Thu, 28 Jan 2010 11:42:53 -0200 Message-Id: <1264686180-29845-2-git-send-email-lcapitulino@redhat.com> In-Reply-To: <1264686180-29845-1-git-send-email-lcapitulino@redhat.com> References: <1264686180-29845-1-git-send-email-lcapitulino@redhat.com> Subject: [Qemu-devel] [PATCH 1/8] QMP: Initial mode-oriented support List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org In order to have feature negotiation in QMP, the Monitor has to be modified to support different modes of operation. We need two modes: o Handshake: where features are negotiated, only commands which deal with protocol configuration are allowed o Operational: regular Monitor operations, all handlers (except the protocol configuration ones) are allowed This commit does the following: 1. Adds the QMPMode data type to MonitorControl and sets QMODE_HANDSHAKE as the default one 2. Grant permission to 'query-version' and 'query-commands' to run on handshake mode Note, however, that these changes are not visable yet and thus QMP's behavior is still the same. Signed-off-by: Luiz Capitulino --- monitor.c | 14 ++++++++++++++ 1 files changed, 14 insertions(+), 0 deletions(-) diff --git a/monitor.c b/monitor.c index fb7c572..baae9d0 100644 --- a/monitor.c +++ b/monitor.c @@ -82,11 +82,16 @@ struct MonitorCompletionData { void (*user_print)(Monitor *mon, const QObject *data); }; +/* Handler flags */ +#define HANDLER_HANDSHAKE 0x01 /* allowed to run on handshake mode */ +#define HANDLER_HANDSHAKE_ONLY 0x02 /* can ONLY run on handshake mode */ + typedef struct mon_cmd_t { const char *name; const char *args_type; const char *params; const char *help; + unsigned int flags; void (*user_print)(Monitor *mon, const QObject *data); union { void (*info)(Monitor *mon); @@ -108,8 +113,14 @@ struct mon_fd_t { QLIST_ENTRY(mon_fd_t) next; }; +typedef enum QMPMode { + QMODE_OPERATIONAL, + QMODE_HANDSHAKE, +} QMPMode; + typedef struct MonitorControl { QObject *id; + QMPMode mode; int print_enabled; JSONMessageParser parser; } MonitorControl; @@ -2471,6 +2482,7 @@ static const mon_cmd_t info_cmds[] = { .args_type = "", .params = "", .help = "show the version of QEMU", + .flags = HANDLER_HANDSHAKE, .user_print = do_info_version_print, .mhandler.info_new = do_info_version, }, @@ -2479,6 +2491,7 @@ static const mon_cmd_t info_cmds[] = { .args_type = "", .params = "", .help = "list QMP available commands", + .flags = HANDLER_HANDSHAKE, .user_print = monitor_user_noop, .mhandler.info_new = do_info_commands, }, @@ -4293,6 +4306,7 @@ static void monitor_control_event(void *opaque, int event) QObject *data; Monitor *mon = opaque; + mon->mc->mode = QMODE_HANDSHAKE; json_message_parser_init(&mon->mc->parser, handle_qmp_command); data = qobject_from_jsonf("{ 'QMP': { 'capabilities': [] } }"); -- 1.6.6