*** 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;