From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=32821 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PeowW-0006yL-Du for qemu-devel@nongnu.org; Mon, 17 Jan 2011 08:16:22 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PeowP-0006ES-2l for qemu-devel@nongnu.org; Mon, 17 Jan 2011 08:16:18 -0500 Received: from e6.ny.us.ibm.com ([32.97.182.146]:51958) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PeowO-0006EJ-Up for qemu-devel@nongnu.org; Mon, 17 Jan 2011 08:16:13 -0500 Received: from d01dlp01.pok.ibm.com (d01dlp01.pok.ibm.com [9.56.224.56]) by e6.ny.us.ibm.com (8.14.4/8.13.1) with ESMTP id p0HCxdYC030550 for ; Mon, 17 Jan 2011 08:01:43 -0500 Received: from d01relay03.pok.ibm.com (d01relay03.pok.ibm.com [9.56.227.235]) by d01dlp01.pok.ibm.com (Postfix) with ESMTP id 25EB772804D for ; Mon, 17 Jan 2011 08:16:12 -0500 (EST) Received: from d01av04.pok.ibm.com (d01av04.pok.ibm.com [9.56.224.64]) by d01relay03.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id p0HDGBmi261326 for ; Mon, 17 Jan 2011 08:16:11 -0500 Received: from d01av04.pok.ibm.com (loopback [127.0.0.1]) by d01av04.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id p0HDGBks030437 for ; Mon, 17 Jan 2011 08:16:11 -0500 From: Michael Roth Date: Mon, 17 Jan 2011 07:15:01 -0600 Message-Id: <1295270117-24760-8-git-send-email-mdroth@linux.vnet.ibm.com> In-Reply-To: <1295270117-24760-1-git-send-email-mdroth@linux.vnet.ibm.com> References: <1295270117-24760-1-git-send-email-mdroth@linux.vnet.ibm.com> Subject: [Qemu-devel] [RFC][PATCH v6 07/23] virtagent: base server definitions List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: agl@linux.vnet.ibm.com, stefanha@linux.vnet.ibm.com, Jes.Sorensen@redhat.com, marcel.mittelstaedt@de.ibm.com, mdroth@linux.vnet.ibm.com, markus_mueller@de.ibm.com, aliguori@linux.vnet.ibm.com, ryanh@us.ibm.com, abeekhof@redhat.com Signed-off-by: Michael Roth --- virtagent-server.c | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++ virtagent-server.h | 34 ++++++++++++++++ 2 files changed, 145 insertions(+), 0 deletions(-) create mode 100644 virtagent-server.c create mode 100644 virtagent-server.h diff --git a/virtagent-server.c b/virtagent-server.c new file mode 100644 index 0000000..c38a9e0 --- /dev/null +++ b/virtagent-server.c @@ -0,0 +1,111 @@ +/* + * virtagent - host/guest RPC server functions + * + * Copyright IBM Corp. 2010 + * + * Authors: + * Adam Litke + * 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 "qemu_socket.h" +#include "virtagent-common.h" + +static bool va_enable_syslog = false; /* enable syslog'ing of RPCs */ + +#define SLOG(msg, ...) do { \ + char msg_buf[1024]; \ + if (!va_enable_syslog) { \ + break; \ + } \ + snprintf(msg_buf, 1024, msg, ## __VA_ARGS__); \ + syslog(LOG_INFO, "virtagent, %s", msg_buf); \ +} while(0) + +static VAServerData *va_server_data; + +static bool va_server_is_enabled(void) +{ + return va_server_data && va_server_data->enabled; +} + +int va_do_server_rpc(const char *content, size_t content_len, const char *tag) +{ + xmlrpc_mem_block *resp_xml; + int ret; + + TRACE("called"); + + if (!va_server_is_enabled()) { + ret = -EBUSY; + goto out; + } + resp_xml = xmlrpc_registry_process_call(&va_server_data->env, + va_server_data->registry, + NULL, content, content_len); + if (resp_xml == NULL) { + LOG("error processing RPC request"); + ret = -EINVAL; + goto out; + } + + ret = va_server_job_add(resp_xml, tag); + if (ret != 0) { + LOG("error adding server job: %s", strerror(ret)); + } + +out: + return ret; +} + +typedef struct RPCFunction { + xmlrpc_value *(*func)(xmlrpc_env *env, xmlrpc_value *param, void *unused); + const char *func_name; +} RPCFunction; + +static RPCFunction guest_functions[] = { + { NULL, NULL } +}; +static RPCFunction host_functions[] = { + { NULL, NULL } +}; + +static void va_register_functions(xmlrpc_env *env, xmlrpc_registry *registry, + RPCFunction *list) +{ + int i; + for (i = 0; list[i].func != NULL; ++i) { + TRACE("adding func: %s", list[i].func_name); + xmlrpc_registry_add_method(env, registry, NULL, list[i].func_name, + list[i].func, NULL); + } +} + +int va_server_init(VAServerData *server_data, bool is_host) +{ + RPCFunction *func_list = is_host ? host_functions : guest_functions; + + va_enable_syslog = !is_host; /* enable logging for guest agent */ + xmlrpc_env_init(&server_data->env); + server_data->registry = xmlrpc_registry_new(&server_data->env); + va_register_functions(&server_data->env, server_data->registry, func_list); + server_data->enabled = true; + server_data->is_host = true; + va_server_data = server_data; + + return 0; +} + +int va_server_close(void) +{ + if (va_server_data != NULL) { + xmlrpc_registry_free(va_server_data->registry); + xmlrpc_env_clean(&va_server_data->env); + va_server_data = NULL; + } + return 0; +} diff --git a/virtagent-server.h b/virtagent-server.h new file mode 100644 index 0000000..9f68921 --- /dev/null +++ b/virtagent-server.h @@ -0,0 +1,34 @@ +/* + * virt-agent - host/guest RPC daemon functions + * + * Copyright IBM Corp. 2010 + * + * 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 + +#define GUEST_AGENT_SERVICE_ID "virtagent" +#define GUEST_AGENT_PATH "/tmp/virtagent-guest.sock" +#define HOST_AGENT_SERVICE_ID "virtagent-host" +#define HOST_AGENT_PATH "/tmp/virtagent-host.sock" +#define VA_GETFILE_MAX 1 << 30 +#define VA_FILEBUF_LEN 16384 +#define VA_DMESG_LEN 16384 + +typedef struct VAServerData { + xmlrpc_env env; + xmlrpc_registry *registry; + bool enabled; + bool is_host; +} VAServerData; + +int va_server_init(VAServerData *server_data, bool is_host); +int va_server_close(void); +int va_do_server_rpc(const char *content, size_t content_len, const char tag[64]); -- 1.7.0.4