initial partial patches for IPv6 client support

This commit is contained in:
z3APA3A 2014-10-19 21:54:24 +04:00
parent f1e017394d
commit c7310a2060
18 changed files with 134 additions and 143 deletions

View File

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

View File

@ -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)

View File

@ -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;
} }

View File

@ -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(&param->sincr) == *SAFAMILY(&param->req) && !memcmp(SAADDR(&param->sincr), SAADDR(&param->req), SASIZE(param->req)) &&
*SAPORT(&param->sincr) == *SAPORT(&param->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){

View File

@ -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(&param->sinsr))==21)?0:':', ntohs(*SAPORT(&param->sinsr)));
req = mystrdup((char *)buf); req = mystrdup((char *)buf);
#ifndef WITHMAIN #ifndef WITHMAIN
{ {

View File

@ -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 *)&param->sins, *buf_p + *length_p, increment, conf.timeouts[STRING_S]*1000); if(increment) len = sockrecvfrom(param->remsock, (struct sockaddr *)&param->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++;

View File

@ -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}
}; };

View File

@ -49,7 +49,7 @@ void * pop3pchild(struct clientparam* param) {
CLEANRET: CLEANRET:
if(param->hostname&&param->extusername) { if(param->hostname&&param->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(&param->sinsr)==110)?0:':', ntohs(*SAPORT(&param->sinsr)));
(*param->srv->logfunc)(param, buf); (*param->srv->logfunc)(param, buf);
} }
else (*param->srv->logfunc)(param, NULL); else (*param->srv->logfunc)(param, NULL);

View File

@ -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(&param->srv->intsa) == AF_INET &&
(param->sins.sin_addr.s_addr == ((struct sockaddr_in *)&param->srv->intsa)->sin_addr.s_addr && param->sins.sin_port == *SAPORT(&param->srv->intsa))) {
RETURN(519);
}
sasize = sizeof(struct sockaddr_in);
if(so._getpeername(param->remsock, (struct sockaddr *)&param->sins, &sasize)){
RETURN(520);
}
#define FTPBUFSIZE 1536 #define FTPBUFSIZE 1536
if(ftp && param->redirtype != R_HTTP){ if(ftp && param->redirtype != R_HTTP){

View File

@ -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(&param->req) = *SAFAMILY(&param->sins) = *SAFAMILY(&param->sincr) = *SAFAMILY(&param->sincl) = AF_INET; *SAFAMILY(&param->req) = *SAFAMILY(&param->sinsl) = *SAFAMILY(&param->sinsr) = *SAFAMILY(&param->sincr) = *SAFAMILY(&param->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(&param->sincr, &srv->intsa, sizeof(param->sincr)); memcpy(&param->sincr, &srv->intsa, sizeof(param->sincr));
/* FIX ME */ memcpy(&param->sinsl, &srv->extsa, sizeof(param->sinsl));
memcpy(&param->sins, &srv->extsa, sizeof(param->sins));
} }
void srvfree(struct srvparam * srv){ void srvfree(struct srvparam * srv){

View File

@ -83,7 +83,7 @@ int readdata (struct clientparam* param) {
return -1; return -1;
} }
#endif #endif
socksendto(param->remsock, (struct sockaddr *)&param->sins, buf, i, conf.timeouts[STRING_S]); socksendto(param->remsock, (struct sockaddr *)&param->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(&param->sinsl), SAADDR(&param->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&&param->extusername) { if(param->hostname&&param->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(&param->sinsr))==25)?0:':', *SAPORT(&param->sinsr));
(*param->srv->logfunc)(param, buf); (*param->srv->logfunc)(param, buf);
} }
else (*param->srv->logfunc)(param, NULL); else (*param->srv->logfunc)(param, NULL);

View File

