*** stunnel-3.24/configure.ac	Wed Apr 23 23:05:46 2003
--- stunnel-3.24.Pedrohack/configure.ac	Tue Jul 29 17:42:05 2003
***************
*** 26,31 ****
--- 26,38 ----
      return 1
  }
  
+ dnl Check for high file descriptor workaround
+ AC_MSG_CHECKING([for high file descriptor workaround])
+ AC_ARG_ENABLE(highfds,
+     [  --enable-highfds        use fcntl to dup descriptors as a workaround for libwrap problems with stdio],
+     [ AC_MSG_RESULT([yes]); AC_DEFINE(HIGHFDS) ],
+     [ AC_MSG_RESULT([no]); ]
+ )
  dnl Check for SSL directory
  AC_MSG_CHECKING([for SSL directory])
  AC_ARG_WITH(ssl,
*** stunnel-3.24/client.c	Wed Apr 23 23:16:38 2003
--- stunnel-3.24.Pedrohack/client.c	Tue Jul 29 17:40:35 2003
***************
*** 622,627 ****
--- 622,630 ----
      int fd;                   /* IDENT socket descriptor */
      char name[STRLEN];
      int retval;
+ #ifdef HIGHFDS
+     int dupsock;
+ #endif
  
      if(!options.username)
          return 0; /* -u option not specified */
***************
*** 629,634 ****
--- 632,643 ----
          sockerror("socket (auth_user)");
          return -1;
      }
+ #ifdef HIGHFDS
+     if ( (dupsock = fcntl(fd, F_DUPFD, 256)) != -1) { 
+         close(fd);
+         fd = dupsock;
+     }
+ #endif
  #if defined FIONBIO && defined USE_NBIO
      {
          unsigned long l=1; /* ON */
***************
*** 767,781 ****
--- 776,805 ----
      struct sockaddr_in addr;
      int addrlen;
      int s; /* temporary socket awaiting for connection */
+ #ifdef HIGHFDS
+     int dupsock;
+ #endif
  
      if((s=socket(AF_INET, SOCK_STREAM, 0))<0) {
          sockerror("socket#1");
          return -1;
      }
+ #ifdef HIGHFDS
+     if ( (dupsock = fcntl(s, F_DUPFD, 256)) != -1) {
+         close(s);
+         s = dupsock;
+     }
+ #endif
      if((fd[1]=socket(AF_INET, SOCK_STREAM, 0))<0) {
          sockerror("socket#2");
          return -1;
      }
+ #ifdef HIGHFDS
+     if ( (dupsock = fcntl(fd[1], F_DUPFD, 256)) != -1) {
+         close(fd[1]);
+         fd[1] = dupsock;
+     }
+ #endif
      addrlen=sizeof(addr);
      memset(&addr, 0, addrlen);
      addr.sin_family=AF_INET;
***************
*** 816,826 ****
--- 840,859 ----
      struct sockaddr_in addr;
      int s; /* destination socket */
      u32 *list; /* destination addresses list */
+ #ifdef HIGHFDS
+     int dupsock;
+ #endif HIGHFDS
  
      if((s=socket(AF_INET, SOCK_STREAM, 0))<0) {
          sockerror("remote socket");
          return -1;
      }
+ #ifdef HIGHFDS
+     if ( (dupsock = fcntl(s, F_DUPFD, 256)) != -1) {
+         close(s);
+         s = dupsock;
+     }
+ #endif HIGHFDS
      memset(&addr, 0, sizeof(addr));
      addr.sin_family=AF_INET;
  
*** stunnel-3.24/stunnel.c	Wed Apr 23 23:05:34 2003
--- stunnel-3.24.Pedrohack/stunnel.c	Tue Jul 29 17:40:25 2003
***************
*** 167,172 ****
--- 167,175 ----
      struct sockaddr_in addr;
      int addrlen;
      int max_clients, fds_ulimit=-1;
+ #ifdef HIGHFDS
+     int dupsock;
+ #endif
  
  #if defined HAVE_SYSCONF
      fds_ulimit=sysconf(_SC_OPEN_MAX);
***************
*** 212,217 ****
--- 215,227 ----
              sockerror("accept");
              continue;
          }
