Patchwork [1/4] QMP: Add QEMU's version to the greeting message

login
register
mail settings
Submitter Luiz Capitulino
Date Feb. 4, 2010, 8:10 p.m.
Message ID <1265314207-6323-2-git-send-email-lcapitulino@redhat.com>
Download mbox | patch
Permalink /patch/44548/
State New
Headers show

Comments

Luiz Capitulino - Feb. 4, 2010, 8:10 p.m.
With capability negotiation support clients will only have a chance
to check QEMU's version (ie. issue 'query-version') after the
negotiation procedure is done.

It might be useful to clients to check QEMU's version before
negotiating features, though.

To allow that, this commit adds the QEMU's version object to the
greeting message.

Not really sure this is needed, but doesn't hurt anyway.

Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
---
 QMP/README       |    6 ++++--
 QMP/qmp-spec.txt |    6 ++++--
 monitor.c        |   10 +++++++++-
 3 files changed, 17 insertions(+), 5 deletions(-)
Anthony Liguori - Feb. 10, 2010, 7:29 p.m.
On 02/04/2010 02:10 PM, Luiz Capitulino wrote:
> With capability negotiation support clients will only have a chance
> to check QEMU's version (ie. issue 'query-version') after the
> negotiation procedure is done.
>
> It might be useful to clients to check QEMU's version before
> negotiating features, though.
>
> To allow that, this commit adds the QEMU's version object to the
> greeting message.
>
> Not really sure this is needed, but doesn't hurt anyway.
>
> Signed-off-by: Luiz Capitulino<lcapitulino@redhat.com>
>    

Applied all.  Thanks.

Regards,

Anthony Liguori
> ---
>   QMP/README       |    6 ++++--
>   QMP/qmp-spec.txt |    6 ++++--
>   monitor.c        |   10 +++++++++-
>   3 files changed, 17 insertions(+), 5 deletions(-)
>
> diff --git a/QMP/README b/QMP/README
> index 09e7053..9334c25 100644
> --- a/QMP/README
> +++ b/QMP/README
> @@ -52,9 +52,11 @@ $ telnet localhost 4444
>   Trying 127.0.0.1...
>   Connected to localhost.
>   Escape character is '^]'.
> -{"QMP": {"capabilities": []}}
> +{"QMP": {"version": {"qemu": "0.12.50", "package": ""}, "capabilities": []}}
> +{ "execute": "qmp_capabilities" }
> +{"return": {}}
>   { "execute": "query-version" }
> -{"return": {"qemu": "0.11.50", "package": ""}}
> +{"return": {"qemu": "0.12.50", "package": ""}}
>
>   Contact
>   -------
> diff --git a/QMP/qmp-spec.txt b/QMP/qmp-spec.txt
> index 56f388c..b2617bb 100644
> --- a/QMP/qmp-spec.txt
> +++ b/QMP/qmp-spec.txt
> @@ -48,10 +48,12 @@ waiting for commands.
>
>   The format is:
>
> -{ "QMP": { "capabilities": json-array } }
> +{ "QMP": { "version": json-object, "capabilities": json-array } }
>
>    Where,
>
> +- The "version" member contains the Server's version information (the format
> +  is the same of the 'query-version' command)
>   - The "capabilities" member specify the availability of features beyond the
>     baseline specification
>
> @@ -152,7 +154,7 @@ This section provides some examples of real QMP usage, in all of them
>   3.1 Server greeting
>   -------------------
>
> -S: {"QMP": {"capabilities": []}}
> +S: {"QMP": {"version": {"qemu": "0.12.50", "package": ""}, "capabilities": []}}
>
>   3.2 Simple 'stop' execution
>   ---------------------------
> diff --git a/monitor.c b/monitor.c
> index ff22123..ec1d11e 100644
> --- a/monitor.c
> +++ b/monitor.c
> @@ -4365,6 +4365,14 @@ void monitor_resume(Monitor *mon)
>           readline_show_prompt(mon->rs);
>   }
>
> +static QObject *get_qmp_greeting(void)
> +{
> +    QObject *ver;
> +
> +    do_info_version(NULL,&ver);
> +    return qobject_from_jsonf("{'QMP':{'version': %p,'capabilities': []}}",ver);
> +}
> +
>   /**
>    * monitor_control_event(): Print QMP gretting
>    */
> @@ -4376,7 +4384,7 @@ static void monitor_control_event(void *opaque, int event)
>
>           json_message_parser_init(&mon->mc->parser, handle_qmp_command);
>
> -        data = qobject_from_jsonf("{ 'QMP': { 'capabilities': [] } }");
> +        data = get_qmp_greeting();
>           assert(data != NULL);
>
>           monitor_json_emitter(mon, data);
>

Patch

diff --git a/QMP/README b/QMP/README
index 09e7053..9334c25 100644
--- a/QMP/README
+++ b/QMP/README
@@ -52,9 +52,11 @@  $ telnet localhost 4444
 Trying 127.0.0.1...
 Connected to localhost.
 Escape character is '^]'.
-{"QMP": {"capabilities": []}}
+{"QMP": {"version": {"qemu": "0.12.50", "package": ""}, "capabilities": []}}
+{ "execute": "qmp_capabilities" }
+{"return": {}}
 { "execute": "query-version" }
-{"return": {"qemu": "0.11.50", "package": ""}}
+{"return": {"qemu": "0.12.50", "package": ""}}
 
 Contact
 -------
diff --git a/QMP/qmp-spec.txt b/QMP/qmp-spec.txt
index 56f388c..b2617bb 100644
--- a/QMP/qmp-spec.txt
+++ b/QMP/qmp-spec.txt
@@ -48,10 +48,12 @@  waiting for commands.
 
 The format is:
 
-{ "QMP": { "capabilities": json-array } }
+{ "QMP": { "version": json-object, "capabilities": json-array } }
 
  Where,
 
+- The "version" member contains the Server's version information (the format
+  is the same of the 'query-version' command)
 - The "capabilities" member specify the availability of features beyond the
   baseline specification
 
@@ -152,7 +154,7 @@  This section provides some examples of real QMP usage, in all of them
 3.1 Server greeting
 -------------------
 
-S: {"QMP": {"capabilities": []}}
+S: {"QMP": {"version": {"qemu": "0.12.50", "package": ""}, "capabilities": []}}
 
 3.2 Simple 'stop' execution
 ---------------------------
diff --git a/monitor.c b/monitor.c
index ff22123..ec1d11e 100644
--- a/monitor.c
+++ b/monitor.c
@@ -4365,6 +4365,14 @@  void monitor_resume(Monitor *mon)
         readline_show_prompt(mon->rs);
 }
 
+static QObject *get_qmp_greeting(void)
+{
+    QObject *ver;
+
+    do_info_version(NULL, &ver);
+    return qobject_from_jsonf("{'QMP':{'version': %p,'capabilities': []}}",ver);
+}
+
 /**
  * monitor_control_event(): Print QMP gretting
  */
@@ -4376,7 +4384,7 @@  static void monitor_control_event(void *opaque, int event)
 
         json_message_parser_init(&mon->mc->parser, handle_qmp_command);
 
-        data = qobject_from_jsonf("{ 'QMP': { 'capabilities': [] } }");
+        data = get_qmp_greeting();
         assert(data != NULL);
 
         monitor_json_emitter(mon, data);