From patchwork Fri Oct 22 18:46:00 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Roth X-Patchwork-Id: 68934 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 24116B70D0 for ; Sat, 23 Oct 2010 06:31:13 +1100 (EST) Received: from localhost ([127.0.0.1]:47612 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1P9NKY-0006OA-2C for incoming@patchwork.ozlabs.org; Fri, 22 Oct 2010 15:31:10 -0400 Received: from [140.186.70.92] (port=60154 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1P9Mdd-0000AS-Ej for qemu-devel@nongnu.org; Fri, 22 Oct 2010 14:46:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1P9MdY-0002hZ-N2 for qemu-devel@nongnu.org; Fri, 22 Oct 2010 14:46:49 -0400 Received: from e1.ny.us.ibm.com ([32.97.182.141]:48896) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1P9MdY-0002hT-KM for qemu-devel@nongnu.org; Fri, 22 Oct 2010 14:46:44 -0400 Received: from d01relay07.pok.ibm.com (d01relay07.pok.ibm.com [9.56.227.147]) by e1.ny.us.ibm.com (8.14.4/8.13.1) with ESMTP id o9MIdRdL026750 for ; Fri, 22 Oct 2010 14:39:28 -0400 Received: from d01av01.pok.ibm.com (d01av01.pok.ibm.com [9.56.224.215]) by d01relay07.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id o9MIkh6Z2261030 for ; Fri, 22 Oct 2010 14:46:43 -0400 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 o9MIkg7p027726 for ; Fri, 22 Oct 2010 14:46:43 -0400 Received: from localhost.localdomain (sig-9-76-202-211.mts.ibm.com [9.76.202.211]) by d01av01.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id o9MIkHq4025601; Fri, 22 Oct 2010 14:46:40 -0400 From: Michael Roth To: qemu-devel@nongnu.org Date: Fri, 22 Oct 2010 13:46:00 -0500 Message-Id: <1287773165-24855-6-git-send-email-mdroth@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.0.4 In-Reply-To: <1287773165-24855-1-git-send-email-mdroth@linux.vnet.ibm.com> References: <1287773165-24855-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 05/10] 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 | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 53 insertions(+), 0 deletions(-) diff --git a/virtagent-daemon.c b/virtagent-daemon.c index 998b025..fad0f64 100644 --- a/virtagent-daemon.c +++ b/virtagent-daemon.c @@ -21,6 +21,57 @@ #include "virtagent-daemon.h" #include "virtagent-common.h" +/* 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; + } + + 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; @@ -48,6 +99,8 @@ typedef struct RPCFunction { } RPCFunction; static RPCFunction guest_functions[] = { + { .func = getfile, + .func_name = "getfile" }, { NULL, NULL } }; static RPCFunction host_functions[] = {