From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:39415) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QBpyw-0006h9-Pl for qemu-devel@nongnu.org; Mon, 18 Apr 2011 11:03:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QBpyu-0000o0-Ng for qemu-devel@nongnu.org; Mon, 18 Apr 2011 11:03:18 -0400 Received: from e2.ny.us.ibm.com ([32.97.182.142]:33397) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QBpyu-0000nu-L8 for qemu-devel@nongnu.org; Mon, 18 Apr 2011 11:03:16 -0400 Received: from d01relay02.pok.ibm.com (d01relay02.pok.ibm.com [9.56.227.234]) by e2.ny.us.ibm.com (8.14.4/8.13.1) with ESMTP id p3IEhxdK006308 for ; Mon, 18 Apr 2011 10:43:59 -0400 Received: from d03av04.boulder.ibm.com (d03av04.boulder.ibm.com [9.17.195.170]) by d01relay02.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id p3IF3F38469152 for ; Mon, 18 Apr 2011 11:03:15 -0400 Received: from d03av04.boulder.ibm.com (loopback [127.0.0.1]) by d03av04.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id p3IF3Eh1022856 for ; Mon, 18 Apr 2011 09:03:14 -0600 From: Michael Roth Date: Mon, 18 Apr 2011 10:02:26 -0500 Message-Id: <1303138953-1334-11-git-send-email-mdroth@linux.vnet.ibm.com> In-Reply-To: <1303138953-1334-1-git-send-email-mdroth@linux.vnet.ibm.com> References: <1303138953-1334-1-git-send-email-mdroth@linux.vnet.ibm.com> Subject: [Qemu-devel] [RFC][PATCH v2 10/17] qmp proxy: add qmp_proxy chardev List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: aliguori@linux.vnet.ibm.com, agl@linux.vnet.ibm.com, mdroth@linux.vnet.ibm.com, Jes.Sorensen@redhat.com This allows qemu to be started with guest agent support via: qemu -chardev qmp_proxy,id=qmp_proxy -device ...,chardev=qmp_proxy Writes to the guest agent are buffered, with deferred work handled by a timer. Writes from the guest agent to host/proxy are passed directly into a JSON streamer object/buffer. The chardev is intended for use with virtio-serial or isa-serial channels. Other uses may be possible with appropriate changes to guest agent. Signed-off-by: Michael Roth --- qemu-char.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 55 insertions(+), 0 deletions(-) diff --git a/qemu-char.c b/qemu-char.c index d301925..27b1252 100644 --- a/qemu-char.c +++ b/qemu-char.c @@ -2276,6 +2276,60 @@ static CharDriverState *qemu_chr_open_socket(QemuOpts *opts) } /***********************************************************/ +/* QMP host->guest proxy chardev */ +#include "qmp-proxy-core.h" +#include "json-streamer.h" + +extern QmpProxy *qmp_proxy_default; + +static int qmp_proxy_chr_write(CharDriverState *chr, const uint8_t *buf, int len) +{ + QmpProxy *p = chr->opaque; + + qmp_proxy_read(p, buf, len); + + return len; +} + +static void qmp_proxy_chr_close(CharDriverState *chr) +{ + QmpProxy *p = chr->opaque; + + qmp_proxy_default = NULL; + qmp_proxy_close(p); + qemu_chr_event(chr, CHR_EVENT_CLOSED); +} + +static CharDriverState *qemu_chr_open_qmp_proxy(QemuOpts *opts) +{ + CharDriverState *chr = qemu_mallocz(sizeof(CharDriverState)); + QmpProxy *p; + + /* initialize the qmp guest proxy */ + if (qmp_proxy_default) { + fprintf(stderr, "error, multiple qmp guest proxies are not allowed\n"); + goto err; + } + p = qmp_proxy_default = qmp_proxy_new(chr); + if (p == NULL) { + fprintf(stderr, "error initializing qmp guest proxy\n"); + goto err; + } + + chr->opaque = p; + chr->chr_write = qmp_proxy_chr_write; + chr->chr_close = qmp_proxy_chr_close; + qemu_chr_generic_open(chr); + + return chr; +err: + if (chr) { + qemu_free(chr); + } + return NULL; +} + +/***********************************************************/ /* Memory chardev */ typedef struct { size_t outbuf_size; @@ -2495,6 +2549,7 @@ static const struct { || defined(__FreeBSD_kernel__) { .name = "parport", .open = qemu_chr_open_pp }, #endif + { .name = "qmp_proxy", .open = qemu_chr_open_qmp_proxy }, }; CharDriverState *qemu_chr_open_opts(QemuOpts *opts, -- 1.7.0.4