diff options
author | Michael Roth <mdroth@linux.vnet.ibm.com> | 2011-12-06 22:03:43 -0600 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2011-12-12 17:06:21 -0600 |
commit | bf95c0d55c24e8ce1c03e1ba491437297f8f96f4 (patch) | |
tree | b389cce1a05698fcb908d44723ce5fe96a6773e1 | |
parent | abd6cf6d8e6be55a6535bf27b692bdf520462c15 (diff) |
guest agent: add supported command list to guest-info RPC
Not that there is blacklisting functionality we can no longer infer
the agent's capabilities via version. This patch extends the current
guest-info RPC to also return a list of dictionaries containing the name
of each supported RPC, along with a boolean indicating whether or not
the command has been disabled by a guest administrator/distro.
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
-rw-r--r-- | qapi-schema-guest.json | 6 | ||||
-rw-r--r-- | qapi/qmp-core.h | 1 | ||||
-rw-r--r-- | qapi/qmp-registry.c | 13 | ||||
-rw-r--r-- | qga/guest-agent-commands.c | 24 |
4 files changed, 43 insertions, 1 deletions
diff --git a/qapi-schema-guest.json b/qapi-schema-guest.json index fde5971e87..29989fe646 100644 --- a/qapi-schema-guest.json +++ b/qapi-schema-guest.json @@ -43,7 +43,11 @@ # # Since: 0.15.0 ## -{ 'type': 'GuestAgentInfo', 'data': {'version': 'str'} } +{ 'type': 'GuestAgentCommandInfo', + 'data': { 'name': 'str', 'enabled': 'bool' } } +{ 'type': 'GuestAgentInfo', + 'data': { 'version': 'str', + 'supported_commands': ['GuestAgentCommandInfo'] } } { 'command': 'guest-info', 'returns': 'GuestAgentInfo' } diff --git a/qapi/qmp-core.h b/qapi/qmp-core.h index 3cf1781fa4..3bb3acb589 100644 --- a/qapi/qmp-core.h +++ b/qapi/qmp-core.h @@ -38,6 +38,7 @@ void qmp_register_command(const char *name, QmpCommandFunc *fn); QmpCommand *qmp_find_command(const char *name); QObject *qmp_dispatch(QObject *request); void qmp_disable_command(const char *name); +bool qmp_command_is_enabled(const char *name); char **qmp_get_command_list(void); #endif diff --git a/qapi/qmp-registry.c b/qapi/qmp-registry.c index abafa347fb..25c89ad098 100644 --- a/qapi/qmp-registry.c +++ b/qapi/qmp-registry.c @@ -52,6 +52,19 @@ void qmp_disable_command(const char *name) } } +bool qmp_command_is_enabled(const char *name) +{ + QmpCommand *cmd; + + QTAILQ_FOREACH(cmd, &qmp_commands, node) { + if (strcmp(cmd->name, name) == 0) { + return cmd->enabled; + } + } + + return false; +} + char **qmp_get_command_list(void) { QmpCommand *cmd; diff --git a/qga/guest-agent-commands.c b/qga/guest-agent-commands.c index 6da9904819..a09c8ca230 100644 --- a/qga/guest-agent-commands.c +++ b/qga/guest-agent-commands.c @@ -57,9 +57,33 @@ void qmp_guest_ping(Error **err) struct GuestAgentInfo *qmp_guest_info(Error **err) { GuestAgentInfo *info = g_malloc0(sizeof(GuestAgentInfo)); + GuestAgentCommandInfo *cmd_info; + GuestAgentCommandInfoList *cmd_info_list; + char **cmd_list_head, **cmd_list; info->version = g_strdup(QGA_VERSION); + cmd_list_head = cmd_list = qmp_get_command_list(); + if (*cmd_list_head == NULL) { + goto out; + } + + while (*cmd_list) { + cmd_info = g_malloc0(sizeof(GuestAgentCommandInfo)); + cmd_info->name = strdup(*cmd_list); + cmd_info->enabled = qmp_command_is_enabled(cmd_info->name); + + cmd_info_list = g_malloc0(sizeof(GuestAgentCommandInfoList)); + cmd_info_list->value = cmd_info; + cmd_info_list->next = info->supported_commands; + info->supported_commands = cmd_info_list; + + g_free(*cmd_list); + cmd_list++; + } + +out: + g_free(cmd_list_head); return info; } |