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{
  21    QmpCommand *cmd = g_malloc0(sizeof(*cmd));
  22
  23    /* QCO_COROUTINE and QCO_ALLOW_OOB are incompatible for now */
  24    assert(!((options & QCO_COROUTINE) && (options & QCO_ALLOW_OOB)));
  25
  26    cmd->name = name;
  27    cmd->fn = fn;
  28    cmd->enabled = true;
  29    cmd->options = options;
  30    QTAILQ_INSERT_TAIL(cmds, cmd, node);
  31}
  32
  33const QmpCommand *qmp_find_command(const QmpCommandList *cmds, const char *name)
  34{
  35    QmpCommand *cmd;
  36
  37    QTAILQ_FOREACH(cmd, cmds, node) {
  38        if (strcmp(cmd->name, name) == 0) {
  39            return cmd;
  40        }
  41    }
  42    return NULL;
  43}
  44
  45static void qmp_toggle_command(QmpCommandList *cmds, const char *name,
  46                               bool enabled, const char *disable_reason)
  47{
  48    QmpCommand *cmd;
  49
  50    QTAILQ_FOREACH(cmd, cmds, node) {
  51        if (strcmp(cmd->name, name) == 0) {
  52            cmd->enabled = enabled;
  53            cmd->disable_reason = disable_reason;
  54            return;
  55        }
  56    }
  57}
  58
  59void qmp_disable_command(QmpCommandList *cmds, const char *name,
  60                         const char *disable_reason)
  61{
  62    qmp_toggle_command(cmds, name, false, disable_reason);
  63}
  64
  65void qmp_enable_command(QmpCommandList *cmds, const char *name)
  66{
  67    qmp_toggle_command(cmds, name, true, NULL);
  68}
  69
  70bool qmp_command_is_enabled(const QmpCommand *cmd)
  71{
  72    return cmd->enabled;
  73}
  74
  75const char *qmp_command_name(const QmpCommand *cmd)
  76{
  77    return cmd->name;
  78}
  79
  80bool qmp_has_success_response(const QmpCommand *cmd)
  81{
  82    return !(cmd->options & QCO_NO_SUCCESS_RESP);
  83}
  84
  85void qmp_for_each_command(const QmpCommandList *cmds, qmp_cmd_callback_fn fn,
  86                          void *opaque)
  87{
  88    const QmpCommand *cmd;
  89
  90    QTAILQ_FOREACH(cmd, cmds, node) {
  91        fn(cmd, opaque);
  92    }
  93}
  94