17b1b5d19SPaolo Bonzini /* 27b1b5d19SPaolo Bonzini * Core Definitions for QAPI/QMP Dispatch 37b1b5d19SPaolo Bonzini * 47b1b5d19SPaolo Bonzini * Copyright IBM, Corp. 2011 57b1b5d19SPaolo Bonzini * 67b1b5d19SPaolo Bonzini * Authors: 77b1b5d19SPaolo Bonzini * Anthony Liguori <aliguori@us.ibm.com> 87b1b5d19SPaolo Bonzini * 97b1b5d19SPaolo Bonzini * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. 107b1b5d19SPaolo Bonzini * See the COPYING.LIB file in the top-level directory. 117b1b5d19SPaolo Bonzini * 127b1b5d19SPaolo Bonzini */ 137b1b5d19SPaolo Bonzini 14121d0712SMarkus Armbruster #ifndef QAPI_QMP_DISPATCH_H 15121d0712SMarkus Armbruster #define QAPI_QMP_DISPATCH_H 167b1b5d19SPaolo Bonzini 1741725fa7SKevin Wolf #include "monitor/monitor.h" 18452fcdbcSMarkus Armbruster #include "qemu/queue.h" 197b1b5d19SPaolo Bonzini 207b1b5d19SPaolo Bonzini typedef void (QmpCommandFunc)(QDict *, QObject **, Error **); 217b1b5d19SPaolo Bonzini 227b1b5d19SPaolo Bonzini typedef enum QmpCommandOptions 237b1b5d19SPaolo Bonzini { 24876c6751SPeter Xu QCO_NO_SUCCESS_RESP = (1U << 0), 25876c6751SPeter Xu QCO_ALLOW_OOB = (1U << 1), 26d6fe3d02SIgor Mammedov QCO_ALLOW_PRECONFIG = (1U << 2), 2704f22362SKevin Wolf QCO_COROUTINE = (1U << 3), 287b1b5d19SPaolo Bonzini } QmpCommandOptions; 297b1b5d19SPaolo Bonzini 307b1b5d19SPaolo Bonzini typedef struct QmpCommand 317b1b5d19SPaolo Bonzini { 327b1b5d19SPaolo Bonzini const char *name; 339ce44e2cSKevin Wolf /* Runs in coroutine context if QCO_COROUTINE is set */ 347b1b5d19SPaolo Bonzini QmpCommandFunc *fn; 357b1b5d19SPaolo Bonzini QmpCommandOptions options; 366604e475SMarkus Armbruster unsigned special_features; 377b1b5d19SPaolo Bonzini QTAILQ_ENTRY(QmpCommand) node; 387b1b5d19SPaolo Bonzini bool enabled; 39c98939daSMarc-André Lureau const char *disable_reason; 407b1b5d19SPaolo Bonzini } QmpCommand; 417b1b5d19SPaolo Bonzini 421527badbSMarkus Armbruster typedef QTAILQ_HEAD(QmpCommandList, QmpCommand) QmpCommandList; 431527badbSMarkus Armbruster 441527badbSMarkus Armbruster void qmp_register_command(QmpCommandList *cmds, const char *name, 456604e475SMarkus Armbruster QmpCommandFunc *fn, QmpCommandOptions options, 466604e475SMarkus Armbruster unsigned special_features); 47f0ccc00bSMarc-André Lureau const QmpCommand *qmp_find_command(const QmpCommandList *cmds, 48f0ccc00bSMarc-André Lureau const char *name); 49c98939daSMarc-André Lureau void qmp_disable_command(QmpCommandList *cmds, const char *name, 50c98939daSMarc-André Lureau const char *err_msg); 511527badbSMarkus Armbruster void qmp_enable_command(QmpCommandList *cmds, const char *name); 521527badbSMarkus Armbruster 538dc4d915SMark Wu bool qmp_command_is_enabled(const QmpCommand *cmd); 54164dafd1SPaolo Bonzini bool qmp_command_available(const QmpCommand *cmd, Error **errp); 558dc4d915SMark Wu const char *qmp_command_name(const QmpCommand *cmd); 560106dc4fSMark Wu bool qmp_has_success_response(const QmpCommand *cmd); 57cee32796SMarkus Armbruster QDict *qmp_error_response(Error *err); 58*a50c99bcSPaolo Bonzini QDict *coroutine_mixed_fn qmp_dispatch(const QmpCommandList *cmds, QObject *request, 5941725fa7SKevin Wolf bool allow_oob, Monitor *cur_mon); 602aa788f5SMarc-André Lureau bool qmp_is_oob(const QDict *dict); 611527badbSMarkus Armbruster 62f0ccc00bSMarc-André Lureau typedef void (*qmp_cmd_callback_fn)(const QmpCommand *cmd, void *opaque); 631527badbSMarkus Armbruster 64f0ccc00bSMarc-André Lureau void qmp_for_each_command(const QmpCommandList *cmds, qmp_cmd_callback_fn fn, 651527badbSMarkus Armbruster void *opaque); 667b1b5d19SPaolo Bonzini 677b1b5d19SPaolo Bonzini #endif 68