qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

qmp-registry.c (2353B)


      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 
     18 void 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 
     35 const 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 
     47 static 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 
     61 void 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 
     67 void qmp_enable_command(QmpCommandList *cmds, const char *name)
     68 {
     69     qmp_toggle_command(cmds, name, true, NULL);
     70 }
     71 
     72 bool qmp_command_is_enabled(const QmpCommand *cmd)
     73 {
     74     return cmd->enabled;
     75 }
     76 
     77 const char *qmp_command_name(const QmpCommand *cmd)
     78 {
     79     return cmd->name;
     80 }
     81 
     82 bool qmp_has_success_response(const QmpCommand *cmd)
     83 {
     84     return !(cmd->options & QCO_NO_SUCCESS_RESP);
     85 }
     86 
     87 void 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 }