blob: 1e4240fd0dbc0fa0f799f37da8a1a181db66bf5d [file] [log] [blame]
Michael Roth43c20a42011-07-19 14:50:36 -05001/*
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
Markus Armbruster121d0712016-06-29 10:12:57 +020014#ifndef QAPI_QMP_DISPATCH_H
15#define QAPI_QMP_DISPATCH_H
Michael Roth43c20a42011-07-19 14:50:36 -050016
Kevin Wolf41725fa2020-10-05 17:58:47 +020017#include "monitor/monitor.h"
Markus Armbruster452fcdb2018-02-01 12:18:39 +010018#include "qemu/queue.h"
Michael Roth43c20a42011-07-19 14:50:36 -050019
20typedef void (QmpCommandFunc)(QDict *, QObject **, Error **);
21
Luiz Capitulinod34b8672012-05-08 14:24:44 -030022typedef enum QmpCommandOptions
23{
Peter Xu876c6752018-03-09 17:00:00 +080024 QCO_NO_SUCCESS_RESP = (1U << 0),
25 QCO_ALLOW_OOB = (1U << 1),
Igor Mammedovd6fe3d02018-05-11 18:51:43 +020026 QCO_ALLOW_PRECONFIG = (1U << 2),
Kevin Wolf04f22362020-10-05 17:58:49 +020027 QCO_COROUTINE = (1U << 3),
Luiz Capitulinod34b8672012-05-08 14:24:44 -030028} QmpCommandOptions;
29
Michael Roth43c20a42011-07-19 14:50:36 -050030typedef struct QmpCommand
31{
32 const char *name;
Kevin Wolf9ce44e22020-10-05 17:58:50 +020033 /* Runs in coroutine context if QCO_COROUTINE is set */
Michael Roth43c20a42011-07-19 14:50:36 -050034 QmpCommandFunc *fn;
Luiz Capitulinod34b8672012-05-08 14:24:44 -030035 QmpCommandOptions options;
Markus Armbruster6604e472021-10-28 12:25:17 +020036 unsigned special_features;
Michael Roth43c20a42011-07-19 14:50:36 -050037 QTAILQ_ENTRY(QmpCommand) node;
Michael Rothabd6cf62011-12-06 22:03:42 -060038 bool enabled;
Marc-André Lureauc98939d2021-02-19 12:28:14 +040039 const char *disable_reason;
Michael Roth43c20a42011-07-19 14:50:36 -050040} QmpCommand;
41
Markus Armbruster1527bad2017-03-03 13:32:25 +010042typedef QTAILQ_HEAD(QmpCommandList, QmpCommand) QmpCommandList;
43
44void qmp_register_command(QmpCommandList *cmds, const char *name,
Markus Armbruster6604e472021-10-28 12:25:17 +020045 QmpCommandFunc *fn, QmpCommandOptions options,
46 unsigned special_features);
Marc-André Lureauf0ccc002020-03-16 18:18:24 +010047const QmpCommand *qmp_find_command(const QmpCommandList *cmds,
48 const char *name);
Marc-André Lureauc98939d2021-02-19 12:28:14 +040049void qmp_disable_command(QmpCommandList *cmds, const char *name,
50 const char *err_msg);
Markus Armbruster1527bad2017-03-03 13:32:25 +010051void qmp_enable_command(QmpCommandList *cmds, const char *name);
52
Mark Wu8dc4d912013-10-09 11:25:07 +080053bool qmp_command_is_enabled(const QmpCommand *cmd);
Paolo Bonzini164dafd2020-10-27 04:44:18 -040054bool qmp_command_available(const QmpCommand *cmd, Error **errp);
Mark Wu8dc4d912013-10-09 11:25:07 +080055const char *qmp_command_name(const QmpCommand *cmd);
Mark Wu0106dc42013-10-09 10:37:26 +080056bool qmp_has_success_response(const QmpCommand *cmd);
Markus Armbrustercee32792018-07-03 10:53:48 +020057QDict *qmp_error_response(Error *err);
Marc-André Lureauf0ccc002020-03-16 18:18:24 +010058QDict *qmp_dispatch(const QmpCommandList *cmds, QObject *request,
Kevin Wolf41725fa2020-10-05 17:58:47 +020059 bool allow_oob, Monitor *cur_mon);
Marc-André Lureau2aa788f2018-08-29 15:40:35 +020060bool qmp_is_oob(const QDict *dict);
Markus Armbruster1527bad2017-03-03 13:32:25 +010061
Marc-André Lureauf0ccc002020-03-16 18:18:24 +010062typedef void (*qmp_cmd_callback_fn)(const QmpCommand *cmd, void *opaque);
Markus Armbruster1527bad2017-03-03 13:32:25 +010063
Marc-André Lureauf0ccc002020-03-16 18:18:24 +010064void qmp_for_each_command(const QmpCommandList *cmds, qmp_cmd_callback_fn fn,
Markus Armbruster1527bad2017-03-03 13:32:25 +010065 void *opaque);
Michael Roth43c20a42011-07-19 14:50:36 -050066
67#endif