xref: /openbmc/qemu/qapi/qmp-registry.c (revision abd6cf6d)
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 "qapi/qmp-core.h"
16 
17 static QTAILQ_HEAD(QmpCommandList, QmpCommand) qmp_commands =
18     QTAILQ_HEAD_INITIALIZER(qmp_commands);
19 
20 void qmp_register_command(const char *name, QmpCommandFunc *fn)
21 {
22     QmpCommand *cmd = g_malloc0(sizeof(*cmd));
23 
24     cmd->name = name;
25     cmd->type = QCT_NORMAL;
26     cmd->fn = fn;
27     cmd->enabled = true;
28     QTAILQ_INSERT_TAIL(&qmp_commands, cmd, node);
29 }
30 
31 QmpCommand *qmp_find_command(const char *name)
32 {
33     QmpCommand *cmd;
34 
35     QTAILQ_FOREACH(cmd, &qmp_commands, node) {
36         if (strcmp(cmd->name, name) == 0) {
37             return cmd;
38         }
39     }
40     return NULL;
41 }
42 
43 void qmp_disable_command(const char *name)
44 {
45     QmpCommand *cmd;
46 
47     QTAILQ_FOREACH(cmd, &qmp_commands, node) {
48         if (strcmp(cmd->name, name) == 0) {
49             cmd->enabled = false;
50             return;
51         }
52     }
53 }
54 
55 char **qmp_get_command_list(void)
56 {
57     QmpCommand *cmd;
58     int count = 1;
59     char **list_head, **list;
60 
61     QTAILQ_FOREACH(cmd, &qmp_commands, node) {
62         count++;
63     }
64 
65     list_head = list = g_malloc0(count * sizeof(char *));
66 
67     QTAILQ_FOREACH(cmd, &qmp_commands, node) {
68         *list = strdup(cmd->name);
69         list++;
70     }
71 
72     return list_head;
73 }
74