From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=60588 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PIAAO-0006Yr-UW for qemu-devel@nongnu.org; Mon, 15 Nov 2010 20:17:02 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PIAAN-0006vM-6E for qemu-devel@nongnu.org; Mon, 15 Nov 2010 20:17:00 -0500 Received: from e6.ny.us.ibm.com ([32.97.182.146]:43308) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PIAAN-0006vC-26 for qemu-devel@nongnu.org; Mon, 15 Nov 2010 20:16:59 -0500 Received: from d01relay01.pok.ibm.com (d01relay01.pok.ibm.com [9.56.227.233]) by e6.ny.us.ibm.com (8.14.4/8.13.1) with ESMTP id oAG1HwaD003449 for ; Mon, 15 Nov 2010 20:17:58 -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 oAG1Gw0l398074 for ; Mon, 15 Nov 2010 20:16:58 -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 oAG1GwAg028100 for ; Mon, 15 Nov 2010 20:16:58 -0500 From: Michael Roth Date: Mon, 15 Nov 2010 19:16:00 -0600 Message-Id: <1289870175-14880-7-git-send-email-mdroth@linux.vnet.ibm.com> In-Reply-To: <1289870175-14880-1-git-send-email-mdroth@linux.vnet.ibm.com> References: <1289870175-14880-1-git-send-email-mdroth@linux.vnet.ibm.com> Subject: [Qemu-devel] [RFC][PATCH v3 06/21] virtproxy: add accept handler for communication channel List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: agl@linux.vnet.ibm.com, abeekhof@redhat.com, mdroth@linux.vnet.ibm.com, aliguori@linux.vnet.ibm.com, ryanh@us.ibm.com, amit.shah@redhat.com This accept()'s connections to the socket we told virtproxy to listen for the channel connection on and sets the appropriate read handler for the resulting FD. This is only used only for network-based channels and will most likely be dropped with the introduction of the virtproxy chardev. Signed-off-by: Michael Roth --- virtproxy.c | 37 +++++++++++++++++++++++++++++++++++++ 1 files changed, 37 insertions(+), 0 deletions(-) diff --git a/virtproxy.c b/virtproxy.c index edca62e..770b57b 100644 --- a/virtproxy.c +++ b/virtproxy.c @@ -199,6 +199,8 @@ static VPConn *get_conn(const VPDriver *drv, int fd, bool client) return NULL; } +static void vp_channel_accept(void *opaque); + /* get VPOForward by service_id */ static VPOForward *get_oforward(const VPDriver *drv, const char *service_id) { @@ -226,3 +228,38 @@ static VPIForward *get_iforward(const VPDriver *drv, const char *service_id) return NULL; } + +/* accept handler for communication channel + * + * accept()s connection to communication channel (for sockets), and sets + * up the read handler for resulting FD. + */ +static void vp_channel_accept(void *opaque) +{ + VPDriver *drv = opaque; + struct sockaddr_in saddr; + struct sockaddr *addr; + socklen_t len; + int fd; + + TRACE("called with opaque: %p", drv); + + for(;;) { + len = sizeof(saddr); + addr = (struct sockaddr *)&saddr; + fd = qemu_accept(drv->listen_fd, addr, &len); + + if (fd < 0 && errno != EINTR) { + TRACE("accept() failed"); + return; + } else if (fd >= 0) { + TRACE("accepted connection"); + break; + } + } + + drv->channel_fd = fd; + vp_set_fd_handler(drv->channel_fd, vp_channel_read, NULL, drv); + /* dont accept anymore connections until channel_fd is closed */ + vp_set_fd_handler(drv->listen_fd, NULL, NULL, NULL); +} -- 1.7.0.4