From 2bad2b7ee51a65c94f31e1001482bfc644b0957c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net>
Date: Tue, 16 Sep 1997 00:32:42 -0700
Subject: [PATCH] socketpair_ultra optimized

Rev: src/modules/files/file.c:1.54
---
 src/modules/files/file.c | 82 +++++++++++++++++++++++++++-------------
 1 file changed, 56 insertions(+), 26 deletions(-)

diff --git a/src/modules/files/file.c b/src/modules/files/file.c
index 2229c6a547..77494125c7 100644
--- a/src/modules/files/file.c
+++ b/src/modules/files/file.c
@@ -6,7 +6,7 @@
 #define READ_BUFFER 8192
 
 #include "global.h"
-RCSID("$Id: file.c,v 1.53 1997/09/16 06:03:21 hubbe Exp $");
+RCSID("$Id: file.c,v 1.54 1997/09/16 07:32:42 hubbe Exp $");
 #include "interpret.h"
 #include "svalue.h"
 #include "stralloc.h"
@@ -977,8 +977,10 @@ static void file_set_buffer(INT32 args)
 extern int errno;
 int socketpair(int family, int type, int protocol, int sv[2])
 {
+  static int fd=-1;
+  static struct sockaddr_in my_addr;
   struct sockaddr_in addr,addr2;
-  int len, fd;
+  int len;
 
   MEMSET((char *)&addr,0,sizeof(struct sockaddr_in));
 
@@ -988,39 +990,69 @@ int socketpair(int family, int type, int protocol, int sv[2])
     errno=EINVAL;
     return -1; 
   }
-  
-  if((fd=socket(AF_INET, SOCK_STREAM, 0)) < 0) return -1;
-  if((sv[1]=socket(AF_INET, SOCK_STREAM, 0)) <0) return -1;
 
+  if(fd==-1)
+  {
+    if((fd=socket(AF_INET, SOCK_STREAM, 0)) < 0) return -1;
+    
+    /* I wonder what is most common a loopback on ip# 127.0.0.1 or
+     * a loopback with the name "localhost"?
+     * Let's hope those few people who doesn't have socketpair has
+     * a loopback on 127.0.0.1
+     */
+    my_addr.sin_addr.s_addr=htonl(INADDR_ANY);
+    my_addr.sin_port=htons(0);
+    
+    /* Bind our sockets on any port */
+    if(bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0)
+    {
+      close(fd);
+      fd=-1;
+      return -1;
+    }
 
-  /* I wonder what is most common a loopback on ip# 127.0.0.1 or
-   * a loopback with the name "localhost"?
-   * Let's hope those few people who doesn't have socketpair has
-   * a loopback on 127.0.0.1
-   */
-  addr.sin_addr.s_addr=htonl(INADDR_ANY);
-  addr.sin_port=htons(0);
-
-  /* Bind our sockets on any port */
-  if(bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) return -1;
+    /* Check what ports we got.. */
+    len=sizeof(my_addr);
+    if(getsockname(fd,(struct sockaddr *)&my_addr,&len) < 0)
+    {
+      close(fd);
+      fd=-1;
+      return -1;
+    }
 
-  /* Check what ports we got.. */
-  len=sizeof(addr);
-  if(getsockname(fd,(struct sockaddr *)&addr,&len) < 0) return -1;
+    /* Listen to connections on our new socket */
+    if(listen(fd, 5) < 0)
+    {
+      close(fd);
+      fd=-1;
+      return -1;
+    }
+  }
+  
+  if((sv[1]=socket(AF_INET, SOCK_STREAM, 0)) <0) return -1;
 
   addr.sin_addr.s_addr=inet_addr("127.0.0.1");
 
-  /* Listen to connections on our new socket */
-  if(listen(fd, 3) < 0 ) return -1;
-
 /*  set_nonblocking(sv[1],1); */
   
-  /* Connect */
-  if(connect(sv[1], (struct sockaddr *)&addr, sizeof(addr)) < 0) return -1;
+  if(connect(sv[1], (struct sockaddr *)&my_addr, sizeof(my_addr)) < 0)
+  {
+    int tmp2;
+    for(tmp2=0;tmp2<20;tmp2++)
+    {
+      int tmp;
+      len=sizeof(addr);
+      tmp=accept(fd,(struct sockaddr *)&addr,&len);
+      if(tmp!=-1) close(tmp);
+      if(connect(sv[1], (struct sockaddr *)&my_addr, sizeof(my_addr))>=0)
+	break;
+    }
+    if(tmp2>=20)
+      return -1;
+  }
 
   len=sizeof(addr);
   if(getsockname(sv[1],(struct sockaddr *)&addr2,&len) < 0) return -1;
-  
 
   /* Accept connection
    * Make sure this connection was our OWN connection,
@@ -1042,8 +1074,6 @@ int socketpair(int family, int type, int protocol, int sv[2])
 	 addr2.sin_addr.s_addr != addr.sin_addr.s_addr ||
 	 addr2.sin_port != addr.sin_port);
 
-  if(close(fd) <0) return -1;
-
 /*   set_nonblocking(sv[1],0); */
 
   return 0;
-- 
GitLab