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