| /* |
| * Core Definitions for QAPI/QMP Dispatch |
| * |
| * Copyright IBM, Corp. 2011 |
| * |
| * Authors: |
| * Anthony Liguori <aliguori@us.ibm.com> |
| * |
| * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. |
| * See the COPYING.LIB file in the top-level directory. |
| * |
| */ |
| |
| #ifndef QAPI_QMP_DISPATCH_H |
| #define QAPI_QMP_DISPATCH_H |
| |
| #include "monitor/monitor.h" |
| #include "qemu/queue.h" |
| |
| typedef void (QmpCommandFunc)(QDict *, QObject **, Error **); |
| |
| typedef enum QmpCommandOptions |
| { |
| QCO_NO_SUCCESS_RESP = (1U << 0), |
| QCO_ALLOW_OOB = (1U << 1), |
| QCO_ALLOW_PRECONFIG = (1U << 2), |
| QCO_COROUTINE = (1U << 3), |
| } QmpCommandOptions; |
| |
| typedef struct QmpCommand |
| { |
| const char *name; |
| /* Runs in coroutine context if QCO_COROUTINE is set */ |
| QmpCommandFunc *fn; |
| QmpCommandOptions options; |
| unsigned special_features; |
| QTAILQ_ENTRY(QmpCommand) node; |
| bool enabled; |
| const char *disable_reason; |
| } QmpCommand; |
| |
| typedef QTAILQ_HEAD(QmpCommandList, QmpCommand) QmpCommandList; |
| |
| void qmp_register_command(QmpCommandList *cmds, const char *name, |
| QmpCommandFunc *fn, QmpCommandOptions options, |
| unsigned special_features); |
| const QmpCommand *qmp_find_command(const QmpCommandList *cmds, |
| const char *name); |
| void qmp_disable_command(QmpCommandList *cmds, const char *name, |
| const char *err_msg); |
| void qmp_enable_command(QmpCommandList *cmds, const char *name); |
| |
| bool qmp_command_is_enabled(const QmpCommand *cmd); |
| bool qmp_command_available(const QmpCommand *cmd, Error **errp); |
| const char *qmp_command_name(const QmpCommand *cmd); |
| bool qmp_has_success_response(const QmpCommand *cmd); |
| QDict *qmp_error_response(Error *err); |
| QDict *qmp_dispatch(const QmpCommandList *cmds, QObject *request, |
| bool allow_oob, Monitor *cur_mon); |
| bool qmp_is_oob(const QDict *dict); |
| |
| typedef void (*qmp_cmd_callback_fn)(const QmpCommand *cmd, void *opaque); |
| |
| void qmp_for_each_command(const QmpCommandList *cmds, qmp_cmd_callback_fn fn, |
| void *opaque); |
| |
| #endif |