Patchwork [4/8] QMP: Introduce qmp_switch_mode command

login
register
mail settings
Submitter Luiz Capitulino
Date Jan. 28, 2010, 1:42 p.m.
Message ID <1264686180-29845-5-git-send-email-lcapitulino@redhat.com>
Download mbox | patch
Permalink /patch/43867/
State New
Headers show

Comments

Luiz Capitulino - Jan. 28, 2010, 1:42 p.m.
It will be used to switch between "handshake" and "operational"
modes. Currently it doesn't have any practical effect, as
mode-oriented support is not enforced yet.

Usage example:

{ "execute": "qmp_switch_mode", "arguments": { "mode": "operational" } }

Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
---
 monitor.c       |   26 ++++++++++++++++++++++++++
 qemu-monitor.hx |   15 +++++++++++++++
 2 files changed, 41 insertions(+), 0 deletions(-)
Markus Armbruster - Feb. 1, 2010, 5:04 p.m.
Luiz Capitulino <lcapitulino@redhat.com> writes:

> It will be used to switch between "handshake" and "operational"
> modes. Currently it doesn't have any practical effect, as
> mode-oriented support is not enforced yet.
>
> Usage example:
>
> { "execute": "qmp_switch_mode", "arguments": { "mode": "operational" } }
>
> Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
> ---
>  monitor.c       |   26 ++++++++++++++++++++++++++
>  qemu-monitor.hx |   15 +++++++++++++++
>  2 files changed, 41 insertions(+), 0 deletions(-)
>
> diff --git a/monitor.c b/monitor.c
> index 3ced51d..f6dd64d 100644
> --- a/monitor.c
> +++ b/monitor.c
> @@ -704,6 +704,32 @@ static void do_info_qmp_mode(Monitor *mon, QObject **ret_data)
>      *ret_data = qobject_from_jsonf("{ 'mode': %s }", mode);
>  }
>  
> +static void do_qmp_switch_mode(Monitor *mon, const QDict *qdict,
> +                               QObject **ret_data)
> +{
> +    const char *mode;
> +
> +    if (!monitor_ctrl_mode(mon)) {
> +        return;
> +    }

So the command "qmp_switch_mode" is available in the human monitor, but
does nothing?

What about a flag "QMP only?"

[...]
Luiz Capitulino - Feb. 1, 2010, 6:11 p.m.
On Mon, 01 Feb 2010 18:04:04 +0100
Markus Armbruster <armbru@redhat.com> wrote:

> Luiz Capitulino <lcapitulino@redhat.com> writes:
> 
> > It will be used to switch between "handshake" and "operational"
> > modes. Currently it doesn't have any practical effect, as
> > mode-oriented support is not enforced yet.
> >
> > Usage example:
> >
> > { "execute": "qmp_switch_mode", "arguments": { "mode": "operational" } }
> >
> > Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
> > ---
> >  monitor.c       |   26 ++++++++++++++++++++++++++
> >  qemu-monitor.hx |   15 +++++++++++++++
> >  2 files changed, 41 insertions(+), 0 deletions(-)
> >
> > diff --git a/monitor.c b/monitor.c
> > index 3ced51d..f6dd64d 100644
> > --- a/monitor.c
> > +++ b/monitor.c
> > @@ -704,6 +704,32 @@ static void do_info_qmp_mode(Monitor *mon, QObject **ret_data)
> >      *ret_data = qobject_from_jsonf("{ 'mode': %s }", mode);
> >  }
> >  
> > +static void do_qmp_switch_mode(Monitor *mon, const QDict *qdict,
> > +                               QObject **ret_data)
> > +{
> > +    const char *mode;
> > +
> > +    if (!monitor_ctrl_mode(mon)) {
> > +        return;
> > +    }
> 
> So the command "qmp_switch_mode" is available in the human monitor, but
> does nothing?
> 
> What about a flag "QMP only?"

 Seems reasonable, I only have to check if the work it requires is
related to this series.

Patch

diff --git a/monitor.c b/monitor.c
index 3ced51d..f6dd64d 100644
--- a/monitor.c
+++ b/monitor.c
@@ -704,6 +704,32 @@  static void do_info_qmp_mode(Monitor *mon, QObject **ret_data)
     *ret_data = qobject_from_jsonf("{ 'mode': %s }", mode);
 }
 
+static void do_qmp_switch_mode(Monitor *mon, const QDict *qdict,
+                               QObject **ret_data)
+{
+    const char *mode;
+
+    if (!monitor_ctrl_mode(mon)) {
+        return;
+    }
+
+    mode = qdict_get_str(qdict, "mode");
+
+    /*
+     * Check is simple, as this function can only run in
+     * handshake mode.
+     */
+
+    if (!strcmp(mode, "operational")) {
+        mon->mc->mode = QMODE_OPERATIONAL;
+    } else if (!strcmp(mode,  "handshake")) {
+        /* only handshake -> operational is allowed */
+        qemu_error_new(QERR_QMP_INVALID_MODE_TRANSITION);
+    } else {
+        qemu_error_new(QERR_QMP_INVALID_MODE_NAME, mode);
+    }
+}
+
 /**
  * do_info_commands(): List QMP available commands
  *
diff --git a/qemu-monitor.hx b/qemu-monitor.hx
index b51bb47..29155ce 100644
--- a/qemu-monitor.hx
+++ b/qemu-monitor.hx
@@ -1064,6 +1064,21 @@  STEXI
 Set the encrypted device @var{device} password to @var{password}
 ETEXI
 
+    {
+        .name       = "qmp_switch_mode",
+        .args_type  = "mode:s",
+        .params     = "qmp_switch_mode mode",
+        .help       = "switch QMP mode",
+        .flags      = HANDLER_HANDSHAKE_ONLY,
+        .user_print = monitor_user_noop,
+        .mhandler.cmd_new = do_qmp_switch_mode,
+    },
+
+STEXI
+@item qmp_switch_mode @var{mode}
+Switch QMP to @var{mode}
+ETEXI
+
 STEXI
 @end table
 ETEXI