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