Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 31 Jul 2003 19:25:25 +0400 (MSD)
From:      "Vladimir V.Davydoff" <vvdav@mail.ru>
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   ports/55118: Update port: net/datapipe - socket options, logging, unconditional accept() fix
Message-ID:  <20030731152525.4BBC424A9A@fvv.itcwin.com>
Resent-Message-ID: <200307311530.h6VFUEcF083285@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>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 <vvdav@mail.ru>
>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 <unistd.h>
X   #include <netdb.h>
X   #include <strings.h>
X+  #include <syslog.h>
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:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030731152525.4BBC424A9A>