From 7df21adcde63b49a910b8571228ad755d193adf1 Mon Sep 17 00:00:00 2001 From: Michael Roth Date: Wed, 7 Mar 2012 11:35:48 -0500 Subject: [PATCH 88/98] qemu-ga: separate out common commands from posix-specific ones Many of the current RPC implementations are very much POSIX-specific and require complete re-writes for Windows. There are however a small set of core guest agent commands that are common to both, and other commands such as guest-file-* which *may* be portable. So we introduce commands.c for the latter, and will rename guest-agent-commands.c to commands-posix.c in a future commit. Windows implementations will go in commands-win32.c, eventually. (cherry picked from commit 42074a9d4d4cf0b7c2a3210de424f9b11268abb4) Conflicts: qga/guest-agent-commands.c RHEL6 Note: Did not conflict, but changed line 44 in commands.c to use qemu_mallocz() rather than g_malloc0(). Signed-off-by: Jeff Cody Signed-off-by: Michal Novotny --- Makefile.objs | 2 +- qga/commands.c | 73 ++++++++++++++++++++++++++++++++++++++++++++ qga/guest-agent-commands.c | 59 +----------------------------------- qga/guest-agent-core.h | 1 + 4 files changed, 76 insertions(+), 59 deletions(-) create mode 100644 qga/commands.c diff --git a/Makefile.objs b/Makefile.objs index d47cbc4..5b4e117 100644 --- a/Makefile.objs +++ b/Makefile.objs @@ -197,7 +197,7 @@ qapi-obj-y = $(addprefix qapi/, $(qapi-nested-y)) ###################################################################### # guest agent -qga-nested-y = guest-agent-commands.o guest-agent-command-state.o +qga-nested-y = commands.o guest-agent-commands.o guest-agent-command-state.o qga-nested-y += channel-posix.o qga-obj-y = $(addprefix qga/, $(qga-nested-y)) qga-obj-y += qemu-ga.o qemu-tool.o qemu-error.o qemu-sockets.o module.o qemu-option.o cutils.o osdep.o diff --git a/qga/commands.c b/qga/commands.c new file mode 100644 index 0000000..ba0a2dc --- /dev/null +++ b/qga/commands.c @@ -0,0 +1,73 @@ +/* + * QEMU Guest Agent common/cross-platform command implementations + * + * Copyright IBM Corp. 2012 + * + * Authors: + * Michael Roth + * + * 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 +#include "qga/guest-agent-core.h" +#include "qga-qmp-commands.h" +#include "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(int64_t id, Error **errp) +{ + return id; +} + +void qmp_guest_ping(Error **err) +{ + slog("guest-ping called"); +} + +struct GuestAgentInfo *qmp_guest_info(Error **err) +{ + GuestAgentInfo *info = qemu_mallocz(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; +} diff --git a/qga/guest-agent-commands.c b/qga/guest-agent-commands.c index 01c4862..18e23f2 100644 --- a/qga/guest-agent-commands.c +++ b/qga/guest-agent-commands.c @@ -1,5 +1,5 @@ /* - * QEMU Guest Agent commands + * QEMU Guest Agent POSIX-specific command implementations * * Copyright IBM Corp. 2011 * @@ -30,63 +30,6 @@ static GAState *ga_state; -/* 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 - */ -static void slog(const char *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(int64_t id, Error **errp) -{ - return id; -} - -void qmp_guest_ping(Error **err) -{ - slog("guest-ping called"); -} - -struct GuestAgentInfo *qmp_guest_info(Error **err) -{ - GuestAgentInfo *info = qemu_mallocz(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; -} - void qmp_guest_shutdown(bool has_mode, const char *mode, Error **err) { int ret; diff --git a/qga/guest-agent-core.h b/qga/guest-agent-core.h index 6148d10..b5dfa5b 100644 --- a/qga/guest-agent-core.h +++ b/qga/guest-agent-core.h @@ -29,3 +29,4 @@ GACommandState *ga_command_state_new(void); bool ga_logging_enabled(GAState *s); void ga_disable_logging(GAState *s); void ga_enable_logging(GAState *s); +void slog(const gchar *fmt, ...); -- 1.7.7.6