mirror of
				https://github.com/3proxy/3proxy.git
				synced 2025-11-04 15:52:39 +08:00 
			
		
		
		
	initial partial patches for IPv6 client support
This commit is contained in:
		
							parent
							
								
									f1e017394d
								
							
						
					
					
						commit
						c7310a2060
					
				@ -694,6 +694,7 @@ static int h_proxy(int argc, unsigned char ** argv){
 | 
				
			|||||||
		childdef.service = S_ICQPR;
 | 
							childdef.service = S_ICQPR;
 | 
				
			||||||
		childdef.helpmessage = "";
 | 
							childdef.helpmessage = "";
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
	else if(!strcmp((char *)argv[0], "msnpr")) {
 | 
						else if(!strcmp((char *)argv[0], "msnpr")) {
 | 
				
			||||||
		childdef.pf = msnprchild;
 | 
							childdef.pf = msnprchild;
 | 
				
			||||||
		childdef.port = 0;
 | 
							childdef.port = 0;
 | 
				
			||||||
@ -701,6 +702,7 @@ static int h_proxy(int argc, unsigned char ** argv){
 | 
				
			|||||||
		childdef.service = S_MSNPR;
 | 
							childdef.service = S_MSNPR;
 | 
				
			||||||
		childdef.helpmessage = "";
 | 
							childdef.helpmessage = "";
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
	else if(!strcmp((char *)argv[0], "udppm")) {
 | 
						else if(!strcmp((char *)argv[0], "udppm")) {
 | 
				
			||||||
		childdef.pf = udppmchild;
 | 
							childdef.pf = udppmchild;
 | 
				
			||||||
		childdef.port = 0;
 | 
							childdef.port = 0;
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,7 @@
 | 
				
			|||||||
# 3 proxy common Makefile
 | 
					# 3 proxy common Makefile
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
all:	pre $(VERFILE) $(BUILDDIR)3proxy$(EXESUFFICS) $(BUILDDIR)mycrypt$(EXESUFFICS) $(BUILDDIR)dighosts$(EXESUFFICS) $(BUILDDIR)pop3p$(EXESUFFICS) $(BUILDDIR)smtpp$(EXESUFFICS) $(BUILDDIR)ftppr$(EXESUFFICS) $(BUILDDIR)tcppm$(EXESUFFICS) $(BUILDDIR)icqpr$(EXESUFFICS) $(BUILDDIR)msnpr$(EXESUFFICS) $(BUILDDIR)udppm$(EXESUFFICS) $(BUILDDIR)socks$(EXESUFFICS) $(BUILDDIR)proxy$(EXESUFFICS) $(BUILDDIR)countersutil$(EXESUFFICS) allplugins
 | 
					all:	pre $(BUILDDIR)3proxy$(EXESUFFICS) $(BUILDDIR)mycrypt$(EXESUFFICS) $(BUILDDIR)dighosts$(EXESUFFICS) $(BUILDDIR)pop3p$(EXESUFFICS) $(BUILDDIR)smtpp$(EXESUFFICS) $(BUILDDIR)ftppr$(EXESUFFICS) $(BUILDDIR)tcppm$(EXESUFFICS) $(BUILDDIR)icqpr$(EXESUFFICS) $(BUILDDIR)udppm$(EXESUFFICS) $(BUILDDIR)socks$(EXESUFFICS) $(BUILDDIR)proxy$(EXESUFFICS) $(BUILDDIR)countersutil$(EXESUFFICS) allplugins
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pre:
 | 
					pre:
 | 
				
			||||||
@ -53,9 +53,6 @@ tcppm$(OBJSUFFICS): tcppm.c proxy.h structures.h proxymain.c
 | 
				
			|||||||
icqpr$(OBJSUFFICS): icqpr.c proxy.h structures.h proxymain.c
 | 
					icqpr$(OBJSUFFICS): icqpr.c proxy.h structures.h proxymain.c
 | 
				
			||||||
	$(CC) $(CFLAGS) $(DEFINEOPTION)WITHMAIN $(DEFINEOPTION)PORTMAP icqpr.c
 | 
						$(CC) $(CFLAGS) $(DEFINEOPTION)WITHMAIN $(DEFINEOPTION)PORTMAP icqpr.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msnpr$(OBJSUFFICS): msnpr.c proxy.h structures.h proxymain.c
 | 
					 | 
				
			||||||
	$(CC) $(CFLAGS) $(DEFINEOPTION)WITHMAIN $(DEFINEOPTION)PORTMAP msnpr.c
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
socks$(OBJSUFFICS): socks.c proxy.h structures.h proxymain.c
 | 
					socks$(OBJSUFFICS): socks.c proxy.h structures.h proxymain.c
 | 
				
			||||||
	$(CC) $(CFLAGS) $(DEFINEOPTION)WITHMAIN $(DEFINEOPTION)NOPORTMAP socks.c
 | 
						$(CC) $(CFLAGS) $(DEFINEOPTION)WITHMAIN $(DEFINEOPTION)NOPORTMAP socks.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -86,9 +83,6 @@ $(BUILDDIR)tcppm$(EXESUFFICS): sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) tcp
 | 
				
			|||||||
$(BUILDDIR)icqpr$(EXESUFFICS): sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) icqpr$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS)
 | 
					$(BUILDDIR)icqpr$(EXESUFFICS): sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) icqpr$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS)
 | 
				
			||||||
	$(LN) $(LNOUT)$(BUILDDIR)icqpr$(EXESUFFICS) $(LDFLAGS) $(VERFILE) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) icqpr$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) $(LIBS)
 | 
						$(LN) $(LNOUT)$(BUILDDIR)icqpr$(EXESUFFICS) $(LDFLAGS) $(VERFILE) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) icqpr$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) $(LIBS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(BUILDDIR)msnpr$(EXESUFFICS): sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) msnpr$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS)
 | 
					 | 
				
			||||||
	$(LN) $(LNOUT)$(BUILDDIR)msnpr$(EXESUFFICS) $(LDFLAGS) $(VERFILE) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) msnpr$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) $(LIBS)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(BUILDDIR)udppm$(EXESUFFICS): sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) udppm$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS)
 | 
					$(BUILDDIR)udppm$(EXESUFFICS): sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) udppm$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS)
 | 
				
			||||||
	$(LN) $(LNOUT)$(BUILDDIR)udppm$(EXESUFFICS) $(LDFLAGS) $(VERFILE) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) udppm$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) $(LIBS)
 | 
						$(LN) $(LNOUT)$(BUILDDIR)udppm$(EXESUFFICS) $(LDFLAGS) $(VERFILE) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) udppm$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) $(LIBS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -115,9 +109,6 @@ srvtcppm$(OBJSUFFICS): tcppm.c proxy.h structures.h
 | 
				
			|||||||
srvicqpr$(OBJSUFFICS): icqpr.c proxy.h structures.h
 | 
					srvicqpr$(OBJSUFFICS): icqpr.c proxy.h structures.h
 | 
				
			||||||
	$(CC) $(COUT)srvicqpr$(OBJSUFFICS) $(CFLAGS) icqpr.c
 | 
						$(CC) $(COUT)srvicqpr$(OBJSUFFICS) $(CFLAGS) icqpr.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
srvmsnpr$(OBJSUFFICS): msnpr.c proxy.h structures.h
 | 
					 | 
				
			||||||
	$(CC) $(COUT)srvmsnpr$(OBJSUFFICS) $(CFLAGS) msnpr.c
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
srvsocks$(OBJSUFFICS): socks.c proxy.h structures.h
 | 
					srvsocks$(OBJSUFFICS): socks.c proxy.h structures.h
 | 
				
			||||||
	$(CC) $(COUT)srvsocks$(OBJSUFFICS) $(CFLAGS) socks.c
 | 
						$(CC) $(COUT)srvsocks$(OBJSUFFICS) $(CFLAGS) socks.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -174,8 +165,8 @@ ntlm$(OBJSUFFICS):  ntlm.c
 | 
				
			|||||||
stringtable$(OBJSUFFICS):  stringtable.c
 | 
					stringtable$(OBJSUFFICS):  stringtable.c
 | 
				
			||||||
	$(CC) $(COUT)stringtable$(OBJSUFFICS) $(CFLAGS) stringtable.c
 | 
						$(CC) $(COUT)stringtable$(OBJSUFFICS) $(CFLAGS) stringtable.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(BUILDDIR)3proxy$(EXESUFFICS): 3proxy$(OBJSUFFICS) mainfunc$(OBJSUFFICS) srvproxy$(OBJSUFFICS) srvpop3p$(OBJSUFFICS) srvsmtpp$(OBJSUFFICS) srvftppr$(OBJSUFFICS) srvsocks$(OBJSUFFICS) srvtcppm$(OBJSUFFICS) srvicqpr$(OBJSUFFICS) srvmsnpr$(OBJSUFFICS) srvudppm$(OBJSUFFICS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) auth$(OBJSUFFICS) datatypes$(OBJSUFFICS) md4$(OBJSUFFICS) md5$(OBJSUFFICS) mycrypt$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) smbdes$(OBJSUFFICS) ntlm$(OBJSUFFICS) stringtable$(OBJSUFFICS) srvwebadmin$(OBJSUFFICS) srvdnspr$(OBJSUFFICS) plugins$(OBJSUFFICS) $(COMPATLIBS)
 | 
					$(BUILDDIR)3proxy$(EXESUFFICS): 3proxy$(OBJSUFFICS) mainfunc$(OBJSUFFICS) srvproxy$(OBJSUFFICS) srvpop3p$(OBJSUFFICS) srvsmtpp$(OBJSUFFICS) srvftppr$(OBJSUFFICS) srvsocks$(OBJSUFFICS) srvtcppm$(OBJSUFFICS) srvicqpr$(OBJSUFFICS) srvudppm$(OBJSUFFICS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) auth$(OBJSUFFICS) datatypes$(OBJSUFFICS) md4$(OBJSUFFICS) md5$(OBJSUFFICS) mycrypt$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) smbdes$(OBJSUFFICS) ntlm$(OBJSUFFICS) stringtable$(OBJSUFFICS) srvwebadmin$(OBJSUFFICS) srvdnspr$(OBJSUFFICS) plugins$(OBJSUFFICS) $(COMPATLIBS)
 | 
				
			||||||
	$(LN) $(LNOUT)$(BUILDDIR)3proxy$(EXESUFFICS) $(LDFLAGS) $(VERFILE)  3proxy$(OBJSUFFICS) mainfunc$(OBJSUFFICS) auth$(OBJSUFFICS) datatypes$(OBJSUFFICS) srvproxy$(OBJSUFFICS) srvpop3p$(OBJSUFFICS) srvsmtpp$(OBJSUFFICS) srvftppr$(OBJSUFFICS) srvsocks$(OBJSUFFICS) srvtcppm$(OBJSUFFICS) srvicqpr$(OBJSUFFICS) srvmsnpr$(OBJSUFFICS) srvudppm$(OBJSUFFICS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) mycrypt$(OBJSUFFICS) md5$(OBJSUFFICS) md4$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) smbdes$(OBJSUFFICS) ntlm$(OBJSUFFICS) stringtable$(OBJSUFFICS) srvwebadmin$(OBJSUFFICS) srvdnspr$(OBJSUFFICS) plugins$(OBJSUFFICS) $(COMPATLIBS) $(LIBS)
 | 
						$(LN) $(LNOUT)$(BUILDDIR)3proxy$(EXESUFFICS) $(LDFLAGS) $(VERFILE)  3proxy$(OBJSUFFICS) mainfunc$(OBJSUFFICS) auth$(OBJSUFFICS) datatypes$(OBJSUFFICS) srvproxy$(OBJSUFFICS) srvpop3p$(OBJSUFFICS) srvsmtpp$(OBJSUFFICS) srvftppr$(OBJSUFFICS) srvsocks$(OBJSUFFICS) srvtcppm$(OBJSUFFICS) srvicqpr$(OBJSUFFICS) srvudppm$(OBJSUFFICS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) mycrypt$(OBJSUFFICS) md5$(OBJSUFFICS) md4$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) smbdes$(OBJSUFFICS) ntlm$(OBJSUFFICS) stringtable$(OBJSUFFICS) srvwebadmin$(OBJSUFFICS) srvdnspr$(OBJSUFFICS) plugins$(OBJSUFFICS) $(COMPATLIBS) $(LIBS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
clean:
 | 
					clean:
 | 
				
			||||||
	@$(REMOVECOMMAND) *$(OBJSUFFICS) $(COMPFILES)
 | 
						@$(REMOVECOMMAND) *$(OBJSUFFICS) $(COMPFILES)
 | 
				
			||||||
 | 
				
			|||||||
@ -260,9 +260,11 @@ int handleredirect(struct clientparam * param, struct ace * acentry){
 | 
				
			|||||||
					case R_ICQ:
 | 
										case R_ICQ:
 | 
				
			||||||
						param->redirectfunc = icqprchild;
 | 
											param->redirectfunc = icqprchild;
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
					case R_MSN:
 | 
										case R_MSN:
 | 
				
			||||||
						param->redirectfunc = msnprchild;
 | 
											param->redirectfunc = msnprchild;
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
					default:
 | 
										default:
 | 
				
			||||||
						param->redirectfunc = proxychild;
 | 
											param->redirectfunc = proxychild;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
				
			|||||||
@ -597,6 +597,10 @@ void logsyslog(struct clientparam * param, const unsigned char *s) {
 | 
				
			|||||||
int doconnect(struct clientparam * param){
 | 
					int doconnect(struct clientparam * param){
 | 
				
			||||||
 SASIZETYPE size = sizeof(param->sins);
 | 
					 SASIZETYPE size = sizeof(param->sins);
 | 
				
			||||||
 struct sockaddr_in bindsa;
 | 
					 struct sockaddr_in bindsa;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 if (*SAFAMILY(¶m->sincr) == *SAFAMILY(¶m->req) && !memcmp(SAADDR(¶m->sincr), SAADDR(¶m->req), SASIZE(param->req)) &&
 | 
				
			||||||
 | 
						*SAPORT(¶m->sincr) == *SAPORT(¶m->req)) return 519;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 if (param->operation == ADMIN || param->operation == DNSRESOLVE || param->operation == BIND || param->operation == UDPASSOC)
 | 
					 if (param->operation == ADMIN || param->operation == DNSRESOLVE || param->operation == BIND || param->operation == UDPASSOC)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
 if (param->remsock != INVALID_SOCKET){
 | 
					 if (param->remsock != INVALID_SOCKET){
 | 
				
			||||||
 | 
				
			|||||||
@ -71,7 +71,7 @@ void * ftpprchild(struct clientparam* param) {
 | 
				
			|||||||
		param->res = res;
 | 
							param->res = res;
 | 
				
			||||||
		if(inbuf && inbuf != BUFSIZE && socksend(param->ctrlsock, buf, inbuf, conf.timeouts[STRING_S])!=inbuf) {RETURN (807);}
 | 
							if(inbuf && inbuf != BUFSIZE && socksend(param->ctrlsock, buf, inbuf, conf.timeouts[STRING_S])!=inbuf) {RETURN (807);}
 | 
				
			||||||
		if(!res) status = 3;
 | 
							if(!res) status = 3;
 | 
				
			||||||
		sprintf((char *)buf, "%.64s@%.128s%c%hu", param->extusername, param->hostname, (ntohs(param->sins.sin_port)==21)?0:':', ntohs(param->sins.sin_port));
 | 
							sprintf((char *)buf, "%.64s@%.128s%c%hu", param->extusername, param->hostname, (ntohs(*SAPORT(¶m->sinsr))==21)?0:':', ntohs(*SAPORT(¶m->sinsr)));
 | 
				
			||||||
		req = mystrdup((char *)buf);
 | 
							req = mystrdup((char *)buf);
 | 
				
			||||||
#ifndef WITHMAIN
 | 
					#ifndef WITHMAIN
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
 | 
				
			|||||||
@ -105,7 +105,7 @@ static void addbuffer(int increment, struct clientparam * param, unsigned char *
 | 
				
			|||||||
		*buf_p = newbuf;
 | 
							*buf_p = newbuf;
 | 
				
			||||||
		*bufsize_p = bufsize;
 | 
							*bufsize_p = bufsize;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if(increment) len = sockrecvfrom(param->remsock, (struct sockaddr *)¶m->sins, *buf_p + *length_p, increment, conf.timeouts[STRING_S]*1000);
 | 
						if(increment) len = sockrecvfrom(param->remsock, (struct sockaddr *)¶m->sinsr, *buf_p + *length_p, increment, conf.timeouts[STRING_S]*1000);
 | 
				
			||||||
	if(len > 0) {
 | 
						if(len > 0) {
 | 
				
			||||||
		*length_p += len;
 | 
							*length_p += len;
 | 
				
			||||||
		param->nreads++;
 | 
							param->nreads++;
 | 
				
			||||||
 | 
				
			|||||||
@ -70,13 +70,15 @@ struct symbol symbols[] = {
 | 
				
			|||||||
	{symbols+42, "ftppr", (void *) ftpprchild},
 | 
						{symbols+42, "ftppr", (void *) ftpprchild},
 | 
				
			||||||
	{symbols+43, "smtpp", (void *) smtppchild},
 | 
						{symbols+43, "smtpp", (void *) smtppchild},
 | 
				
			||||||
	{symbols+44, "icqpr", (void *) icqprchild},
 | 
						{symbols+44, "icqpr", (void *) icqprchild},
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
	{symbols+45, "msnpr", (void *) msnprchild},
 | 
						{symbols+45, "msnpr", (void *) msnprchild},
 | 
				
			||||||
	{symbols+46, "authfuncs", (void *) &authfuncs},
 | 
					*/
 | 
				
			||||||
	{symbols+47, "commandhandlers", (void *) &commandhandlers},
 | 
						{symbols+45, "authfuncs", (void *) &authfuncs},
 | 
				
			||||||
	{symbols+48, "decodeurl", (void *) decodeurl},
 | 
						{symbols+46, "commandhandlers", (void *) &commandhandlers},
 | 
				
			||||||
	{symbols+49, "parsestr", (void *) parsestr},
 | 
						{symbols+47, "decodeurl", (void *) decodeurl},
 | 
				
			||||||
	{symbols+50, "make_ace", (void *) make_ace},
 | 
						{symbols+48, "parsestr", (void *) parsestr},
 | 
				
			||||||
	{symbols+51, "freeacl", (void *) freeacl},
 | 
						{symbols+49, "make_ace", (void *) make_ace},
 | 
				
			||||||
 | 
						{symbols+50, "freeacl", (void *) freeacl},
 | 
				
			||||||
	{NULL, "", NULL}
 | 
						{NULL, "", NULL}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -49,7 +49,7 @@ void * pop3pchild(struct clientparam* param) {
 | 
				
			|||||||
CLEANRET:
 | 
					CLEANRET:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 if(param->hostname&¶m->extusername) {
 | 
					 if(param->hostname&¶m->extusername) {
 | 
				
			||||||
	sprintf((char *)buf, "%.64s@%.128s%c%hu", param->extusername, param->hostname, (ntohs(param->sins.sin_port)==110)?0:':', ntohs(param->sins.sin_port));
 | 
						sprintf((char *)buf, "%.64s@%.128s%c%hu", param->extusername, param->hostname, (*SAPORT(¶m->sinsr)==110)?0:':', ntohs(*SAPORT(¶m->sinsr)));
 | 
				
			||||||
	 (*param->srv->logfunc)(param, buf);
 | 
						 (*param->srv->logfunc)(param, buf);
 | 
				
			||||||
 }
 | 
					 }
 | 
				
			||||||
 else (*param->srv->logfunc)(param, NULL);
 | 
					 else (*param->srv->logfunc)(param, NULL);
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										13
									
								
								src/proxy.c
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								src/proxy.c
									
									
									
									
									
								
							@ -229,7 +229,6 @@ void * proxychild(struct clientparam* param) {
 | 
				
			|||||||
 int authenticate;
 | 
					 int authenticate;
 | 
				
			||||||
 struct pollfd fds[2];
 | 
					 struct pollfd fds[2];
 | 
				
			||||||
 SOCKET ftps;
 | 
					 SOCKET ftps;
 | 
				
			||||||
 SASIZETYPE sasize;
 | 
					 | 
				
			||||||
#ifndef WITHMAIN
 | 
					#ifndef WITHMAIN
 | 
				
			||||||
 FILTER_ACTION action;
 | 
					 FILTER_ACTION action;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
@ -260,8 +259,6 @@ for(;;){
 | 
				
			|||||||
		ckeepalive = 0;
 | 
							ckeepalive = 0;
 | 
				
			||||||
		so._shutdown(param->remsock, SHUT_RDWR);
 | 
							so._shutdown(param->remsock, SHUT_RDWR);
 | 
				
			||||||
		so._closesocket(param->remsock);
 | 
							so._closesocket(param->remsock);
 | 
				
			||||||
		param->sins.sin_addr.s_addr = 0;
 | 
					 | 
				
			||||||
		param->sins.sin_port = 0;
 | 
					 | 
				
			||||||
		param->remsock = INVALID_SOCKET;
 | 
							param->remsock = INVALID_SOCKET;
 | 
				
			||||||
		param->redirected = 0;
 | 
							param->redirected = 0;
 | 
				
			||||||
		param->redirtype = 0;
 | 
							param->redirtype = 0;
 | 
				
			||||||
@ -282,8 +279,6 @@ for(;;){
 | 
				
			|||||||
			so._shutdown(param->remsock, SHUT_RDWR);
 | 
								so._shutdown(param->remsock, SHUT_RDWR);
 | 
				
			||||||
			so._closesocket(param->remsock);
 | 
								so._closesocket(param->remsock);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		param->sins.sin_addr.s_addr = 0;
 | 
					 | 
				
			||||||
		param->sins.sin_port = 0;
 | 
					 | 
				
			||||||
		param->remsock = INVALID_SOCKET;
 | 
							param->remsock = INVALID_SOCKET;
 | 
				
			||||||
		param->redirected = 0;
 | 
							param->redirected = 0;
 | 
				
			||||||
		param->redirtype = 0;
 | 
							param->redirtype = 0;
 | 
				
			||||||
@ -545,14 +540,6 @@ for(;;){
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 if((res = (*param->srv->authfunc)(param))) {RETURN(res);}
 | 
					 if((res = (*param->srv->authfunc)(param))) {RETURN(res);}
 | 
				
			||||||
 if (*SAFAMILY(¶m->srv->intsa) == AF_INET &&
 | 
					 | 
				
			||||||
	(param->sins.sin_addr.s_addr == ((struct sockaddr_in *)¶m->srv->intsa)->sin_addr.s_addr && param->sins.sin_port == *SAPORT(¶m->srv->intsa))) {
 | 
					 | 
				
			||||||
	RETURN(519);
 | 
					 | 
				
			||||||
 }
 | 
					 | 
				
			||||||
 sasize = sizeof(struct sockaddr_in);
 | 
					 | 
				
			||||||
 if(so._getpeername(param->remsock, (struct sockaddr *)¶m->sins, &sasize)){
 | 
					 | 
				
			||||||
	RETURN(520);
 | 
					 | 
				
			||||||
 }
 | 
					 | 
				
			||||||
#define FTPBUFSIZE 1536
 | 
					#define FTPBUFSIZE 1536
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 if(ftp && param->redirtype != R_HTTP){
 | 
					 if(ftp && param->redirtype != R_HTTP){
 | 
				
			||||||
 | 
				
			|||||||
@ -388,10 +388,14 @@ int MODULEMAINFUNC (int argc, char** argv){
 | 
				
			|||||||
 }
 | 
					 }
 | 
				
			||||||
 memset(&defparam.sincr, 0, sizeof(defparam.sincr));
 | 
					 memset(&defparam.sincr, 0, sizeof(defparam.sincr));
 | 
				
			||||||
 memset(&defparam.sincl, 0, sizeof(defparam.sincl));
 | 
					 memset(&defparam.sincl, 0, sizeof(defparam.sincl));
 | 
				
			||||||
 memset(&defparam.sins, 0, sizeof(defparam.sins));
 | 
					 memset(&defparam.sinsl, 0, sizeof(defparam.sinsl));
 | 
				
			||||||
 | 
					 memset(&defparam.sinsr, 0, sizeof(defparam.sinsr));
 | 
				
			||||||
 | 
					 memset(&defparam.req, 0, sizeof(defparam.req));
 | 
				
			||||||
 *SAFAMILY(&defparam.sincr) = AF_INET;
 | 
					 *SAFAMILY(&defparam.sincr) = AF_INET;
 | 
				
			||||||
 *SAFAMILY(&defparam.sincl) = AF_INET;
 | 
					 *SAFAMILY(&defparam.sincl) = AF_INET;
 | 
				
			||||||
 *SAFAMILY(&defparam.sins) = AF_INET;
 | 
					 *SAFAMILY(&defparam.sinsl) = AF_INET;
 | 
				
			||||||
 | 
					 *SAFAMILY(&defparam.sinsr) = AF_INET;
 | 
				
			||||||
 | 
					 *SAFAMILY(&defparam.req) = AF_INET;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 srv.fds.fd = sock;
 | 
					 srv.fds.fd = sock;
 | 
				
			||||||
 srv.fds.events = POLLIN;
 | 
					 srv.fds.events = POLLIN;
 | 
				
			||||||
@ -544,7 +548,7 @@ void srvinit(struct srvparam * srv, struct clientparam *param){
 | 
				
			|||||||
 memset(param, 0, sizeof(struct clientparam));
 | 
					 memset(param, 0, sizeof(struct clientparam));
 | 
				
			||||||
 param->srv = srv;
 | 
					 param->srv = srv;
 | 
				
			||||||
 param->remsock = param->clisock = param->ctrlsock = param->ctrlsocksrv = INVALID_SOCKET;
 | 
					 param->remsock = param->clisock = param->ctrlsock = param->ctrlsocksrv = INVALID_SOCKET;
 | 
				
			||||||
 *SAFAMILY(¶m->req) = *SAFAMILY(¶m->sins) = *SAFAMILY(¶m->sincr) = *SAFAMILY(¶m->sincl) = AF_INET;
 | 
					 *SAFAMILY(¶m->req) = *SAFAMILY(¶m->sinsl) = *SAFAMILY(¶m->sinsr) = *SAFAMILY(¶m->sincr) = *SAFAMILY(¶m->sincl) = AF_INET;
 | 
				
			||||||
 pthread_mutex_init(&srv->counter_mutex, NULL);
 | 
					 pthread_mutex_init(&srv->counter_mutex, NULL);
 | 
				
			||||||
 memcpy(&srv->intsa, &conf.intsa, sizeof(srv->intsa));
 | 
					 memcpy(&srv->intsa, &conf.intsa, sizeof(srv->intsa));
 | 
				
			||||||
 memcpy(&srv->extsa, &conf.extsa, sizeof(srv->extsa));
 | 
					 memcpy(&srv->extsa, &conf.extsa, sizeof(srv->extsa));
 | 
				
			||||||
@ -567,8 +571,7 @@ void srvinit2(struct srvparam * srv, struct clientparam *param){
 | 
				
			|||||||
 }
 | 
					 }
 | 
				
			||||||
 if(srv->logtarget) srv->logtarget = (unsigned char *)mystrdup((char *)srv->logtarget);
 | 
					 if(srv->logtarget) srv->logtarget = (unsigned char *)mystrdup((char *)srv->logtarget);
 | 
				
			||||||
 memcpy(¶m->sincr, &srv->intsa, sizeof(param->sincr));
 | 
					 memcpy(¶m->sincr, &srv->intsa, sizeof(param->sincr));
 | 
				
			||||||
/* FIX ME */
 | 
					 memcpy(¶m->sinsl, &srv->extsa, sizeof(param->sinsl));
 | 
				
			||||||
 memcpy(¶m->sins, &srv->extsa, sizeof(param->sins));
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void srvfree(struct srvparam * srv){
 | 
					void srvfree(struct srvparam * srv){
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										10
									
								
								src/smtpp.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								src/smtpp.c
									
									
									
									
									
								
							@ -83,7 +83,7 @@ int readdata (struct clientparam* param) {
 | 
				
			|||||||
		return -1;
 | 
							return -1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	socksendto(param->remsock, (struct sockaddr *)¶m->sins, buf, i, conf.timeouts[STRING_S]);	
 | 
						socksendto(param->remsock, (struct sockaddr *)¶m->sinsr, buf, i, conf.timeouts[STRING_S]);	
 | 
				
			||||||
 } 
 | 
					 } 
 | 
				
			||||||
 if(i < 1) {
 | 
					 if(i < 1) {
 | 
				
			||||||
	myfree(buf);
 | 
						myfree(buf);
 | 
				
			||||||
@ -99,7 +99,6 @@ void * smtppchild(struct clientparam* param) {
 | 
				
			|||||||
 int i=0, res;
 | 
					 int i=0, res;
 | 
				
			||||||
 unsigned char buf[320];
 | 
					 unsigned char buf[320];
 | 
				
			||||||
 unsigned char username[256];
 | 
					 unsigned char username[256];
 | 
				
			||||||
 unsigned long ul;
 | 
					 | 
				
			||||||
 char * command = NULL;
 | 
					 char * command = NULL;
 | 
				
			||||||
 int login = 0;
 | 
					 int login = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -188,8 +187,9 @@ void * smtppchild(struct clientparam* param) {
 | 
				
			|||||||
 if( i < 3 ) {RETURN(671);}
 | 
					 if( i < 3 ) {RETURN(671);}
 | 
				
			||||||
 buf[i] = 0;
 | 
					 buf[i] = 0;
 | 
				
			||||||
 if(strncasecmp((char *)buf, "220", 3)||!strncasecmp((char *)buf+4, "PROXY", 5)){RETURN(672);}
 | 
					 if(strncasecmp((char *)buf, "220", 3)||!strncasecmp((char *)buf+4, "PROXY", 5)){RETURN(672);}
 | 
				
			||||||
 ul = param->extip;
 | 
					 i = sprintf(buf, "EHLO [");
 | 
				
			||||||
 i = sprintf(buf, "EHLO [%lu.%lu.%lu.%lu]\r\n", ((ul&0xFF000000)>>24), ((ul&0x00FF0000)>>16), ((ul&0x0000FF00)>>8), ((ul&0x000000FF)));
 | 
					 i += myinet_ntop(*SAFAMILY(¶m->sinsl), SAADDR(¶m->sinsl), buf+strlen(buf), 64);
 | 
				
			||||||
 | 
					 i += sprintf(buf+strlen(buf), "]\r\n");
 | 
				
			||||||
 if(socksend(param->remsock, buf, i, conf.timeouts[STRING_S])!= i) {RETURN(673);}
 | 
					 if(socksend(param->remsock, buf, i, conf.timeouts[STRING_S])!= i) {RETURN(673);}
 | 
				
			||||||
 param->statscli64+=i;
 | 
					 param->statscli64+=i;
 | 
				
			||||||
 param->nwrites++;
 | 
					 param->nwrites++;
 | 
				
			||||||
@ -292,7 +292,7 @@ void * smtppchild(struct clientparam* param) {
 | 
				
			|||||||
CLEANRET:
 | 
					CLEANRET:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 if(param->hostname&¶m->extusername) {
 | 
					 if(param->hostname&¶m->extusername) {
 | 
				
			||||||
	sprintf((char *)buf, "%.64s@%.128s%c%hu", param->extusername, param->hostname, (ntohs(param->sins.sin_port)==25)?0:':', ntohs(param->sins.sin_port));
 | 
						sprintf((char *)buf, "%.64s@%.128s%c%hu", param->extusername, param->hostname, (ntohs(*SAPORT(¶m->sinsr))==25)?0:':', *SAPORT(¶m->sinsr));
 | 
				
			||||||
	 (*param->srv->logfunc)(param, buf);
 | 
						 (*param->srv->logfunc)(param, buf);
 | 
				
			||||||
 }
 | 
					 }
 | 
				
			||||||
 else (*param->srv->logfunc)(param, NULL);
 | 
					 else (*param->srv->logfunc)(param, NULL);
 | 
				
			||||||
 | 
				
			|||||||
@ -123,7 +123,7 @@ int sockfillbuffsrv(struct clientparam * param, unsigned long size, int timeosec
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	if(size <= param->srvinbuf) return size;
 | 
						if(size <= param->srvinbuf) return size;
 | 
				
			||||||
	size -= param->srvinbuf;
 | 
						size -= param->srvinbuf;
 | 
				
			||||||
	if((len = sockrecvfrom(param->remsock, (struct sockaddr *)¶m->sins, param->srvbuf + param->srvinbuf, (param->srvbufsize - param->srvinbuf) < size? param->srvbufsize - param->srvinbuf:size, timeosec*1000)) > 0){
 | 
						if((len = sockrecvfrom(param->remsock, (struct sockaddr *)¶m->sinsr, param->srvbuf + param->srvinbuf, (param->srvbufsize - param->srvinbuf) < size? param->srvbufsize - param->srvinbuf:size, timeosec*1000)) > 0){
 | 
				
			||||||
		param->srvinbuf += len;
 | 
							param->srvinbuf += len;
 | 
				
			||||||
		param->nreads++;
 | 
							param->nreads++;
 | 
				
			||||||
		param->statssrv64 += len;
 | 
							param->statssrv64 += len;
 | 
				
			||||||
@ -148,7 +148,7 @@ int sockgetcharsrv(struct clientparam * param, int timeosec, int timeousec){
 | 
				
			|||||||
		return (int)param->srvbuf[param->srvoffset++];
 | 
							return (int)param->srvbuf[param->srvoffset++];
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	param->srvoffset = param->srvinbuf = 0;
 | 
						param->srvoffset = param->srvinbuf = 0;
 | 
				
			||||||
	if ((len = sockrecvfrom(param->remsock, (struct sockaddr *)¶m->sins, param->srvbuf, param->srvbufsize, timeosec*1000 + timeousec))<=0) return EOF;
 | 
						if ((len = sockrecvfrom(param->remsock, (struct sockaddr *)¶m->sinsr, param->srvbuf, param->srvbufsize, timeosec*1000 + timeousec))<=0) return EOF;
 | 
				
			||||||
	param->srvinbuf = len;
 | 
						param->srvinbuf = len;
 | 
				
			||||||
	param->srvoffset = 1;
 | 
						param->srvoffset = 1;
 | 
				
			||||||
	param->nreads++;
 | 
						param->nreads++;
 | 
				
			||||||
 | 
				
			|||||||
@ -154,7 +154,7 @@ int sockmap(struct clientparam * param, int timeo){
 | 
				
			|||||||
			sl1 = (*param->bandlimfunc)(param, 0, param->cliinbuf - param->clioffset);
 | 
								sl1 = (*param->bandlimfunc)(param, 0, param->cliinbuf - param->clioffset);
 | 
				
			||||||
			if(sl1 > sleeptime) sleeptime = sl1;
 | 
								if(sl1 > sleeptime) sleeptime = sl1;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		res = so._sendto(param->remsock, param->clibuf + param->clioffset, (!param->waitclient64 || (param->waitclient64 - sent) > (param->cliinbuf - param->clioffset))? param->cliinbuf - param->clioffset : (int)(param->waitclient64 - sent), 0, (struct sockaddr*)¶m->sins, sasize);
 | 
							res = so._sendto(param->remsock, param->clibuf + param->clioffset, (!param->waitclient64 || (param->waitclient64 - sent) > (param->cliinbuf - param->clioffset))? param->cliinbuf - param->clioffset : (int)(param->waitclient64 - sent), 0, (struct sockaddr*)¶m->sinsr, sasize);
 | 
				
			||||||
		if(res < 0) {
 | 
							if(res < 0) {
 | 
				
			||||||
			if(errno != EAGAIN && errno != EINTR) return 97;
 | 
								if(errno != EAGAIN && errno != EINTR) return 97;
 | 
				
			||||||
			if(errno == EINTR) usleep(SLEEPTIME);
 | 
								if(errno == EINTR) usleep(SLEEPTIME);
 | 
				
			||||||
@ -257,7 +257,7 @@ int sockmap(struct clientparam * param, int timeo){
 | 
				
			|||||||
#if DEBUGLEVEL > 2
 | 
					#if DEBUGLEVEL > 2
 | 
				
			||||||
(*param->srv->logfunc)(param, "flushing buffer to server");
 | 
					(*param->srv->logfunc)(param, "flushing buffer to server");
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	res = socksendto(param->remsock, (struct sockaddr *)¶m->sins, param->clibuf + param->clioffset, param->cliinbuf - param->clioffset, conf.timeouts[STRING_S] * 1000);
 | 
						res = socksendto(param->remsock, (struct sockaddr *)¶m->sinsr, param->clibuf + param->clioffset, param->cliinbuf - param->clioffset, conf.timeouts[STRING_S] * 1000);
 | 
				
			||||||
	if(res > 0){
 | 
						if(res > 0){
 | 
				
			||||||
		param->clioffset += res;
 | 
							param->clioffset += res;
 | 
				
			||||||
		param->statscli64 += res;
 | 
							param->statscli64 += res;
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										146
									
								
								src/socks.c
									
									
									
									
									
								
							
							
						
						
									
										146
									
								
								src/socks.c
									
									
									
									
									
								
							@ -22,6 +22,7 @@ void * sockschild(struct clientparam* param) {
 | 
				
			|||||||
 SOCKET s;
 | 
					 SOCKET s;
 | 
				
			||||||
 unsigned size;
 | 
					 unsigned size;
 | 
				
			||||||
 SASIZETYPE sasize;
 | 
					 SASIZETYPE sasize;
 | 
				
			||||||
 | 
					 unsigned short port = 0;
 | 
				
			||||||
 unsigned char * buf=NULL;
 | 
					 unsigned char * buf=NULL;
 | 
				
			||||||
 unsigned char c;
 | 
					 unsigned char c;
 | 
				
			||||||
 unsigned char command=0;
 | 
					 unsigned char command=0;
 | 
				
			||||||
@ -29,14 +30,13 @@ void * sockschild(struct clientparam* param) {
 | 
				
			|||||||
 int ver=0;
 | 
					 int ver=0;
 | 
				
			||||||
 int havepass = 0;
 | 
					 int havepass = 0;
 | 
				
			||||||
#ifndef NOIPV6
 | 
					#ifndef NOIPV6
 | 
				
			||||||
 struct sockaddr_in6 sin;
 | 
					 struct sockaddr_in6 sin = {AF_INET6};
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
 struct sockaddr_in sin;
 | 
					 struct sockaddr_in sin = {AF_INET};
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 int len;
 | 
					 int len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 param->req.sin_addr.s_addr = 0;
 | 
					 | 
				
			||||||
 param->service = S_SOCKS;
 | 
					 param->service = S_SOCKS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 if(!(buf = myalloc(BUFSIZE))) {RETURN(21);}
 | 
					 if(!(buf = myalloc(BUFSIZE))) {RETURN(21);}
 | 
				
			||||||
@ -86,21 +86,26 @@ void * sockschild(struct clientparam* param) {
 | 
				
			|||||||
	buf[0] = (unsigned char) res;
 | 
						buf[0] = (unsigned char) res;
 | 
				
			||||||
	if ((res = sockgetcharcli(param, conf.timeouts[SINGLEBYTE_S], 0)) == EOF) {RETURN(441);}
 | 
						if ((res = sockgetcharcli(param, conf.timeouts[SINGLEBYTE_S], 0)) == EOF) {RETURN(441);}
 | 
				
			||||||
	buf[1] = (unsigned char) res;
 | 
						buf[1] = (unsigned char) res;
 | 
				
			||||||
	param->sins.sin_port = param->req.sin_port = *(unsigned short*)buf;
 | 
						port = *(unsigned short*)buf;
 | 
				
			||||||
	c = 1;
 | 
						c = 1;
 | 
				
			||||||
 }
 | 
					 }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 | 
					 size = 4;
 | 
				
			||||||
 switch(c) {
 | 
					 switch(c) {
 | 
				
			||||||
 | 
						case 4:
 | 
				
			||||||
 | 
							size = 16;
 | 
				
			||||||
	case 1:
 | 
						case 1:
 | 
				
			||||||
		for (i = 0; i<4; i++){
 | 
							for (i = 0; i<size; i++){
 | 
				
			||||||
			if ((res = sockgetcharcli(param, conf.timeouts[SINGLEBYTE_S], 0)) == EOF) {RETURN(441);}
 | 
								if ((res = sockgetcharcli(param, conf.timeouts[SINGLEBYTE_S], 0)) == EOF) {RETURN(441);}
 | 
				
			||||||
			buf[i] = (unsigned char)res;
 | 
								buf[i] = (unsigned char)res;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		param->sins.sin_addr.s_addr = param->req.sin_addr.s_addr = *(unsigned long *)buf;
 | 
							*SAFAMILY(¶m->sinsr) = *SAFAMILY(¶m->req) = (c == 1)? AF_INET:AF_INET6;
 | 
				
			||||||
		if(command==1 && !param->req.sin_addr.s_addr) {
 | 
							memcpy(SAADDR(¶m->sinsr), buf, size);
 | 
				
			||||||
 | 
							memcpy(SAADDR(¶m->req), buf, size);
 | 
				
			||||||
 | 
							if(command==1 && !memcmp(SAADDR(¶m->req), "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", size)) {
 | 
				
			||||||
			RETURN(421);
 | 
								RETURN(421);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		myinet_ntop(*SAFAMILY(¶m->sins), SAADDR(¶m->sins), (char *)buf, 64);
 | 
							myinet_ntop(*SAFAMILY(¶m->sinsr), SAADDR(¶m->sinsr), (char *)buf, 64);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	case 3:
 | 
						case 3:
 | 
				
			||||||
		if ((size = sockgetcharcli(param, conf.timeouts[SINGLEBYTE_S], 0)) == EOF) {RETURN(451);} /* nmethods */
 | 
							if ((size = sockgetcharcli(param, conf.timeouts[SINGLEBYTE_S], 0)) == EOF) {RETURN(451);} /* nmethods */
 | 
				
			||||||
@ -109,10 +114,8 @@ void * sockschild(struct clientparam* param) {
 | 
				
			|||||||
			buf[i] = (unsigned char)res;
 | 
								buf[i] = (unsigned char)res;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		buf[i] = 0;
 | 
							buf[i] = 0;
 | 
				
			||||||
		param->sins.sin_addr.s_addr = param->req.sin_addr.s_addr = getip(buf);
 | 
							if(!getip46(param->srv->family, buf, (struct sockaddr *) ¶m->req)) RETURN(100);
 | 
				
			||||||
		if(command==1 && !param->req.sin_addr.s_addr) {
 | 
							memcpy(¶m->sinsr, ¶m->req, sizeof(¶m->req));
 | 
				
			||||||
			RETURN(100);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		RETURN(997);
 | 
							RETURN(997);
 | 
				
			||||||
@ -124,39 +127,39 @@ void * sockschild(struct clientparam* param) {
 | 
				
			|||||||
	 buf[0] = (unsigned char) res;
 | 
						 buf[0] = (unsigned char) res;
 | 
				
			||||||
	 if ((res = sockgetcharcli(param, conf.timeouts[SINGLEBYTE_S], 0)) == EOF) {RETURN(441);}
 | 
						 if ((res = sockgetcharcli(param, conf.timeouts[SINGLEBYTE_S], 0)) == EOF) {RETURN(441);}
 | 
				
			||||||
	 buf[1] = (unsigned char) res;
 | 
						 buf[1] = (unsigned char) res;
 | 
				
			||||||
	 param->sins.sin_port = param->req.sin_port = *(unsigned short*)buf;
 | 
						 port = *(unsigned short*)buf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 }
 | 
					 }
 | 
				
			||||||
 else {
 | 
					 else {
 | 
				
			||||||
	sockgetlinebuf(param, CLIENT, buf, BUFSIZE - 1, 0, conf.timeouts[STRING_S]);
 | 
						sockgetlinebuf(param, CLIENT, buf, BUFSIZE - 1, 0, conf.timeouts[STRING_S]);
 | 
				
			||||||
	buf[127] = 0;
 | 
						buf[127] = 0;
 | 
				
			||||||
	if(!param->srv->nouser && *buf && !param->username)param->username = (unsigned char *)mystrdup((char *)buf);
 | 
						if(!param->srv->nouser && *buf && !param->username)param->username = (unsigned char *)mystrdup((char *)buf);
 | 
				
			||||||
	if(param->sins.sin_addr.s_addr && ntohl(param->sins.sin_addr.s_addr)<256){
 | 
						if(!memcmp(SAADDR(¶m->req), "\0\0\0", 3)){
 | 
				
			||||||
		param->service = S_SOCKS45;
 | 
							param->service = S_SOCKS45;
 | 
				
			||||||
		sockgetlinebuf(param, CLIENT, buf, BUFSIZE - 1, 0, conf.timeouts[STRING_S]);
 | 
							sockgetlinebuf(param, CLIENT, buf, BUFSIZE - 1, 0, conf.timeouts[STRING_S]);
 | 
				
			||||||
		buf[127] = 0;
 | 
							buf[127] = 0;
 | 
				
			||||||
		if(param->hostname)myfree(param->hostname);
 | 
							if(param->hostname)myfree(param->hostname);
 | 
				
			||||||
		param->hostname = (unsigned char *)mystrdup((char *)buf);
 | 
							param->hostname = (unsigned char *)mystrdup((char *)buf);
 | 
				
			||||||
		param->sins.sin_addr.s_addr = param->req.sin_addr.s_addr = getip(buf);
 | 
							if(!getip46(param->srv->family, buf, (struct sockaddr *) ¶m->req)) RETURN(100);
 | 
				
			||||||
 | 
							memcpy(¶m->sinsr, ¶m->req, sizeof(¶m->req));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 }
 | 
					 }
 | 
				
			||||||
 if(command == 1 && !param->req.sin_port) {RETURN(421);}
 | 
					
 | 
				
			||||||
 param->sins.sin_family = AF_INET;
 | 
					 *SAPORT(¶m->sinsr) = *SAPORT(¶m->req) = port;
 | 
				
			||||||
 | 
					 if(command == 1 && !*SAPORT(¶m->sinsr)) {RETURN(421);}
 | 
				
			||||||
 switch(command) { 
 | 
					 switch(command) { 
 | 
				
			||||||
	case 1:
 | 
						case 1:
 | 
				
			||||||
	 param->operation = CONNECT;
 | 
						 param->operation = CONNECT;
 | 
				
			||||||
	 break;
 | 
						 break;
 | 
				
			||||||
 	case 2:
 | 
					 	case 2:
 | 
				
			||||||
	 param->sins.sin_addr.s_addr = param->extip;
 | 
					 | 
				
			||||||
	 param->sins.sin_port = param->extport?param->extport:param->req.sin_port;
 | 
					 | 
				
			||||||
	 if ((param->remsock=so._socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) {RETURN (11);}
 | 
					 | 
				
			||||||
	 param->operation = BIND;
 | 
					 | 
				
			||||||
	 break;
 | 
					 | 
				
			||||||
	case 3:
 | 
						case 3:
 | 
				
			||||||
	 param->sins.sin_port = param->extport?param->extport:param->req.sin_port;
 | 
						 
 | 
				
			||||||
	 param->sins.sin_addr.s_addr = param->extip;
 | 
						 memcpy(¶m->sinsl, *SAFAMILY(¶m->req)==AF_INET6? (struct sockaddr *)¶m->srv->extsa6:(struct sockaddr *)¶m->srv->extsa, SASIZE(¶m->req)); 
 | 
				
			||||||
	 if ((param->remsock=so._socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) {RETURN (11);}
 | 
						 if(!*SAPORT(¶m->sinsl))*SAPORT(¶m->sinsl) = port;
 | 
				
			||||||
	 param->operation = UDPASSOC;
 | 
						 if ((param->remsock=so._socket(*SAFAMILY(¶m->req), command == 2? SOCK_STREAM:SOCK_DGRAM, command == 2?IPPROTO_TCP:IPPROTO_UDP)) == INVALID_SOCKET) {RETURN (11);}
 | 
				
			||||||
 | 
						 param->operation = command == 2?BIND:UDPASSOC;
 | 
				
			||||||
	 break;
 | 
						 break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
	 RETURN(997);
 | 
						 RETURN(997);
 | 
				
			||||||
 }
 | 
					 }
 | 
				
			||||||
@ -166,25 +169,22 @@ void * sockschild(struct clientparam* param) {
 | 
				
			|||||||
 }
 | 
					 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 if(command > 1) {
 | 
					 if(command > 1) {
 | 
				
			||||||
	if(so._bind(param->remsock,(struct sockaddr *)¶m->sins,sizeof(param->sins))) {
 | 
						if(so._bind(param->remsock,(struct sockaddr *)¶m->sinsl,SASIZE(¶m->sinsl))) {
 | 
				
			||||||
		param->sins.sin_port = 0;
 | 
							*SAPORT(¶m->sinsl) = 0;
 | 
				
			||||||
		if(so._bind(param->remsock,(struct sockaddr *)¶m->sins,sizeof(param->sins)))RETURN (12);
 | 
							if(so._bind(param->remsock,(struct sockaddr *)¶m->sinsl,SASIZE(¶m->sinsl)))RETURN (12);
 | 
				
			||||||
#if SOCKSTRACE > 0
 | 
					#if SOCKSTRACE > 0
 | 
				
			||||||
fprintf(stderr, "%s:%hu binded to communicate with server\n",
 | 
					fprintf(stderr, "%hu binded to communicate with server\n", *SAPORT(¶m->sins));
 | 
				
			||||||
			inet_ntoa(param->sins.sin_addr),
 | 
					 | 
				
			||||||
			ntohs(param->sins.sin_port)
 | 
					 | 
				
			||||||
	);
 | 
					 | 
				
			||||||
fflush(stderr);
 | 
					fflush(stderr);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	sasize = sizeof(param->sins);
 | 
						sasize = SASIZE(¶m->sinsl);
 | 
				
			||||||
	so._getsockname(param->remsock, (struct sockaddr *)¶m->sins,  &sasize);
 | 
						so._getsockname(param->remsock, (struct sockaddr *)¶m->sinsl,  &sasize);
 | 
				
			||||||
	if(command == 3) {
 | 
						if(command == 3) {
 | 
				
			||||||
		param->ctrlsock = param->clisock;
 | 
							param->ctrlsock = param->clisock;
 | 
				
			||||||
		param->clisock = so._socket(SASOCK(¶m->sincr), SOCK_DGRAM, IPPROTO_UDP);
 | 
							param->clisock = so._socket(SASOCK(¶m->sincr), SOCK_DGRAM, IPPROTO_UDP);
 | 
				
			||||||
		if(param->clisock == INVALID_SOCKET) {RETURN(11);}
 | 
							if(param->clisock == INVALID_SOCKET) {RETURN(11);}
 | 
				
			||||||
		memcpy(&sin, ¶m->sincl, sizeof(&sin));
 | 
							memcpy(&sin, ¶m->sincl, sizeof(&sin));
 | 
				
			||||||
		*SAPORT(&sin) = htons(0);
 | 
							*SAPORT(&sin) = 0;
 | 
				
			||||||
		if(so._bind(param->clisock,(struct sockaddr *)&sin,sizeof(sin))) {RETURN (12);}
 | 
							if(so._bind(param->clisock,(struct sockaddr *)&sin,sizeof(sin))) {RETURN (12);}
 | 
				
			||||||
#if SOCKSTRACE > 0
 | 
					#if SOCKSTRACE > 0
 | 
				
			||||||
fprintf(stderr, "%hu binded to communicate with client\n",
 | 
					fprintf(stderr, "%hu binded to communicate with client\n",
 | 
				
			||||||
@ -224,10 +224,10 @@ fflush(stderr);
 | 
				
			|||||||
		buf[0] = 5;
 | 
							buf[0] = 5;
 | 
				
			||||||
		buf[1] = repcode;
 | 
							buf[1] = repcode;
 | 
				
			||||||
		buf[2] = 0;
 | 
							buf[2] = 0;
 | 
				
			||||||
		buf[3] = 1;
 | 
							buf[3] = (*SAFAMILY(&sin) == AF_INET)?1:4;
 | 
				
			||||||
		memcpy(buf+4, SAADDR(&sin), 4);
 | 
							memcpy(buf+4, SAADDR(&sin), SAADDRLEN(&sin));
 | 
				
			||||||
		memcpy(buf+8, SAPORT(&sin), 2);
 | 
							memcpy(buf+4+SAADDRLEN(&sin), SAPORT(&sin), 2);
 | 
				
			||||||
		socksend((command == 3)?param->ctrlsock:param->clisock, buf, 10, conf.timeouts[STRING_S]);
 | 
							socksend((command == 3)?param->ctrlsock:param->clisock, buf, 6+SAADDRLEN(&sin), conf.timeouts[STRING_S]);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else{
 | 
						else{
 | 
				
			||||||
		buf[0] = 0;
 | 
							buf[0] = 0;
 | 
				
			||||||
@ -252,48 +252,48 @@ fflush(stderr);
 | 
				
			|||||||
				fds[0].fd = param->remsock;
 | 
									fds[0].fd = param->remsock;
 | 
				
			||||||
				fds[1].fd = param->clisock;
 | 
									fds[1].fd = param->clisock;
 | 
				
			||||||
				fds[0].events = fds[1].events = POLLIN;
 | 
									fds[0].events = fds[1].events = POLLIN;
 | 
				
			||||||
				res = so._poll(fds, 2, conf.timeouts[(param->req.sin_addr.s_addr)?CONNECTION_S:CONNECTION_L] * 1000);
 | 
									res = so._poll(fds, 2, conf.timeouts[CONNECTION_L] * 1000);
 | 
				
			||||||
				if (res < 1 || fds[1].revents) {
 | 
									if (res < 1 || fds[1].revents) {
 | 
				
			||||||
					res = 460;
 | 
										res = 460;
 | 
				
			||||||
					break;
 | 
										break;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				sasize = sizeof(param->sins);
 | 
									sasize = sizeof(param->sinsr);
 | 
				
			||||||
				s = so._accept(param->remsock, (struct sockaddr *)¶m->sins, &sasize);
 | 
									s = so._accept(param->remsock, (struct sockaddr *)¶m->sinsr, &sasize);
 | 
				
			||||||
				so._closesocket(param->remsock);
 | 
									so._closesocket(param->remsock);
 | 
				
			||||||
				param->remsock = s;
 | 
									param->remsock = s;
 | 
				
			||||||
				if(s == INVALID_SOCKET) {
 | 
									if(s == INVALID_SOCKET) {
 | 
				
			||||||
					param->res = 462;
 | 
										param->res = 462;
 | 
				
			||||||
					break;
 | 
										break;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				if(param->req.sin_addr.s_addr && param->req.sin_addr.s_addr != param->sins.sin_addr.s_addr) {
 | 
									if(!memcmp(SAADDR(¶m->req),"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0",SAADDRLEN(¶m->req)) &&
 | 
				
			||||||
 | 
									 memcmp(SAADDR(¶m->req),SAADDR(¶m->sinsr),SAADDRLEN(¶m->req))) {
 | 
				
			||||||
					param->res = 470;
 | 
										param->res = 470;
 | 
				
			||||||
					break;
 | 
										break;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
#if SOCKSTRACE > 0
 | 
					#if SOCKSTRACE > 0
 | 
				
			||||||
fprintf(stderr, "Sending incoming connection to client with code %d for %s with %s:%hu\n",
 | 
					fprintf(stderr, "Sending incoming connection to client with code %d for %s with %hu\n",
 | 
				
			||||||
			param->res,
 | 
								param->res,
 | 
				
			||||||
			commands[command],
 | 
								commands[command],
 | 
				
			||||||
			inet_ntoa(param->sins.sin_addr),
 | 
								*SAPORT(param->sins);
 | 
				
			||||||
			ntohs(param->sins.sin_port)
 | 
					 | 
				
			||||||
	);
 | 
						);
 | 
				
			||||||
fflush(stderr);
 | 
					fflush(stderr);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
				if(ver == 5){
 | 
									if(ver == 5){
 | 
				
			||||||
					memcpy (buf+4, ¶m->sins.sin_addr, 4);
 | 
										buf[3] = (*SAFAMILY(¶m->sinsr) == AF_INET)?1:4;
 | 
				
			||||||
					memcpy (buf+8, ¶m->sins.sin_port, 2);
 | 
										memcpy(buf+4, SAADDR(¶m->sinsr), SAADDRLEN(¶m->sinsr));
 | 
				
			||||||
					socksend(param->clisock, buf, 10, conf.timeouts[STRING_S]);
 | 
										memcpy(buf+4+SAADDRLEN(¶m->sinsr), SAPORT(¶m->sinsr), 2);
 | 
				
			||||||
 | 
										socksend(param->clisock, buf, 6+SAADDRLEN(¶m->sinsr), conf.timeouts[STRING_S]);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				else {
 | 
									else {
 | 
				
			||||||
					memcpy (buf+2, ¶m->sins.sin_port, 2);
 | 
										memcpy (buf+2, SAPORT(¶m->sinsr), 2);
 | 
				
			||||||
					memcpy (buf+4, ¶m->sins.sin_addr, 4);
 | 
										memcpy (buf+4, SAADDR(¶m->sinsr), 4);
 | 
				
			||||||
					socksend(param->clisock, buf, 8, conf.timeouts[STRING_S]);
 | 
										socksend(param->clisock, buf, 8, conf.timeouts[STRING_S]);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				param->res = sockmap(param, conf.timeouts[CONNECTION_S]);
 | 
									param->res = sockmap(param, conf.timeouts[CONNECTION_S]);
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			case 3:
 | 
								case 3:
 | 
				
			||||||
				param->sins.sin_addr.s_addr = param->req.sin_addr.s_addr;
 | 
									memcpy(¶m->sinsr, ¶m->req, sizeof(param->sinsr));
 | 
				
			||||||
				param->sins.sin_port = param->req.sin_port;
 | 
					 | 
				
			||||||
				myfree(buf);
 | 
									myfree(buf);
 | 
				
			||||||
				if(!(buf = myalloc(LARGEBUFSIZE))) {RETURN(21);}
 | 
									if(!(buf = myalloc(LARGEBUFSIZE))) {RETURN(21);}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -326,10 +326,14 @@ fflush(stderr);
 | 
				
			|||||||
							param->res = 466;
 | 
												param->res = 466;
 | 
				
			||||||
							break;
 | 
												break;
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
 | 
											size = 4;
 | 
				
			||||||
						switch(buf[3]) {
 | 
											switch(buf[3]) {
 | 
				
			||||||
 | 
												case 4:
 | 
				
			||||||
 | 
													size = 16;
 | 
				
			||||||
							case 1:
 | 
												case 1:
 | 
				
			||||||
								i = 8;
 | 
													i = 4+size;
 | 
				
			||||||
								memcpy(¶m->sins.sin_addr.s_addr, buf+4, 4);
 | 
													memcpy(SAADDR(¶m->sinsr), buf+4, size);
 | 
				
			||||||
 | 
													*SAFAMILY(¶m->sinsr) = (size == 4)?AF_INET:AF_INET6;
 | 
				
			||||||
								break;
 | 
													break;
 | 
				
			||||||
							case 3:
 | 
												case 3:
 | 
				
			||||||
								size = buf[4];
 | 
													size = buf[4];
 | 
				
			||||||
@ -337,18 +341,18 @@ fflush(stderr);
 | 
				
			|||||||
									buf[i] = buf[i+1];
 | 
														buf[i] = buf[i+1];
 | 
				
			||||||
								}
 | 
													}
 | 
				
			||||||
								buf[i++] = 0;
 | 
													buf[i++] = 0;
 | 
				
			||||||
								param->sins.sin_addr.s_addr = getip(buf+4);
 | 
													if(!getip46(param->srv->family, buf, (struct sockaddr *) ¶m->sinsr)) RETURN(100);
 | 
				
			||||||
								break;
 | 
													break;
 | 
				
			||||||
							default:
 | 
												default:
 | 
				
			||||||
								RETURN(997);
 | 
													RETURN(997);
 | 
				
			||||||
						 }
 | 
											 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
						memcpy(¶m->sins.sin_port, buf+i, 2);
 | 
											memcpy(SAPORT(¶m->sinsr), buf+i, 2);
 | 
				
			||||||
						i+=2;
 | 
											i+=2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
						sasize = sizeof(param->sins);
 | 
											sasize = sizeof(param->sinsr);
 | 
				
			||||||
						if(len > (int)i){
 | 
											if(len > (int)i){
 | 
				
			||||||
							if(socksendto(param->remsock, (struct sockaddr *)¶m->sins, buf+i, len - i, conf.timeouts[SINGLEBYTE_L]*1000) <= 0){
 | 
												if(socksendto(param->remsock, (struct sockaddr *)¶m->sinsr, buf+i, len - i, conf.timeouts[SINGLEBYTE_L]*1000) <= 0){
 | 
				
			||||||
								param->res = 467;
 | 
													param->res = 467;
 | 
				
			||||||
								break;
 | 
													break;
 | 
				
			||||||
							}
 | 
												}
 | 
				
			||||||
@ -371,27 +375,25 @@ fflush(stderr);
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					if (fds[0].revents) {
 | 
										if (fds[0].revents) {
 | 
				
			||||||
						struct sockaddr_in tsin;
 | 
											sasize = sizeof(param->sinsr);
 | 
				
			||||||
						sasize = sizeof(tsin);
 | 
					 | 
				
			||||||
						buf[0]=buf[1]=buf[2]=0;
 | 
											buf[0]=buf[1]=buf[2]=0;
 | 
				
			||||||
						buf[3]=1;
 | 
											buf[3]=(*SAFAMILY(¶m->sinsl) == AF_INET)?1:4;
 | 
				
			||||||
						if((len = so._recvfrom(param->remsock, buf+10, 65535 - 10, 0, (struct sockaddr *)&tsin, &sasize)) <= 0) {
 | 
											if((len = so._recvfrom(param->remsock, buf+6+SAADDRLEN(¶m->sinsl), 65535 - 10, 0, (struct sockaddr *)¶m->sinsr, &sasize)) <= 0) {
 | 
				
			||||||
							param->res = 468;
 | 
												param->res = 468;
 | 
				
			||||||
							break;
 | 
												break;
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						param->statssrv64+=len;
 | 
											param->statssrv64+=len;
 | 
				
			||||||
						param->nreads++;
 | 
											param->nreads++;
 | 
				
			||||||
						memcpy(buf+4, &tsin.sin_addr.s_addr, 4);
 | 
											memcpy(buf+4, SAADDR(¶m->sinsr), SAADDRLEN(¶m->sinsr));
 | 
				
			||||||
						memcpy(buf+8, &tsin.sin_port, 2);
 | 
											memcpy(buf+4+SAADDRLEN(¶m->sinsr), SAPORT(¶m->sinsr), 2);
 | 
				
			||||||
						sasize = sizeof(param->sins);
 | 
											sasize = sizeof(sin);
 | 
				
			||||||
						if(socksendto(param->clisock, (struct sockaddr *)&sin, buf, len + 10, conf.timeouts[SINGLEBYTE_L]*1000) <=0){
 | 
											if(socksendto(param->clisock, (struct sockaddr *)&sin, buf, len + 6 + SAADDRLEN(¶m->sinsr), conf.timeouts[SINGLEBYTE_L]*1000) <=0){
 | 
				
			||||||
							param->res = 469;
 | 
												param->res = 469;
 | 
				
			||||||
							break;
 | 
												break;
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
#if SOCKSTRACE > 1
 | 
					#if SOCKSTRACE > 1
 | 
				
			||||||
fprintf(stderr, "UDP packet relayed to client from %s:%hu size %d\n",
 | 
					fprintf(stderr, "UDP packet relayed to client from %hu size %d\n",
 | 
				
			||||||
			inet_ntoa(tsin.sin_addr),
 | 
								ntohs(*SAPORT(¶m->sinsr)),
 | 
				
			||||||
			ntohs(tsin.sin_port),
 | 
					 | 
				
			||||||
			len
 | 
								len
 | 
				
			||||||
	);
 | 
						);
 | 
				
			||||||
fflush(stderr);
 | 
					fflush(stderr);
 | 
				
			||||||
@ -415,7 +417,7 @@ fflush(stderr);
 | 
				
			|||||||
	 }
 | 
						 }
 | 
				
			||||||
	 else 
 | 
						 else 
 | 
				
			||||||
		myinet_ntop(*SAFAMILY(¶m->req), SAADDR(¶m->req), (char *)buf + strlen((char *)buf), 64);
 | 
							myinet_ntop(*SAFAMILY(¶m->req), SAADDR(¶m->req), (char *)buf + strlen((char *)buf), 64);
 | 
				
			||||||
         sprintf((char *)buf+strlen((char *)buf), ":%hu", ntohs(param->req.sin_port));
 | 
					         sprintf((char *)buf+strlen((char *)buf), ":%hu", ntohs(*SAPORT(¶m->req)));
 | 
				
			||||||
	 (*param->srv->logfunc)(param, buf);
 | 
						 (*param->srv->logfunc)(param, buf);
 | 
				
			||||||
	 myfree(buf);
 | 
						 myfree(buf);
 | 
				
			||||||
 }
 | 
					 }
 | 
				
			||||||
 | 
				
			|||||||
@ -30,8 +30,9 @@ unsigned char * strings[] = {
 | 
				
			|||||||
/* 16 */	(unsigned char *)"FTPPR",
 | 
					/* 16 */	(unsigned char *)"FTPPR",
 | 
				
			||||||
/* 17 */	(unsigned char *)"SMTPP",
 | 
					/* 17 */	(unsigned char *)"SMTPP",
 | 
				
			||||||
/* 18 */	(unsigned char *)"ICQPR",
 | 
					/* 18 */	(unsigned char *)"ICQPR",
 | 
				
			||||||
/* 19 */	(unsigned char *)"MSNPR",
 | 
					/* 19 	(unsigned char *)"MSNPR", */
 | 
				
			||||||
/* 20 */	(unsigned char *)"ZOMBIE",
 | 
					/* 19 */	(unsigned char *)"ZOMBIE",
 | 
				
			||||||
 | 
					/* 20 */	NULL,
 | 
				
			||||||
/* 21 */	NULL,
 | 
					/* 21 */	NULL,
 | 
				
			||||||
/* 22 */	NULL,
 | 
					/* 22 */	NULL,
 | 
				
			||||||
/* 23 */	NULL,
 | 
					/* 23 */	NULL,
 | 
				
			||||||
 | 
				
			|||||||
@ -137,7 +137,9 @@ typedef enum {
 | 
				
			|||||||
	S_FTPPR,
 | 
						S_FTPPR,
 | 
				
			||||||
	S_SMTPP,
 | 
						S_SMTPP,
 | 
				
			||||||
	S_ICQPR,
 | 
						S_ICQPR,
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
	S_MSNPR,
 | 
						S_MSNPR,
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
	S_ZOMBIE
 | 
						S_ZOMBIE
 | 
				
			||||||
}PROXYSERVICE;
 | 
					}PROXYSERVICE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -352,6 +354,7 @@ struct srvparam {
 | 
				
			|||||||
	int silent;
 | 
						int silent;
 | 
				
			||||||
	int transparent;
 | 
						int transparent;
 | 
				
			||||||
	int nfilters, nreqfilters, nhdrfilterscli, nhdrfilterssrv, npredatfilters, ndatfilterscli, ndatfilterssrv;
 | 
						int nfilters, nreqfilters, nhdrfilterscli, nhdrfilterssrv, npredatfilters, ndatfilterscli, ndatfilterssrv;
 | 
				
			||||||
 | 
						int family;
 | 
				
			||||||
	unsigned bufsize;
 | 
						unsigned bufsize;
 | 
				
			||||||
	unsigned logdumpsrv, logdumpcli;
 | 
						unsigned logdumpsrv, logdumpcli;
 | 
				
			||||||
#ifndef NOIPV6
 | 
					#ifndef NOIPV6
 | 
				
			||||||
@ -438,26 +441,21 @@ struct clientparam {
 | 
				
			|||||||
			maxtrafin64,
 | 
								maxtrafin64,
 | 
				
			||||||
			maxtrafout64;
 | 
								maxtrafout64;
 | 
				
			||||||
#ifndef NOIPV6
 | 
					#ifndef NOIPV6
 | 
				
			||||||
	struct sockaddr_in6	sincl, sincr;
 | 
						struct sockaddr_in6	sincl, sincr, sinsl, sinsr, req;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
	struct sockaddr_in	sincl, sincr;
 | 
						struct sockaddr_in	sincl, sincr, sinsl, sinsr, req;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	struct sockaddr_in	sins,
 | 
					 | 
				
			||||||
				req;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uint64_t	statscli64,
 | 
						uint64_t	statscli64,
 | 
				
			||||||
			statssrv64;
 | 
								statssrv64;
 | 
				
			||||||
	unsigned long
 | 
						unsigned long
 | 
				
			||||||
			nreads,
 | 
								nreads,
 | 
				
			||||||
			nwrites,
 | 
								nwrites,
 | 
				
			||||||
			nconnects,
 | 
								nconnects;
 | 
				
			||||||
			extip;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct bandlim	*bandlims[MAXBANDLIMS],
 | 
						struct bandlim	*bandlims[MAXBANDLIMS],
 | 
				
			||||||
			*bandlimsout[MAXBANDLIMS];
 | 
								*bandlimsout[MAXBANDLIMS];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	unsigned short extport;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	time_t time_start;
 | 
						time_t time_start;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -485,10 +483,11 @@ struct extparam {
 | 
				
			|||||||
#ifndef NOIPV6
 | 
					#ifndef NOIPV6
 | 
				
			||||||
	struct sockaddr_in6 intsa;
 | 
						struct sockaddr_in6 intsa;
 | 
				
			||||||
	struct sockaddr_in6 extsa6;
 | 
						struct sockaddr_in6 extsa6;
 | 
				
			||||||
 | 
						struct sockaddr_in extsa;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
	struct sockaddr_in intsa;
 | 
						struct sockaddr_in intsa;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
	struct sockaddr_in extsa;
 | 
						struct sockaddr_in extsa;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
	struct passwords *pwl;
 | 
						struct passwords *pwl;
 | 
				
			||||||
	struct auth * authenticate;
 | 
						struct auth * authenticate;
 | 
				
			||||||
	AUTHFUNC authfunc;
 | 
						AUTHFUNC authfunc;
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										20
									
								
								src/udppm.c
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								src/udppm.c
									
									
									
									
									
								
							@ -40,7 +40,7 @@ void * udppmchild(struct clientparam* param) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 if(!param->hostname)parsehostname((char *)param->srv->target, param, ntohs(param->srv->targetport));
 | 
					 if(!param->hostname)parsehostname((char *)param->srv->target, param, ntohs(param->srv->targetport));
 | 
				
			||||||
 if (!param->req.sin_addr.s_addr) {
 | 
					 if (!memcmp(SAADDR(¶m->req), "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", SAADDRLEN(¶m->req))) {
 | 
				
			||||||
	param->srv->fds.events = POLLIN;
 | 
						param->srv->fds.events = POLLIN;
 | 
				
			||||||
	RETURN (100);
 | 
						RETURN (100);
 | 
				
			||||||
 }
 | 
					 }
 | 
				
			||||||
@ -62,27 +62,25 @@ void * udppmchild(struct clientparam* param) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	if(so._setsockopt(param->clisock, SOL_SOCKET, SO_REUSEADDR, (unsigned char *)&ul, sizeof(int))) {RETURN(820);};
 | 
						if(so._setsockopt(param->clisock, SOL_SOCKET, SO_REUSEADDR, (unsigned char *)&ul, sizeof(int))) {RETURN(820);};
 | 
				
			||||||
	ioctlsocket(param->clisock, FIONBIO, &ul);
 | 
						ioctlsocket(param->clisock, FIONBIO, &ul);
 | 
				
			||||||
	size = sizeof(param->sins);
 | 
						size = sizeof(param->sinsl);
 | 
				
			||||||
	if(so._getsockname(param->srv->srvsock, (struct sockaddr *)¶m->sins, &size)) {RETURN(21);};
 | 
						if(so._getsockname(param->srv->srvsock, (struct sockaddr *)¶m->sinsl, &size)) {RETURN(21);};
 | 
				
			||||||
	if(so._bind(param->clisock,(struct sockaddr *)¶m->sins,sizeof(struct sockaddr_in))) {
 | 
						if(so._bind(param->clisock,(struct sockaddr *)¶m->sinsl,sizeof(struct sockaddr_in))) {
 | 
				
			||||||
		RETURN(822);
 | 
							RETURN(822);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
	param->clisock = param->srv->srvsock;
 | 
						param->clisock = param->srv->srvsock;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 param->sins.sin_family = AF_INET;
 | 
					 memcpy(¶m->sinsl, *SAFAMILY(¶m->req) == AF_INET? (struct sockaddr *)¶m->srv->extsa : (struct sockaddr *)¶m->srv->extsa6, SASIZE(¶m->req));
 | 
				
			||||||
 param->sins.sin_port = htons(0);
 | 
					 *SAPORT(¶m->sinsl) = 0;
 | 
				
			||||||
 param->sins.sin_addr.s_addr = param->extip;
 | 
					 if ((param->remsock=so._socket(*SAFAMILY(¶m->sinsl), SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) {RETURN (11);}
 | 
				
			||||||
 if ((param->remsock=so._socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) {RETURN (11);}
 | 
					 if(so._bind(param->remsock,(struct sockaddr *)¶m->sinsl,sizeof(param->sinsl))) {RETURN (12);}
 | 
				
			||||||
 if(so._bind(param->remsock,(struct sockaddr *)¶m->sins,sizeof(param->sins))) {RETURN (12);}
 | 
					 | 
				
			||||||
#ifdef _WIN32
 | 
					#ifdef _WIN32
 | 
				
			||||||
	ioctlsocket(param->remsock, FIONBIO, &ul);
 | 
						ioctlsocket(param->remsock, FIONBIO, &ul);
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
	fcntl(param->remsock,F_SETFL,O_NONBLOCK);
 | 
						fcntl(param->remsock,F_SETFL,O_NONBLOCK);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 param->sins.sin_addr.s_addr = param->req.sin_addr.s_addr;
 | 
					 memcpy(¶m->sinsr, ¶m->req, sizeof(param->req));
 | 
				
			||||||
 param->sins.sin_port = param->req.sin_port;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 param->operation = UDPASSOC;
 | 
					 param->operation = UDPASSOC;
 | 
				
			||||||
 if((res = (*param->srv->authfunc)(param))) {RETURN(res);}
 | 
					 if((res = (*param->srv->authfunc)(param))) {RETURN(res);}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,2 +1,2 @@
 | 
				
			|||||||
#define VERSION "3proxy-0.8b-devel"
 | 
					#define VERSION "3proxy-0.8b-devel"
 | 
				
			||||||
#define BUILDDATE "141019042604"
 | 
					#define BUILDDATE "141019215116"
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user