mirror of
https://git.proxmox.com/git/qemu
synced 2025-06-26 22:32:17 +00:00

In the original code, qmp_get_command_list is used to construct a list of all commands' name. To get the information of all qga commands, it traverses the name list and search the command info with its name. So it can cause O(n^2) in the number of commands. This patch adds an interface to traverse the qmp command list by QmpCommand to replace qmp_get_command_list. It can decrease the complexity from O(n^2) to O(n). Signed-off-by: Mark Wu <wudxw@linux.vnet.ibm.com> Reviewed-by: Eric Blake <eblake@redhat.com> *fix up commit subject Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
72 lines
1.8 KiB
C
72 lines
1.8 KiB
C
/*
|
|
* QEMU Guest Agent common/cross-platform command implementations
|
|
*
|
|
* Copyright IBM Corp. 2012
|
|
*
|
|
* Authors:
|
|
* Michael Roth <mdroth@linux.vnet.ibm.com>
|
|
*
|
|
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
|
* See the COPYING file in the top-level directory.
|
|
*/
|
|
|
|
#include <glib.h>
|
|
#include "qga/guest-agent-core.h"
|
|
#include "qga-qmp-commands.h"
|
|
#include "qapi/qmp/qerror.h"
|
|
|
|
/* Note: in some situations, like with the fsfreeze, logging may be
|
|
* temporarilly disabled. if it is necessary that a command be able
|
|
* to log for accounting purposes, check ga_logging_enabled() beforehand,
|
|
* and use the QERR_QGA_LOGGING_DISABLED to generate an error
|
|
*/
|
|
void slog(const gchar *fmt, ...)
|
|
{
|
|
va_list ap;
|
|
|
|
va_start(ap, fmt);
|
|
g_logv("syslog", G_LOG_LEVEL_INFO, fmt, ap);
|
|
va_end(ap);
|
|
}
|
|
|
|
int64_t qmp_guest_sync_delimited(int64_t id, Error **errp)
|
|
{
|
|
ga_set_response_delimited(ga_state);
|
|
return id;
|
|
}
|
|
|
|
int64_t qmp_guest_sync(int64_t id, Error **errp)
|
|
{
|
|
return id;
|
|
}
|
|
|
|
void qmp_guest_ping(Error **err)
|
|
{
|
|
slog("guest-ping called");
|
|
}
|
|
|
|
static void qmp_command_info(QmpCommand *cmd, void *opaque)
|
|
{
|
|
GuestAgentInfo *info = opaque;
|
|
GuestAgentCommandInfo *cmd_info;
|
|
GuestAgentCommandInfoList *cmd_info_list;
|
|
|
|
cmd_info = g_malloc0(sizeof(GuestAgentCommandInfo));
|
|
cmd_info->name = g_strdup(qmp_command_name(cmd));
|
|
cmd_info->enabled = qmp_command_is_enabled(cmd);
|
|
|
|
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;
|
|
}
|
|
|
|
struct GuestAgentInfo *qmp_guest_info(Error **err)
|
|
{
|
|
GuestAgentInfo *info = g_malloc0(sizeof(GuestAgentInfo));
|
|
|
|
info->version = g_strdup(QEMU_VERSION);
|
|
qmp_for_each_command(qmp_command_info, info);
|
|
return info;
|
|
}
|