From patchwork Tue Nov 16 16:01:47 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Roth X-Patchwork-Id: 71418 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 753CEB7129 for ; Wed, 17 Nov 2010 03:15:24 +1100 (EST) Received: from localhost ([127.0.0.1]:53857 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PIOBh-0003iV-QA for incoming@patchwork.ozlabs.org; Tue, 16 Nov 2010 11:15:17 -0500 Received: from [140.186.70.92] (port=34843 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PINzN-0006BG-Dv for qemu-devel@nongnu.org; Tue, 16 Nov 2010 11:02:35 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PINzL-00057a-Dd for qemu-devel@nongnu.org; Tue, 16 Nov 2010 11:02:32 -0500 Received: from e1.ny.us.ibm.com ([32.97.182.141]:49526) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PINzL-00057O-B6 for qemu-devel@nongnu.org; Tue, 16 Nov 2010 11:02:31 -0500 Received: from d01relay01.pok.ibm.com (d01relay01.pok.ibm.com [9.56.227.233]) by e1.ny.us.ibm.com (8.14.4/8.13.1) with ESMTP id oAGFsk7G022488 for ; Tue, 16 Nov 2010 10:54:46 -0500 Received: from d01av01.pok.ibm.com (d01av01.pok.ibm.com [9.56.224.215]) by d01relay01.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id oAGG2UVP404528 for ; Tue, 16 Nov 2010 11:02:30 -0500 Received: from d01av01.pok.ibm.com (loopback [127.0.0.1]) by d01av01.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id oAGG2UHZ013906 for ; Tue, 16 Nov 2010 11:02:30 -0500 Received: from localhost.localdomain (sig-9-76-106-234.mts.ibm.com [9.76.106.234]) by d01av01.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id oAGG24rb011388; Tue, 16 Nov 2010 11:02:28 -0500 From: Michael Roth To: qemu-devel@nongnu.org Date: Tue, 16 Nov 2010 10:01:47 -0600 Message-Id: <1289923320-5638-6-git-send-email-mdroth@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.0.4 In-Reply-To: <1289923320-5638-1-git-send-email-mdroth@linux.vnet.ibm.com> References: <1289923320-5638-1-git-send-email-mdroth@linux.vnet.ibm.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6, seldom 2.4 (older, 4) Cc: aliguori@linux.vnet.ibm.com, ryanh@us.ibm.com, agl@linux.vnet.ibm.com, mdroth@linux.vnet.ibm.com, abeekhof@redhat.com Subject: [Qemu-devel] [RFC][PATCH v4 05/18] virtagent: add getfile RPC X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Add RPC to retrieve a guest file. A size limit of some sort will eventually be needed else we can block the monitor for arbitrarily long periods of time. This interface is intended for smaller reads like peeking at logs and /proc and such. Signed-off-by: Michael Roth --- virtagent-daemon.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 55 insertions(+), 0 deletions(-) diff --git a/virtagent-daemon.c b/virtagent-daemon.c index 78d550f..44c0754 100644 --- a/virtagent-daemon.c +++ b/virtagent-daemon.c @@ -28,6 +28,59 @@ static bool va_enable_syslog = false; /* enable syslog'ing of RPCs */ syslog(LOG_INFO, "virtagent, %s", msg_buf); \ } while(0) +/* RPC functions common to guest/host daemons */ + +static xmlrpc_value *getfile(xmlrpc_env *env, + xmlrpc_value *param, + void *user_data) +{ + const char *path; + char *file_contents = NULL; + char buf[VA_FILEBUF_LEN]; + int fd, ret, count = 0; + xmlrpc_value *result = NULL; + + /* parse argument array */ + xmlrpc_decompose_value(env, param, "(s)", &path); + if (env->fault_occurred) { + return NULL; + } + + SLOG("getfile(), path:%s", path); + + fd = open(path, O_RDONLY); + if (fd == -1) { + LOG("open failed: %s", strerror(errno)); + xmlrpc_faultf(env, "open failed: %s", strerror(errno)); + return NULL; + } + + while ((ret = read(fd, buf, VA_FILEBUF_LEN)) > 0) { + file_contents = qemu_realloc(file_contents, count + VA_FILEBUF_LEN); + memcpy(file_contents + count, buf, ret); + count += ret; + if (count > VA_GETFILE_MAX) { + xmlrpc_faultf(env, "max file size (%d bytes) exceeded", + VA_GETFILE_MAX); + goto EXIT_CLOSE_BAD; + } + } + if (ret == -1) { + LOG("read failed: %s", strerror(errno)); + xmlrpc_faultf(env, "read failed: %s", strerror(errno)); + goto EXIT_CLOSE_BAD; + } + + result = xmlrpc_build_value(env, "6", file_contents, count); + +EXIT_CLOSE_BAD: + if (file_contents) { + qemu_free(file_contents); + } + close(fd); + return result; +} + static int va_accept(int listen_fd) { struct sockaddr_in saddr; struct sockaddr *addr; @@ -55,6 +108,8 @@ typedef struct RPCFunction { } RPCFunction; static RPCFunction guest_functions[] = { + { .func = getfile, + .func_name = "getfile" }, { NULL, NULL } }; static RPCFunction host_functions[] = {