From owner-freebsd-ports-bugs@FreeBSD.ORG Thu Jul 31 08:30:17 2003 Return-Path: Delivered-To: freebsd-ports-bugs@hub.freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 0B73E37B401 for ; Thu, 31 Jul 2003 08:30:17 -0700 (PDT) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id C78E843FDD for ; Thu, 31 Jul 2003 08:30:14 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.12.9/8.12.9) with ESMTP id h6VFUEUp083286 for ; Thu, 31 Jul 2003 08:30:14 -0700 (PDT) (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.12.9/8.12.9/Submit) id h6VFUEcF083285; Thu, 31 Jul 2003 08:30:14 -0700 (PDT) Resent-Date: Thu, 31 Jul 2003 08:30:14 -0700 (PDT) Resent-Message-Id: <200307311530.h6VFUEcF083285@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-ports-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, "Vladimir V.Davydoff" Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 091D537B405 for ; Thu, 31 Jul 2003 08:25:29 -0700 (PDT) Received: from fvv.itcwin.com (fvv.itcwin.com [195.19.195.202]) by mx1.FreeBSD.org (Postfix) with ESMTP id A16E243FCB for ; Thu, 31 Jul 2003 08:25:27 -0700 (PDT) (envelope-from vvdav@fvv.itcwin.com) Received: by fvv.itcwin.com (Postfix, from userid 1001) id 4BBC424A9A; Thu, 31 Jul 2003 19:25:25 +0400 (MSD) Message-Id: <20030731152525.4BBC424A9A@fvv.itcwin.com> Date: Thu, 31 Jul 2003 19:25:25 +0400 (MSD) From: "Vladimir V.Davydoff" To: freebsd-gnats-submit@FreeBSD.org X-Send-Pr-Version: 3.113 Subject: ports/55118: Update port: net/datapipe - socket options, logging, unconditional accept() fix X-BeenThere: freebsd-ports-bugs@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list Reply-To: "Vladimir V.Davydoff" List-Id: Ports bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 31 Jul 2003 15:30:17 -0000 >Number: 55118 >Category: ports >Synopsis: Update port: net/datapipe - socket options, logging, unconditional accept() fix >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-ports-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Thu Jul 31 08:30:14 PDT 2003 >Closed-Date: >Last-Modified: >Originator: Vladimir V. Davydoff >Release: FreeBSD 4.7-RELEASE-p10 i386 >Organization: ITC, Inc. >Environment: System: FreeBSD fvv.itcwin.com 4.7-RELEASE-p10 FreeBSD 4.7-RELEASE-p10 #0: Thu Apr 3 12:52:11 MSD 2003 vvdav@fvv.itcwin.com:/mnt/.1/fbsd.cvs/src/sys/compile/fvv i386 >Description: 1. Logging added 2. setsockoption (for quick stop/start, preventing "bind: Address already in use" error after stop before timeout expiration) 3. Unconditional accept() fixed, preventing core dumpening on some connections) >How-To-Repeat: 1-stop/start, 3-heavy loading, slow links >Fix: --- patch.shar begins here --- # This is a shell archive. Save it in a file, remove anything before # this line, and then unpack it by entering "sh file". Note, it may # create directories; files and directories will be owned by you and # have default permissions. # # This archive contains: # # patch-aa # echo x - patch-aa sed 's/^X//' >patch-aa << 'END-of-patch-aa' X--- datapipe.c.orig Tue Jan 4 09:48:55 2000 X+++ datapipe.c Thu Jul 24 16:28:56 2003 X@@ -59,6 +59,7 @@ X #include X #include X #include X+ #include X #define recv(x,y,z,a) read(x,y,z) X #define send(x,y,z,a) write(x,y,z) X #define closesocket(s) close(s) X@@ -77,7 +78,7 @@ X time_t activity; X }; X X-#define MAXCLIENTS 20 X+#define MAXCLIENTS 128 X #define IDLETIMEOUT 300 X X X@@ -88,7 +89,8 @@ X SOCKET lsock; X char buf[4096]; X struct sockaddr_in laddr, oaddr; X- int i; X+ int i, lport, oport; X+ char *laddr_str, *oaddr_str; X struct client_t clients[MAXCLIENTS]; X X X@@ -114,7 +116,7 @@ X /* determine the listener address and port */ X bzero(&laddr, sizeof(struct sockaddr_in)); X laddr.sin_family = AF_INET; X- laddr.sin_port = htons((unsigned short) atol(argv[2])); X+ laddr.sin_port = htons((unsigned short) lport=atol(argv[2])); X laddr.sin_addr.s_addr = inet_addr(argv[1]); X if (!laddr.sin_port) { X fprintf(stderr, "invalid listener port\n"); X@@ -128,12 +130,13 @@ X } X bcopy(n->h_addr, (char *) &laddr.sin_addr, n->h_length); X } X+ laddr_str=strdup(inet_ntoa(laddr.sin_addr)); X X X /* determine the outgoing address and port */ X bzero(&oaddr, sizeof(struct sockaddr_in)); X oaddr.sin_family = AF_INET; X- oaddr.sin_port = htons((unsigned short) atol(argv[4])); X+ oaddr.sin_port = htons((unsigned short) oport=atol(argv[4])); X if (!oaddr.sin_port) { X fprintf(stderr, "invalid target port\n"); X return 25; X@@ -147,6 +150,7 @@ X } X bcopy(n->h_addr, (char *) &oaddr.sin_addr, n->h_length); X } X+ oaddr_str=strdup(inet_ntoa(oaddr.sin_addr)); X X X /* create the listener socket */ X@@ -154,6 +158,15 @@ X perror("socket"); X return 20; X } X+ { X+ int j=1; X+ setsockopt(lsock, SOL_SOCKET, SO_REUSEADDR, X+ (const char *) &j, sizeof(j)); X+ setsockopt(lsock, SOL_SOCKET, SO_KEEPALIVE, X+ (const char *) &j, sizeof(j)); X+ setsockopt(lsock, SOL_SOCKET, SO_LINGER, X+ (const char *) &j, sizeof(j)); X+ } X if (bind(lsock, (struct sockaddr *)&laddr, sizeof(laddr))) { X perror("bind"); X return 20; X@@ -180,7 +193,10 @@ X setsid(); X #endif X X- X+ openlog(argv[0], LOG_NDELAY|LOG_CONS|LOG_PID, LOG_LOCAL4); X+ syslog( LOG_INFO, "Datapipe started: %s:%i -> %s:%i", X+ laddr_str, lport, oaddr_str, oport); X+ X /* main polling loop. */ X while (1) X { X@@ -203,15 +219,22 @@ X maxsock = (int) clients[i].osock; X } X if (select(maxsock + 1, &fdsr, NULL, NULL, &tv) < 0) { X- return 30; X+ syslog( LOG_INFO, "select, maxsock=%i", maxsock); X+ continue; X } X X X /* check if there are new connections to accept. */ X if (FD_ISSET(lsock, &fdsr)) X { X- SOCKET csock = accept(lsock, NULL, 0); X- X+ struct sockaddr_in raddr; X+ int len=sizeof(raddr); X+ SOCKET csock = accept(lsock, (struct sockaddr *)&raddr, &len); X+ if(csock >= 0) { X+ syslog( LOG_INFO, "Connection(%i) from %s:%i to %s:%i -> %s:%i", X+ csock, inet_ntoa(raddr.sin_addr), ntohs(raddr.sin_port), X+ laddr_str, lport, oaddr_str, oport); X+ X for (i = 0; i < MAXCLIENTS; i++) X if (!clients[i].inuse) break; X if (i < MAXCLIENTS) X@@ -219,16 +242,16 @@ X /* connect a socket to the outgoing host/port */ X SOCKET osock; X if ((osock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { X- perror("socket"); X+ syslog( LOG_INFO, "socket\n"); X closesocket(csock); X } X else if (bind(osock, (struct sockaddr *)&laddr, sizeof(laddr))) { X- perror("bind"); X+ syslog( LOG_INFO, "bind\n"); X closesocket(csock); X closesocket(osock); X } X else if (connect(osock, (struct sockaddr *)&oaddr, sizeof(oaddr))) { X- perror("connect"); X+ syslog( LOG_INFO, "connect\n"); X closesocket(csock); X closesocket(osock); X } X@@ -239,9 +262,14 @@ X clients[i].inuse = 1; X } X } else { X- fprintf(stderr, "too many clients\n"); X+ syslog( LOG_INFO, "too many clients\n"); X closesocket(csock); X- } X+ } X+ } else { X+ syslog( LOG_INFO, "Connection accept error(%i) from %s:%i to %s:%i -> %s:%i", X+ csock, inet_ntoa(raddr.sin_addr), ntohs(raddr.sin_port), X+ laddr_str, lport, oaddr_str, oport); X+ } X } X X END-of-patch-aa exit --- patch.shar ends here --- >Release-Note: >Audit-Trail: >Unformatted: