From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LM1vt-0005YD-8I for qemu-devel@nongnu.org; Sun, 11 Jan 2009 10:08:57 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LM1vs-0005Y1-N5 for qemu-devel@nongnu.org; Sun, 11 Jan 2009 10:08:56 -0500 Received: from [199.232.76.173] (port=51525 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LM1vr-0005Xy-UG for qemu-devel@nongnu.org; Sun, 11 Jan 2009 10:08:56 -0500 Received: from mx2.redhat.com ([66.187.237.31]:33116) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LM1vr-0004Ju-GD for qemu-devel@nongnu.org; Sun, 11 Jan 2009 10:08:55 -0500 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n0BF8sAH015397 for ; Sun, 11 Jan 2009 10:08:54 -0500 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n0BF8sL4026425 for ; Sun, 11 Jan 2009 10:08:55 -0500 Received: from dhcp-1-237.tlv.redhat.com (dhcp-1-237.tlv.redhat.com [10.35.1.237]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n0BF8ruv027882 for ; Sun, 11 Jan 2009 10:08:54 -0500 Date: Sun, 11 Jan 2009 17:10:08 +0200 From: Gleb Natapov Message-ID: <20090111151008.GL3267@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Subject: [Qemu-devel] [PATCH] specify vmchannel as part of "user" net option Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org To configure vmchannel and something like this to -net user: channels=666:unix:/tmp/666,server,nowait;777:unix:/tmp/777,server The parsing is little ugly :( Signed-off-by: Gleb Natapov diff --git a/net.c b/net.c index 30ba717..47e7e40 100644 --- a/net.c +++ b/net.c @@ -644,6 +644,23 @@ void do_info_slirp(void) slirp_stats(); } +struct VMChannel { + CharDriverState *hd; + int port; +}; + +static int vmchannel_can_read(void *opaque) +{ + struct VMChannel *vmc = (struct VMChannel*)opaque; + return slirp_socket_can_recv(4, vmc->port); +} + +static void vmchannel_read(void *opaque, const uint8_t *buf, int size) +{ + struct VMChannel *vmc = (struct VMChannel*)opaque; + slirp_socket_recv(4, vmc->port, buf, size); +} + #endif /* CONFIG_SLIRP */ #if !defined(_WIN32) @@ -1556,6 +1573,7 @@ int net_client_init(const char *device, const char *p) } else #ifdef CONFIG_SLIRP if (!strcmp(device, "user")) { + char *c; if (get_param_value(buf, sizeof(buf), "hostname", p)) { pstrcpy(slirp_hostname, sizeof(slirp_hostname), buf); } @@ -1565,6 +1583,53 @@ int net_client_init(const char *device, const char *p) if (get_param_value(buf, sizeof(buf), "ip", p)) { slirp_ip = strdup(buf); } + if ((c = strstr(p, "channels="))) { + int len; + char *e; + c += strlen("channels="); + e = index(c, '='); + if (e != NULL) { + e = rindex(c, ','); + len = e - c; + } else { + len = strlen(c); + } + if (len >= sizeof(buf)) { + fprintf(stderr, "vmchannel parameter is too long\n"); + return -1; + } + memcpy(buf, c, len); + buf[len + 1] = '\0'; + c = buf; + while (c && *c != '\0') { + int port; + char name[20], *devname; + struct VMChannel *vmc; + + if (*c == ';') + c++; + + port = strtol(c, &c, 10); + c++; + if (port < 1 || port > 65535) { + fprintf(stderr, "vmchannel: wrong port number\n"); + return -1; + } + snprintf(name, 20, "vmchannel%u\n", port); + devname = strsep(&c, ";"); + vmc = malloc(sizeof(struct VMChannel)); + vmc->hd = qemu_chr_open(name, devname); + if (!vmc->hd) { + fprintf(stderr, "qemu: could not open vmchannel device" + "'%s'\n", devname); + return -1; + } + vmc->port = port; + slirp_add_exec(3, vmc->hd, 4, port); + qemu_chr_add_handlers(vmc->hd, vmchannel_can_read, + vmchannel_read, NULL, vmc); + } + } vlan->nb_host_devs++; ret = net_slirp_init(vlan, device, name); } else -- Gleb.