[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC][PATCH v3 05/11] virtagent: add getfile RPC
From: |
Michael Roth |
Subject: |
[Qemu-devel] [RFC][PATCH v3 05/11] virtagent: add getfile RPC |
Date: |
Wed, 10 Nov 2010 19:37:24 -0600 |
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 <address@hidden>
---
virtagent-daemon.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 53 insertions(+), 0 deletions(-)
diff --git a/virtagent-daemon.c b/virtagent-daemon.c
index 0505a81..3615e8a 100644
--- a/virtagent-daemon.c
+++ b/virtagent-daemon.c
@@ -15,6 +15,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;
@@ -42,6 +93,8 @@ typedef struct RPCFunction {
} RPCFunction;
static RPCFunction guest_functions[] = {
+ { .func = getfile,
+ .func_name = "getfile" },
{ NULL, NULL }
};
static RPCFunction host_functions[] = {
--
1.7.0.4
- [Qemu-devel] [RFC][PATCH v3 00/11] virtagent: host/guest RPC communication agent, Michael Roth, 2010/11/10
- [Qemu-devel] [RFC][PATCH v3 01/11] virtagent: add common rpc transport defs, Michael Roth, 2010/11/10
- [Qemu-devel] [RFC][PATCH v3 03/11] virtagent: qemu-vp, integrate virtagent server, Michael Roth, 2010/11/10
- [Qemu-devel] [RFC][PATCH v3 05/11] virtagent: add getfile RPC,
Michael Roth <=
- [Qemu-devel] [RFC][PATCH v3 06/11] virtagent: add agent_viewfile command, Michael Roth, 2010/11/10
- [Qemu-devel] [RFC][PATCH v3 10/11] virtagent: qemu integration, add va invocation via virtproxy chardev, Michael Roth, 2010/11/10
- [Qemu-devel] [RFC][PATCH v3 11/11] virtagent: Makefile/configure changes to build virtagent bits, Michael Roth, 2010/11/10
- [Qemu-devel] [RFC][PATCH v3 09/11] virtagent: qemu-vp integration, use virtagent init functions, Michael Roth, 2010/11/10
- [Qemu-devel] [RFC][PATCH v3 07/11] virtagent: add getdmesg RPC, Michael Roth, 2010/11/10
- [Qemu-devel] [RFC][PATCH v3 08/11] virtagent: add agent_viewdmesg command, Michael Roth, 2010/11/10
- [Qemu-devel] [RFC][PATCH v3 04/11] virtagent: base RPC client definitions, Michael Roth, 2010/11/10
- [Qemu-devel] [RFC][PATCH v3 02/11] virtagent: base definitions for host/guest RPC server, Michael Roth, 2010/11/10
- [Qemu-devel] Re: [RFC][PATCH v3 00/11] virtagent: host/guest RPC communication agent, Amit Shah, 2010/11/25