+ #ifdef HIGHFDS
+         if ( (dupsock = fcntl(s, F_DUPFD, 256)) != -1)
+         { 
+             close(s);
+             s = dupsock;
+         }
+ #endif
          enter_critical_section(CRIT_NTOA); /* inet_ntoa is not mt-safe */
          log(LOG_DEBUG, "%s accepted FD=%d from %s:%d", options.servname, s,
              inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
***************
*** 349,359 ****
--- 359,379 ----
  static int listen_local() { /* bind and listen on local interface */
      struct sockaddr_in addr;
      int ls;
+ #ifdef HIGHFDS
+     int dupsock;
+ #endif
  
      if((ls=socket(AF_INET, SOCK_STREAM, 0))<0) {
          sockerror("local socket");
          exit(1);
      }
+ #ifdef HIGHFDS
+     if ( (dupsock = fcntl(ls, F_DUPFD, 256)) != -1)
+     { 
+         close(ls);
+         ls = dupsock;
+     }
+ #endif
      if(set_socket_options(ls, 0)<0)
          exit(1);
      memset(&addr, 0, sizeof(addr));
***************
*** 679,684 ****
--- 699,707 ----
  #ifdef USE_LIBWRAP
      safeconcat(retval, "+LIBWRAP");
  #endif
+ #ifdef HIGHFDS
+     safeconcat(retval, "+HIGHFDS");
+ #endif
      safeconcat(retval, " with ");
      safeconcat(retval, SSLeay_version(SSLEAY_VERSION));
      return retval;
*** stunnel-3.24/configure.ac	Wed Apr 23 23:05:46 2003
--- stunnel-3.24.Pedrohack/configure.ac	Tue Jul 29 17:42:05 2003
***************
*** 26,31 ****
--- 26,38 ----
      return 1
  }
  
+ dnl Check for high file descriptor workaround
+ AC_MSG_CHECKING([for high file descriptor workaround])
+ AC_ARG_ENABLE(highfds,
+     [  --enable-highfds        use fcntl to dup descriptors as a workaround for libwrap problems with stdio],
+     [ AC_MSG_RESULT([yes]); AC_DEFINE(HIGHFDS) ],
+     [ AC_MSG_RESULT([no]); ]
+ )
  dnl Check for SSL directory
  AC_MSG_CHECKING([for SSL directory])
  AC_ARG_WITH(ssl,
*** stunnel-3.24/client.c	Wed Apr 23 23:16:38 2003
--- stunnel-3.24.Pedrohack/client.c	Tue Jul 29 17:40:35 2003
***************
*** 622,627 ****
--- 622,630 ----
      int fd;                   /* IDENT socket descriptor */
      char name[STRLEN];
      int retval;
+ #ifdef HIGHFDS
+     int dupsock;
+ #endif
  
      if(!options.username)
          return 0; /* -u option not specified */
***************
*** 629,634 ****
--- 632,643 ----
          sockerror("socket (auth_user)");
          return -1;
      }
+ #ifdef HIGHFDS
+     if ( (dupsock = fcntl(fd, F_DUPFD, 256)) != -1) { 
+         close(fd);
+         fd = dupsock;
+     }
+ #endif
  #if defined FIONBIO && defined USE_NBIO
      {
          unsigned long l=1; /* ON */
***************
*** 767,781 ****
--- 776,805 ----
      struct sockaddr_in addr;
      int addrlen;
      int s; /* temporary socket awaiting for connection */
+ #ifdef HIGHFDS
+     int dupsock;
+ #endif
  
      if((s=socket(AF_INET, SOCK_STREAM, 0))<0) {
          sockerror("socket#1");
          return -1;
      }
+ #ifdef HIGHFDS
+     if ( (dupsock = fcntl(s, F_DUPFD, 256)) != -1) {
+         close(s);
+         s = dupsock;
+     }
+ #endif
      if((fd[1]=socket(AF_INET, SOCK_STREAM, 0))<0) {
          sockerror("socket#2");
          return -1;
      }
+ #ifdef HIGHFDS
+     if ( (dupsock = fcntl(fd[1], F_DUPFD, 256)) != -1) {
+         close(fd[1]);
+         fd[1] = dupsock;
+     }
+ #endif
      addrlen=sizeof(addr);
      memset(&addr, 0, addrlen);
      addr.sin_family=AF_INET;
***************
*** 816,826 ****
--- 840,859 ----
      struct sockaddr_in addr;
      int s; /* destination socket */
      u32 *list; /* destination addresses list */
+ #ifdef HIGHFDS
+     int dupsock;
+ #endif HIGHFDS
  
      if((s=socket(AF_INET, SOCK_STREAM, 0))<0) {
          sockerror("remote socket");
          return -1;
      }
+ #ifdef HIGHFDS
+     if ( (dupsock = fcntl(s, F_DUPFD, 256)) != -1) {
+         close(s);
+         s = dupsock;
+     }
+ #endif HIGHFDS
      memset(&addr, 0, sizeof(addr));
      addr.sin_family=AF_INET;
  
*** stunnel-3.24/stunnel.c	Wed Apr 23 23:05:34 2003
--- stunnel-3.24.Pedrohack/stunnel.c	Tue Jul 29 17:40:25 2003
***************
*** 167,172 ****
--- 167,175 ----
      struct sockaddr_in addr;
      int addrlen;
      int max_clients, fds_ulimit=-1;
+ #ifdef HIGHFDS
+     int dupsock;
+ #endif
  
  #if defined HAVE_SYSCONF
      fds_ulimit=sysconf(_SC_OPEN_MAX);
***************
*** 212,217 ****
--- 215,227 ----
              sockerror("accept");
              continue;
          }
+ #ifdef HIGHFDS
+         if ( (dupsock = fcntl(s, F_DUPFD, 256)) != -1)
+         { 
+             close(s);
+             s = dupsock;
+         }
+ #endif
          enter_critical_section(CRIT_NTOA); /* inet_ntoa is not mt-safe */
          log(LOG_DEBUG, "%s accepted FD=%d from %s:%d", options.servname, s,
              inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
***************
*** 349,359 ****
--- 359,379 ----
  static int listen_local() { /* bind and listen on local interface */
      struct sockaddr_in addr;
      int ls;
+ #ifdef HIGHFDS
+     int dupsock;
+ #endif
  
      if((ls=socket(AF_INET, SOCK_STREAM, 0))<0) {
          sockerror("local socket");
          exit(1);
      }
+ #ifdef HIGHFDS
+     if ( (dupsock = fcntl(ls, F_DUPFD, 256)) != -1)
+     { 
+         close(ls);
+         ls = dupsock;
+     }
+ #endif
      if(set_socket_options(ls, 0)<0)
          exit(1);
      memset(&addr, 0, sizeof(addr));
***************
*** 679,684 ****
--- 699,707 ----
  #ifdef USE_LIBWRAP
      safeconcat(retval, "+LIBWRAP");
  #endif
+ #ifdef HIGHFDS
+     safeconcat(retval, "+HIGHFDS");
+ #endif
      safeconcat(retval, " with ");
      safeconcat(retval, SSLeay_version(SSLEAY_VERSION));
      return retval;
