| 1 | /* |
| 2 | * Core Definitions for QAPI/QMP Dispatch |
| 3 | * |
| 4 | * Copyright IBM, Corp. 2011 |
| 5 | * |
| 6 | * Authors: |
| 7 | * Anthony Liguori <aliguori@us.ibm.com> |
| 8 | * |
| 9 | * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. |
| 10 | * See the COPYING.LIB file in the top-level directory. |
| 11 | * |
| 12 | */ |
| 13 | |
| 14 | #ifndef QAPI_QMP_DISPATCH_H |
| 15 | #define QAPI_QMP_DISPATCH_H |
| 16 | |
| 17 | #include "qemu/queue.h" |
| 18 | |
| 19 | typedef void (QmpCommandFunc)(QDict *, QObject **, Error **); |
| 20 | |
| 21 | typedef enum QmpCommandOptions |
| 22 | { |
| 23 | QCO_NO_SUCCESS_RESP = (1U << 0), |
| 24 | QCO_ALLOW_OOB = (1U << 1), |
| 25 | QCO_ALLOW_PRECONFIG = (1U << 2), |
| 26 | QCO_COROUTINE = (1U << 3), |
| 27 | } QmpCommandOptions; |
| 28 | |
| 29 | typedef struct QmpCommand |
| 30 | { |
| 31 | const char *name; |
| 32 | /* Runs in coroutine context if QCO_COROUTINE is set */ |
| 33 | QmpCommandFunc *fn; |
| 34 | QmpCommandOptions options; |
| 35 | uint64_t features; |
| 36 | QTAILQ_ENTRY(QmpCommand) node; |
| 37 | bool enabled; |
| 38 | const char *disable_reason; |
| 39 | } QmpCommand; |
| 40 | |
| 41 | typedef QTAILQ_HEAD(QmpCommandList, QmpCommand) QmpCommandList; |
| 42 | |
| 43 | void qmp_register_command(QmpCommandList *cmds, const char *name, |
| 44 | QmpCommandFunc *fn, QmpCommandOptions options, |
| 45 | uint64_t features); |
| 46 | const QmpCommand *qmp_find_command(const QmpCommandList *cmds, |
| 47 | const char *name); |
| 48 | void qmp_disable_command(QmpCommandList *cmds, const char *name, |
| 49 | const char *err_msg); |
| 50 | void qmp_enable_command(QmpCommandList *cmds, const char *name); |
| 51 | |
| 52 | bool qmp_command_is_enabled(const QmpCommand *cmd); |
| 53 | bool qmp_command_available(const QmpCommand *cmd, Error **errp); |
| 54 | const char *qmp_command_name(const QmpCommand *cmd); |
| 55 | bool qmp_has_success_response(const QmpCommand *cmd); |
| 56 | QDict *qmp_error_response(Error *err); |
| 57 | QDict *coroutine_mixed_fn qmp_dispatch(const QmpCommandList *cmds, QObject *request, |
| 58 | bool allow_oob, Monitor *cur_mon); |
| 59 | bool qmp_is_oob(const QDict *dict); |
| 60 | |
| 61 | typedef void (*qmp_cmd_callback_fn)(const QmpCommand *cmd, void *opaque); |
| 62 | |
| 63 | void qmp_for_each_command(const QmpCommandList *cmds, qmp_cmd_callback_fn fn, |
| 64 | void *opaque); |
| 65 | |
| 66 | #endif |