xref: /qemu/qapi/qmp-registry.c (revision 1527badb)
143c20a43SMichael Roth /*
243c20a43SMichael Roth  * Core Definitions for QAPI/QMP Dispatch
343c20a43SMichael Roth  *
443c20a43SMichael Roth  * Copyright IBM, Corp. 2011
543c20a43SMichael Roth  *
643c20a43SMichael Roth  * Authors:
743c20a43SMichael Roth  *  Anthony Liguori   <aliguori@us.ibm.com>
843c20a43SMichael Roth  *  Michael Roth      <mdroth@us.ibm.com>
943c20a43SMichael Roth  *
1043c20a43SMichael Roth  * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
1143c20a43SMichael Roth  * See the COPYING.LIB file in the top-level directory.
1243c20a43SMichael Roth  *
1343c20a43SMichael Roth  */
1443c20a43SMichael Roth 
15cbf21151SPeter Maydell #include "qemu/osdep.h"
167b1b5d19SPaolo Bonzini #include "qapi/qmp/dispatch.h"
1743c20a43SMichael Roth 
18*1527badbSMarkus Armbruster void qmp_register_command(QmpCommandList *cmds, const char *name,
19*1527badbSMarkus Armbruster                           QmpCommandFunc *fn, QmpCommandOptions options)
2043c20a43SMichael Roth {
217267c094SAnthony Liguori     QmpCommand *cmd = g_malloc0(sizeof(*cmd));
2243c20a43SMichael Roth 
2343c20a43SMichael Roth     cmd->name = name;
2443c20a43SMichael Roth     cmd->fn = fn;
25abd6cf6dSMichael Roth     cmd->enabled = true;
26d34b867dSLuiz Capitulino     cmd->options = options;
27*1527badbSMarkus Armbruster     QTAILQ_INSERT_TAIL(cmds, cmd, node);
2843c20a43SMichael Roth }
2943c20a43SMichael Roth 
30*1527badbSMarkus Armbruster void qmp_unregister_command(QmpCommandList *cmds, const char *name)
3160b03e4eSMarkus Armbruster {
32*1527badbSMarkus Armbruster     QmpCommand *cmd = qmp_find_command(cmds, name);
3360b03e4eSMarkus Armbruster 
34*1527badbSMarkus Armbruster     QTAILQ_REMOVE(cmds, cmd, node);
3560b03e4eSMarkus Armbruster     g_free(cmd);
3660b03e4eSMarkus Armbruster }
3760b03e4eSMarkus Armbruster 
38*1527badbSMarkus Armbruster QmpCommand *qmp_find_command(QmpCommandList *cmds, const char *name)
3943c20a43SMichael Roth {
40abd6cf6dSMichael Roth     QmpCommand *cmd;
4143c20a43SMichael Roth 
42*1527badbSMarkus Armbruster     QTAILQ_FOREACH(cmd, cmds, node) {
43abd6cf6dSMichael Roth         if (strcmp(cmd->name, name) == 0) {
44abd6cf6dSMichael Roth             return cmd;
4543c20a43SMichael Roth         }
4643c20a43SMichael Roth     }
4743c20a43SMichael Roth     return NULL;
4843c20a43SMichael Roth }
49abd6cf6dSMichael Roth 
50*1527badbSMarkus Armbruster static void qmp_toggle_command(QmpCommandList *cmds, const char *name,
51*1527badbSMarkus Armbruster                                bool enabled)
52abd6cf6dSMichael Roth {
53abd6cf6dSMichael Roth     QmpCommand *cmd;
54abd6cf6dSMichael Roth 
55*1527badbSMarkus Armbruster     QTAILQ_FOREACH(cmd, cmds, node) {
56abd6cf6dSMichael Roth         if (strcmp(cmd->name, name) == 0) {
57f22d85e9SMichael Roth             cmd->enabled = enabled;
58abd6cf6dSMichael Roth             return;
59abd6cf6dSMichael Roth         }
60abd6cf6dSMichael Roth     }
61abd6cf6dSMichael Roth }
62abd6cf6dSMichael Roth 
63*1527badbSMarkus Armbruster void qmp_disable_command(QmpCommandList *cmds, const char *name)
64f22d85e9SMichael Roth {
65*1527badbSMarkus Armbruster     qmp_toggle_command(cmds, name, false);
66f22d85e9SMichael Roth }
67f22d85e9SMichael Roth 
68*1527badbSMarkus Armbruster void qmp_enable_command(QmpCommandList *cmds, const char *name)
69f22d85e9SMichael Roth {
70*1527badbSMarkus Armbruster     qmp_toggle_command(cmds, name, true);
71f22d85e9SMichael Roth }
72f22d85e9SMichael Roth 
738dc4d915SMark Wu bool qmp_command_is_enabled(const QmpCommand *cmd)
74bf95c0d5SMichael Roth {
75bf95c0d5SMichael Roth     return cmd->enabled;
76bf95c0d5SMichael Roth }
778dc4d915SMark Wu 
788dc4d915SMark Wu const char *qmp_command_name(const QmpCommand *cmd)
798dc4d915SMark Wu {
808dc4d915SMark Wu     return cmd->name;
81bf95c0d5SMichael Roth }
82bf95c0d5SMichael Roth 
830106dc4fSMark Wu bool qmp_has_success_response(const QmpCommand *cmd)
840106dc4fSMark Wu {
850106dc4fSMark Wu     return !(cmd->options & QCO_NO_SUCCESS_RESP);
860106dc4fSMark Wu }
870106dc4fSMark Wu 
88*1527badbSMarkus Armbruster void qmp_for_each_command(QmpCommandList *cmds, qmp_cmd_callback_fn fn,
89*1527badbSMarkus Armbruster                           void *opaque)
90abd6cf6dSMichael Roth {
91abd6cf6dSMichael Roth     QmpCommand *cmd;
92abd6cf6dSMichael Roth 
93*1527badbSMarkus Armbruster     QTAILQ_FOREACH(cmd, cmds, node) {
948dc4d915SMark Wu         fn(cmd, opaque);
95abd6cf6dSMichael Roth     }
96abd6cf6dSMichael Roth }
97