@@ -618,6 +618,27 @@ 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");
+
+ if (mon->mc->mode != QMODE_HANDSHAKE || !strcmp(mode, "handshake")) {
+ /* only handshake -> operational is allowed */
+ qemu_error_new(QERR_QMP_INVALID_MODE_TRANSACTION);
+ } else if (!strcmp(mode, "operational")) {
+ mon->mc->mode = QMODE_OPERATIONAL;
+ } else {
+ qemu_error_new(QERR_QMP_INVALID_MODE_NAME, mode);
+ }
+}
+
/**
* do_info_commands(): List QMP available commands
*
@@ -1062,6 +1062,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 name",
+ .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
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 | 21 +++++++++++++++++++++ qemu-monitor.hx | 15 +++++++++++++++ 2 files changed, 36 insertions(+), 0 deletions(-)