xref: /qemu/qapi/qmp-registry.c (revision 6604e475)
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 
qmp_register_command(QmpCommandList * cmds,const char * name,QmpCommandFunc * fn,QmpCommandOptions options,unsigned special_features)181527badbSMarkus Armbruster void qmp_register_command(QmpCommandList *cmds, const char *name,
19*6604e475SMarkus Armbruster                           QmpCommandFunc *fn, QmpCommandOptions options,
20*6604e475SMarkus Armbruster                           unsigned special_features)
2143c20a43SMichael Roth {
227267c094SAnthony Liguori     QmpCommand *cmd = g_malloc0(sizeof(*cmd));
2343c20a43SMichael Roth 
249ce44e2cSKevin Wolf     /* QCO_COROUTINE and QCO_ALLOW_OOB are incompatible for now */
259ce44e2cSKevin Wolf     assert(!((options & QCO_COROUTINE) && (options & QCO_ALLOW_OOB)));
269ce44e2cSKevin Wolf 
2743c20a43SMichael Roth     cmd->name = name;
2843c20a43SMichael Roth     cmd->fn = fn;
29abd6cf6dSMichael Roth     cmd->enabled = true;
30d34b867dSLuiz Capitulino     cmd->options = options;
31*6604e475SMarkus Armbruster     cmd->special_features = special_features;
321527badbSMarkus Armbruster     QTAILQ_INSERT_TAIL(cmds, cmd, node);
3343c20a43SMichael Roth }
3443c20a43SMichael Roth 
qmp_find_command(const QmpCommandList * cmds,const char * name)35f0ccc00bSMarc-André Lureau const QmpCommand *qmp_find_command(const QmpCommandList *cmds, const char *name)
3643c20a43SMichael Roth {
37abd6cf6dSMichael Roth     QmpCommand *cmd;
3843c20a43SMichael Roth 
391527badbSMarkus Armbruster     QTAILQ_FOREACH(cmd, cmds, node) {
40abd6cf6dSMichael Roth         if (strcmp(cmd->name, name) == 0) {
41abd6cf6dSMichael Roth             return cmd;
4243c20a43SMichael Roth         }
4343c20a43SMichael Roth     }
4443c20a43SMichael Roth     return NULL;
4543c20a43SMichael Roth }
46abd6cf6dSMichael Roth 
qmp_toggle_command(QmpCommandList * cmds,const char * name,bool enabled,const char * disable_reason)471527badbSMarkus Armbruster static void qmp_toggle_command(QmpCommandList *cmds, const char *name,
48c98939daSMarc-André Lureau                                bool enabled, const char *disable_reason)
49abd6cf6dSMichael Roth {
50abd6cf6dSMichael Roth     QmpCommand *cmd;
51abd6cf6dSMichael Roth 
521527badbSMarkus Armbruster     QTAILQ_FOREACH(cmd, cmds, node) {
53abd6cf6dSMichael Roth         if (strcmp(cmd->name, name) == 0) {
54f22d85e9SMichael Roth             cmd->enabled = enabled;
55c98939daSMarc-André Lureau             cmd->disable_reason = disable_reason;
56abd6cf6dSMichael Roth             return;
57abd6cf6dSMichael Roth         }
58abd6cf6dSMichael Roth     }
59abd6cf6dSMichael Roth }
60abd6cf6dSMichael Roth 
qmp_disable_command(QmpCommandList * cmds,const char * name,const char * disable_reason)61c98939daSMarc-André Lureau void qmp_disable_command(QmpCommandList *cmds, const char *name,
62c98939daSMarc-André Lureau                          const char *disable_reason)
63f22d85e9SMichael Roth {
64c98939daSMarc-André Lureau     qmp_toggle_command(cmds, name, false, disable_reason);
65f22d85e9SMichael Roth }
66f22d85e9SMichael Roth 
qmp_enable_command(QmpCommandList * cmds,const char * name)671527badbSMarkus Armbruster void qmp_enable_command(QmpCommandList *cmds, const char *name)
68f22d85e9SMichael Roth {
69c98939daSMarc-André Lureau     qmp_toggle_command(cmds, name, true, NULL);
70f22d85e9SMichael Roth }
71f22d85e9SMichael Roth 
qmp_command_is_enabled(const QmpCommand * cmd)728dc4d915SMark Wu bool qmp_command_is_enabled(const QmpCommand *cmd)
73bf95c0d5SMichael Roth {
74bf95c0d5SMichael Roth     return cmd->enabled;
75bf95c0d5SMichael Roth }
768dc4d915SMark Wu 
qmp_command_name(const QmpCommand * cmd)778dc4d915SMark Wu const char *qmp_command_name(const QmpCommand *cmd)
788dc4d915SMark Wu {
798dc4d915SMark Wu     return cmd->name;
80bf95c0d5SMichael Roth }
81bf95c0d5SMichael Roth 
qmp_has_success_response(const QmpCommand * cmd)820106dc4fSMark Wu bool qmp_has_success_response(const QmpCommand *cmd)
830106dc4fSMark Wu {
840106dc4fSMark Wu     return !(cmd->options & QCO_NO_SUCCESS_RESP);
850106dc4fSMark Wu }
860106dc4fSMark Wu 
qmp_for_each_command(const QmpCommandList * cmds,qmp_cmd_callback_fn fn,void * opaque)87f0ccc00bSMarc-André Lureau void qmp_for_each_command(const QmpCommandList *cmds, qmp_cmd_callback_fn fn,
881527badbSMarkus Armbruster                           void *opaque)
89abd6cf6dSMichael Roth {
90f0ccc00bSMarc-André Lureau     const QmpCommand *cmd;
91abd6cf6dSMichael Roth 
921527badbSMarkus Armbruster     QTAILQ_FOREACH(cmd, cmds, node) {
938dc4d915SMark Wu         fn(cmd, opaque);
94abd6cf6dSMichael Roth     }
95abd6cf6dSMichael Roth }
96