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; }