@ -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 *)&param->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 *)&param->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 *)&param->sins, param->srvbuf, param->srvbufsize, timeosec*1000 + timeousec))<=0) return EOF; if ((len = sockrecvfrom(param->remsock, (struct sockaddr *)&param->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++;

View File

@ -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*)&param->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*)&param->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 *)&param->sins, param->clibuf + param->clioffset, param->cliinbuf - param->clioffset, conf.timeouts[STRING_S] * 1000); res = socksendto(param->remsock, (struct sockaddr *)&param->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;

View File

@ -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(&param->sinsr) = *SAFAMILY(&param->req) = (c == 1)? AF_INET:AF_INET6;
if(command==1 && !param->req.sin_addr.s_addr) { memcpy(SAADDR(&param->sinsr), buf, size);
memcpy(SAADDR(&param->req), buf, size);
if(command==1 && !memcmp(SAADDR(&param->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(&param->sins), SAADDR(&param->sins), (char *)buf, 64); myinet_ntop(*SAFAMILY(&param->sinsr), SAADDR(&param->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 *) &param->req)) RETURN(100);
if(command==1 && !param->req.sin_addr.s_addr) { memcpy(&param->sinsr, &param->req, sizeof(&param->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(&param->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 *) &param->req)) RETURN(100);
memcpy(&param->sinsr, &param->req, sizeof(&param->req));
} }
} }
if(command == 1 && !param->req.sin_port) {RETURN(421);}
param->sins.sin_family = AF_INET; *SAPORT(&param->sinsr) = *SAPORT(&param->req) = port;
if(command == 1 && !*SAPORT(&param->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(&param->sinsl, *SAFAMILY(&param->req)==AF_INET6? (struct sockaddr *)&param->srv->extsa6:(struct sockaddr *)&param->srv->extsa, SASIZE(&param->req));
if ((param->remsock=so._socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) {RETURN (11);} if(!*SAPORT(&param->sinsl))*SAPORT(&param->sinsl) = port;
param->operation = UDPASSOC; if ((param->remsock=so._socket(*SAFAMILY(&param->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 *)&param->sins,sizeof(param->sins))) { if(so._bind(param->remsock,(struct sockaddr *)&param->sinsl,SASIZE(&param->sinsl))) {
param->sins.sin_port = 0; *SAPORT(&param->sinsl) = 0;
if(so._bind(param->remsock,(struct sockaddr *)&param->sins,sizeof(param->sins)))RETURN (12); if(so._bind(param->remsock,(struct sockaddr *)&param->sinsl,SASIZE(&param->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(&param->sins));
inet_ntoa(param->sins.sin_addr),
ntohs(param->sins.sin_port)
);
fflush(stderr); fflush(stderr);
#endif #endif
} }
sasize = sizeof(param->sins); sasize = SASIZE(&param->sinsl);
so._getsockname(param->remsock, (struct sockaddr *)&param->sins, &sasize); so._getsockname(param->remsock, (struct sockaddr *)&param->sinsl, &sasize);
if(command == 3) { if(command == 3) {
param->ctrlsock = param->clisock; param->ctrlsock = param->clisock;
param->clisock = so._socket(SASOCK(&param->sincr), SOCK_DGRAM, IPPROTO_UDP); param->clisock = so._socket(SASOCK(&param->sincr), SOCK_DGRAM, IPPROTO_UDP);
if(param->clisock == INVALID_SOCKET) {RETURN(11);} if(param->clisock == INVALID_SOCKET) {RETURN(11);}
memcpy(&sin, &param->sincl, sizeof(&sin)); memcpy(&sin, &param->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 *)&param->sins, &sasize); s = so._accept(param->remsock, (struct sockaddr *)&param->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(&param->req),"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0",SAADDRLEN(&param->req)) &&
memcmp(SAADDR(&param->req),SAADDR(&param->sinsr),SAADDRLEN(&param->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, &param->sins.sin_addr, 4); buf[3] = (*SAFAMILY(&param->sinsr) == AF_INET)?1:4;
memcpy (buf+8, &param->sins.sin_port, 2); memcpy(buf+4, SAADDR(&param->sinsr), SAADDRLEN(&param->sinsr));
socksend(param->clisock, buf, 10, conf.timeouts[STRING_S]); memcpy(buf+4+SAADDRLEN(&param->sinsr), SAPORT(&param->sinsr), 2);
socksend(param->clisock, buf, 6+SAADDRLEN(&param->sinsr), conf.timeouts[STRING_S]);
} }
else { else {
memcpy (buf+2, &param->sins.sin_port, 2); memcpy (buf+2, SAPORT(&param->sinsr), 2);
memcpy (buf+4, &param->sins.sin_addr, 4); memcpy (buf+4, SAADDR(&param->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(&param->sinsr, &param->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(&param->sins.sin_addr.s_addr, buf+4, 4); memcpy(SAADDR(&param->sinsr), buf+4, size);
*SAFAMILY(&param->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 *) &param->sinsr)) RETURN(100);
break; break;
default: default:
RETURN(997); RETURN(997);
} }
memcpy(&param->sins.sin_port, buf+i, 2); memcpy(SAPORT(&param->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 *)&param->sins, buf+i, len - i, conf.timeouts[SINGLEBYTE_L]*1000) <= 0){ if(socksendto(param->remsock, (struct sockaddr *)&param->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(&param->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(&param->sinsl), 65535 - 10, 0, (struct sockaddr *)&param->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(&param->sinsr), SAADDRLEN(&param->sinsr));
memcpy(buf+8, &tsin.sin_port, 2); memcpy(buf+4+SAADDRLEN(&param->sinsr), SAPORT(&param->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(&param->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(&param->sinsr)),
ntohs(tsin.sin_port),
len len
); );
fflush(stderr); fflush(stderr);
@ -415,7 +417,7 @@ fflush(stderr);
} }
else else
myinet_ntop(*SAFAMILY(&param->req), SAADDR(&param->req), (char *)buf + strlen((char *)buf), 64); myinet_ntop(*SAFAMILY(&param->req), SAADDR(&param->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(&param->req)));
(*param->srv->logfunc)(param, buf); (*param->srv->logfunc)(param, buf);
myfree(buf); myfree(buf);
} }

View File

@ -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,

View File

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

View File

@ -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(&param->req), "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", SAADDRLEN(&param->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 *)&param->sins, &size)) {RETURN(21);}; if(so._getsockname(param->srv->srvsock, (struct sockaddr *)&param->sinsl, &size)) {RETURN(21);};
if(so._bind(param->clisock,(struct sockaddr *)&param->sins,sizeof(struct sockaddr_in))) { if(so._bind(param->clisock,(struct sockaddr *)&param->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(&param->sinsl, *SAFAMILY(&param->req) == AF_INET? (struct sockaddr *)&param->srv->extsa : (struct sockaddr *)&param->srv->extsa6, SASIZE(&param->req));
param->sins.sin_port = htons(0); *SAPORT(&param->sinsl) = 0;
param->sins.sin_addr.s_addr = param->extip; if ((param->remsock=so._socket(*SAFAMILY(&param->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 *)&param->sinsl,sizeof(param->sinsl))) {RETURN (12);}
if(so._bind(param->remsock,(struct sockaddr *)&param->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(&param->sinsr, &param->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);}

View File

@ -1,2 +1,2 @@
#define VERSION "3proxy-0.8b-devel" #define VERSION "3proxy-0.8b-devel"
#define BUILDDATE "141019042604" #define BUILDDATE "141019215116"