Statistics
| Branch: | Revision:

root / qapi / qmp-registry.c @ dc1c13d9

History | View | Annotate | Download (2 kB)

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
                          QmpCommandOptions options)
22
{
23
    QmpCommand *cmd = g_malloc0(sizeof(*cmd));
24

    
25
    cmd->name = name;
26
    cmd->type = QCT_NORMAL;
27
    cmd->fn = fn;
28
    cmd->enabled = true;
29
    cmd->options = options;
30
    QTAILQ_INSERT_TAIL(&qmp_commands, cmd, node);
31
}
32

    
33
QmpCommand *qmp_find_command(const char *name)
34
{
35
    QmpCommand *cmd;
36

    
37
    QTAILQ_FOREACH(cmd, &qmp_commands, node) {
38
        if (strcmp(cmd->name, name) == 0) {
39
            return cmd;
40
        }
41
    }
42
    return NULL;
43
}
44

    
45
static void qmp_toggle_command(const char *name, bool enabled)
46
{
47
    QmpCommand *cmd;
48

    
49
    QTAILQ_FOREACH(cmd, &qmp_commands, node) {
50
        if (strcmp(cmd->name, name) == 0) {
51
            cmd->enabled = enabled;
52
            return;
53
        }
54
    }
55
}
56

    
57
void qmp_disable_command(const char *name)
58
{
59
    qmp_toggle_command(name, false);
60
}
61

    
62
void qmp_enable_command(const char *name)
63
{
64
    qmp_toggle_command(name, true);
65
}
66

    
67
bool qmp_command_is_enabled(const char *name)
68
{
69
    QmpCommand *cmd;
70

    
71
    QTAILQ_FOREACH(cmd, &qmp_commands, node) {
72
        if (strcmp(cmd->name, name) == 0) {
73
            return cmd->enabled;
74
        }
75
    }
76

    
77
    return false;
78
}
79

    
80
char **qmp_get_command_list(void)
81
{
82
    QmpCommand *cmd;
83
    int count = 1;
84
    char **list_head, **list;
85

    
86
    QTAILQ_FOREACH(cmd, &qmp_commands, node) {
87
        count++;
88
    }
89

    
90
    list_head = list = g_malloc0(count * sizeof(char *));
91

    
92
    QTAILQ_FOREACH(cmd, &qmp_commands, node) {
93
        *list = strdup(cmd->name);
94
        list++;
95
    }
96

    
97
    return list_head;
98
}