qemu/qapi/qmp-registry.c
<<
>>
Prefs
   1/*
   2 * Core Definitions for QAPI/QMP Dispatch
   3 *
   4 * Copyright IBM, Corp. 2011
   5 *
   6 * Authors:
   7 *  Anthony Liguori   <aliguori@us.ibm.com>
   8 *  Michael Roth      <mdroth@us.ibm.com>
   9 *
  10 * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
  11 * See the COPYING.LIB file in the top-level directory.
  12 *
  13 */
  14
  15#include "qemu/osdep.h"
  16#include "qapi/qmp/dispatch.h"
  17
  18void qmp_register_command(QmpCommandList *cmds, const char *name,
  19                          QmpCommandFunc *fn, QmpCommandOptions options,
  20                          unsigned special_features)
  21{
  22    QmpCommand *cmd = g_malloc0(sizeof(*cmd));
  23
  24    /* QCO_COROUTINE and QCO_ALLOW_OOB are incompatible for now */
  25    assert(!((options & QCO_COROUTINE) && (options & QCO_ALLOW_OOB)));
  26
  27    cmd->name = name;
  28    cmd->fn = fn;
  29    cmd->enabled = true;
  30    cmd->options = options;
  31    cmd->special_features = special_features;
  32    QTAILQ_INSERT_TAIL(cmds, cmd, node);
  33}
  34
  35const QmpCommand *qmp_find_command(const QmpCommandList *cmds, const char *name)
  36{
  37    QmpCommand *cmd;
  38
  39    QTAILQ_FOREACH(cmd, cmds, node) {
  40        if (strcmp(cmd->name, name) == 0) {
  41            return cmd;
  42        }
  43    }
  44    return NULL;
  45}
  46
  47static void qmp_toggle_command(QmpCommandList *cmds, const char *name,
  48                               bool enabled, const char *disable_reason)
  49{
  50    QmpCommand *cmd;
  51
  52    QTAILQ_FOREACH(cmd, cmds, node) {
  53        if (strcmp(cmd->name, name) == 0) {
  54            cmd->enabled = enabled;
  55            cmd->disable_reason = disable_reason;
  56            return;
  57        }
  58    }
  59}
  60
  61void qmp_disable_command(QmpCommandList *cmds, const char *name,
  62                         const char *disable_reason)
  63{
  64    qmp_toggle_command(cmds, name, false, disable_reason);
  65}
  66
  67void qmp_enable_command(QmpCommandList *cmds, const char *name)
  68{
  69    qmp_toggle_command(cmds, name, true, NULL);
  70}
  71
  72bool qmp_command_is_enabled(const QmpCommand *cmd)
  73{
  74    return cmd->enabled;
  75}
  76
  77const char *qmp_command_name(const QmpCommand *cmd)
  78{
  79    return cmd->name;
  80}
  81
  82bool qmp_has_success_response(const QmpCommand *cmd)
  83{
  84    return !(cmd->options & QCO_NO_SUCCESS_RESP);
  85}
  86
  87void qmp_for_each_command(const QmpCommandList *cmds, qmp_cmd_callback_fn fn,
  88                          void *opaque)
  89{
  90    const QmpCommand *cmd;
  91
  92    QTAILQ_FOREACH(cmd, cmds, node) {
  93        fn(cmd, opaque);
  94    }
  95}
  96