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