ports/55118: Update port: net/datapipe - socket options, logging, unconditional accept() fix
Vladimir V.Davydoff
vvdav at mail.ru
Thu Jul 31 15:30:17 UTC 2003
>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 at 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 at 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:
More information about the freebsd-ports-bugs
mailing list