diff --git a/src/auth.c b/src/auth.c index ca1120b..66b84ce 100644 --- a/src/auth.c +++ b/src/auth.c @@ -1090,7 +1090,7 @@ unsigned long udpresolve(int af, unsigned char * name, unsigned char * value, un *sinsr = nservers[i].addr; } if(usetcp){ - if(so._connect(sock,(struct sockaddr *)sinsr,SASIZE(sinsr))) { + if(connectwithpoll(sock,(struct sockaddr *)sinsr,SASIZE(sinsr))) { so._shutdown(sock, SHUT_RDWR); so._closesocket(sock); break; diff --git a/src/common.c b/src/common.c index 7ad2499..4e9a9af 100644 --- a/src/common.c +++ b/src/common.c @@ -648,6 +648,27 @@ void logsyslog(struct clientparam * param, const unsigned char *s) { } #endif +int connectwithpoll(SOCKET sock, struct sockaddr *sa, SASIZETYPE size){ + struct pollfd fds[1]; +#ifdef _WIN32 + unsigned long ul = 1; + ioctlsocket(sock, FIONBIO, &ul); +#else + fcntl(sock,F_SETFL,O_NONBLOCK); +#endif + if(so._connect(sock,sa,size)) { + if(errno != EAGAIN && errno != EINPROGRESS) return (13); + } + memset(fds, 0, sizeof(fds)); + fds[0].fd = sock; + fds[0].events = POLLOUT; + if(so._poll(fds, 1, conf.timeouts[STRING_S]*1000) <= 0) { + return (13); + } + return 0; +} + + int doconnect(struct clientparam * param){ SASIZETYPE size; @@ -702,21 +723,8 @@ int doconnect(struct clientparam * param){ } if(param->operation >= 256 || (param->operation & CONNECT)){ - struct pollfd fds[1]; -#ifdef _WIN32 - unsigned long ul = 1; - ioctlsocket(param->remsock, FIONBIO, &ul); -#else - fcntl(param->remsock,F_SETFL,O_NONBLOCK); -#endif - if(so._connect(param->remsock,(struct sockaddr *)¶m->sinsr,SASIZE(¶m->sinsr))) { - if(errno != EAGAIN && errno != EINPROGRESS) return (13); - } - memset(fds, 0, sizeof(fds)); - fds[0].fd = param->remsock; - fds[0].events = POLLOUT; - if(so._poll(fds, 1, conf.timeouts[STRING_S]*1000) <= 0) { - return (13); + if(connectwithpoll(param->remsock,(struct sockaddr *)¶m->sinsr,SASIZE(¶m->sinsr))) { + return 13; } } size = sizeof(param->sinsl); diff --git a/src/dnspr.c b/src/dnspr.c index cacf4b6..4e44e23 100644 --- a/src/dnspr.c +++ b/src/dnspr.c @@ -140,7 +140,7 @@ void * dnsprchild(struct clientparam* param) { } param->sinsr = nservers[0].addr; if(nservers[0].usetcp) { - if(so._connect(param->remsock,(struct sockaddr *)¶m->sinsr,SASIZE(¶m->sinsr))) RETURN(830); + if(connectwithpoll(param->remsock,(struct sockaddr *)¶m->sinsr,SASIZE(¶m->sinsr))) RETURN(830); buf-=2; *(unsigned short*)buf = htons(i); i+=2; diff --git a/src/ftppr.c b/src/ftppr.c index 7c8d53a..057d245 100644 --- a/src/ftppr.c +++ b/src/ftppr.c @@ -145,7 +145,7 @@ void * ftpprchild(struct clientparam* param) { if(sscanf((char *)buf+5, "%lu,%lu,%lu,%lu,%hu,%hu", &b1, &b2, &b3, &b4, &b5, &b6)!=6) {RETURN(828);} *SAPORT(¶m->sincr) = htons((unsigned short)((b5<<8)^b6)); - if(so._connect(clidatasock, (struct sockaddr *)¶m->sincr, SASIZE(¶m->sincr))) { + if(connectwithpoll(clidatasock, (struct sockaddr *)¶m->sincr, SASIZE(¶m->sincr))) { so._closesocket(clidatasock); clidatasock = INVALID_SOCKET; RETURN(826); diff --git a/src/proxy.h b/src/proxy.h index 039f93a..236efb6 100644 --- a/src/proxy.h +++ b/src/proxy.h @@ -270,6 +270,7 @@ void srvinit2(struct srvparam * srv, struct clientparam *param); void srvfree(struct srvparam * srv); unsigned char * dologname (unsigned char *buf, unsigned char *name, const unsigned char *ext, ROTATION lt, time_t t); int readconfig(FILE * fp); +int connectwithpoll(SOCKET sock, struct sockaddr *sa, SASIZETYPE size); int myrand(void * entropy, int len); diff --git a/src/proxymain.c b/src/proxymain.c index b502888..369560a 100644 --- a/src/proxymain.c +++ b/src/proxymain.c @@ -553,7 +553,7 @@ int MODULEMAINFUNC (int argc, char** argv){ new_sock=so._socket(SASOCK(&defparam.sincr), SOCK_STREAM, IPPROTO_TCP); if(new_sock != INVALID_SOCKET){ parsehost(srv.family, cbc_string, (struct sockaddr *)&defparam.sincr); - if(so._connect(new_sock,(struct sockaddr *)&defparam.sincr,SASIZE(&defparam.sincr))) { + if(connectwithpoll(new_sock,(struct sockaddr *)&defparam.sincr,SASIZE(&defparam.sincr))) { so._closesocket(new_sock); new_sock = INVALID_SOCKET; usleep(SLEEPTIME);