diff options
author | Timos Ampelikiotis <t.ampelikiotis@virtualopensystems.com> | 2023-10-10 11:40:56 +0000 |
---|---|---|
committer | Timos Ampelikiotis <t.ampelikiotis@virtualopensystems.com> | 2023-10-10 11:40:56 +0000 |
commit | e02cda008591317b1625707ff8e115a4841aa889 (patch) | |
tree | aee302e3cf8b59ec2d32ec481be3d1afddfc8968 /qapi/qmp-registry.c | |
parent | cc668e6b7e0ffd8c9d130513d12053cf5eda1d3b (diff) |
Introduce Virtio-loopback epsilon release:
Epsilon release introduces a new compatibility layer which make virtio-loopback
design to work with QEMU and rust-vmm vhost-user backend without require any
changes.
Signed-off-by: Timos Ampelikiotis <t.ampelikiotis@virtualopensystems.com>
Change-Id: I52e57563e08a7d0bdc002f8e928ee61ba0c53dd9
Diffstat (limited to 'qapi/qmp-registry.c')
-rw-r--r-- | qapi/qmp-registry.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/qapi/qmp-registry.c b/qapi/qmp-registry.c new file mode 100644 index 000000000..485bc5e6f --- /dev/null +++ b/qapi/qmp-registry.c @@ -0,0 +1,95 @@ +/* + * Core Definitions for QAPI/QMP Dispatch + * + * Copyright IBM, Corp. 2011 + * + * Authors: + * Anthony Liguori <aliguori@us.ibm.com> + * Michael Roth <mdroth@us.ibm.com> + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#include "qemu/osdep.h" +#include "qapi/qmp/dispatch.h" + +void qmp_register_command(QmpCommandList *cmds, const char *name, + QmpCommandFunc *fn, QmpCommandOptions options, + unsigned special_features) +{ + QmpCommand *cmd = g_malloc0(sizeof(*cmd)); + + /* QCO_COROUTINE and QCO_ALLOW_OOB are incompatible for now */ + assert(!((options & QCO_COROUTINE) && (options & QCO_ALLOW_OOB))); + + cmd->name = name; + cmd->fn = fn; + cmd->enabled = true; + cmd->options = options; + cmd->special_features = special_features; + QTAILQ_INSERT_TAIL(cmds, cmd, node); +} + +const QmpCommand *qmp_find_command(const QmpCommandList *cmds, const char *name) +{ + QmpCommand *cmd; + + QTAILQ_FOREACH(cmd, cmds, node) { + if (strcmp(cmd->name, name) == 0) { + return cmd; + } + } + return NULL; +} + +static void qmp_toggle_command(QmpCommandList *cmds, const char *name, + bool enabled, const char *disable_reason) +{ + QmpCommand *cmd; + + QTAILQ_FOREACH(cmd, cmds, node) { + if (strcmp(cmd->name, name) == 0) { + cmd->enabled = enabled; + cmd->disable_reason = disable_reason; + return; + } + } +} + +void qmp_disable_command(QmpCommandList *cmds, const char *name, + const char *disable_reason) +{ + qmp_toggle_command(cmds, name, false, disable_reason); +} + +void qmp_enable_command(QmpCommandList *cmds, const char *name) +{ + qmp_toggle_command(cmds, name, true, NULL); +} + +bool qmp_command_is_enabled(const QmpCommand *cmd) +{ + return cmd->enabled; +} + +const char *qmp_command_name(const QmpCommand *cmd) +{ + return cmd->name; +} + +bool qmp_has_success_response(const QmpCommand *cmd) +{ + return !(cmd->options & QCO_NO_SUCCESS_RESP); +} + +void qmp_for_each_command(const QmpCommandList *cmds, qmp_cmd_callback_fn fn, + void *opaque) +{ + const QmpCommand *cmd; + + QTAILQ_FOREACH(cmd, cmds, node) { + fn(cmd, opaque); + } +} |