@@ -173,6 +173,7 @@ typedef struct {
* mode.
*/
bool in_command_mode; /* are we in command mode? */
+ bool has_async; /* the client has async capability */
QmpClient client;
} MonitorQMP;
@@ -570,9 +571,22 @@ static void monitor_qapi_event_init(void)
qmp_event_set_func_emit(monitor_qapi_event_queue);
}
-void qmp_qmp_capabilities(Error **errp)
+void qmp_qmp_capabilities(bool has_capabilities,
+ QMPCapabilityList *capabilities, Error **errp)
{
+ bool has_async = false;
+
+ if (has_capabilities) {
+ while (capabilities) {
+ if (capabilities->value == QMP_CAPABILITY_ASYNC) {
+ has_async = true;
+ }
+ capabilities = capabilities->next;
+ }
+ }
+
cur_mon->qmp.in_command_mode = true;
+ cur_mon->qmp.has_async = has_async;
}
static void handle_hmp_command(Monitor *mon, const char *cmdline);
@@ -3852,8 +3866,8 @@ static QObject *get_qmp_greeting(void)
qmp_marshal_query_version(NULL, &ver, NULL);
- return qobject_from_jsonf("{'QMP': {'version': %p, 'capabilities': []}}",
- ver);
+ return qobject_from_jsonf("{'QMP': {'version': %p, 'capabilities': ["
+ "'async']}}", ver);
}
static void monitor_qmp_event(void *opaque, int event)
@@ -37,7 +37,7 @@
#
# Enable QMP capabilities.
#
-# Arguments: None.
+# @capabilities: #optional an array of QMPCapability (since 2.8)
#
# Example:
#
@@ -51,7 +51,7 @@
# Since: 0.13
#
##
-{ 'command': 'qmp_capabilities' }
+{ 'command': 'qmp_capabilities', 'data': { '*capabilities': ['QMPCapability'] } }
##
# @LostTickPolicy:
Declare that the server supports async. Check if the client supports it: the following patch will suspend the qmp monitor if an async command is ongoing. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> --- monitor.c | 20 +++++++++++++++++--- qapi-schema.json | 4 ++-- 2 files changed, 19 insertions(+), 5 deletions(-)