more changes for IPv6 client support

This commit is contained in:
z3APA3A 2014-10-21 06:00:56 +04:00
parent 10bc0db2a8
commit db5c4b1255
8 changed files with 90 additions and 100 deletions

View File

@ -205,16 +205,12 @@ int handleredirect(struct clientparam * param, struct ace * acentry){
int done = 0; int done = 0;
struct chain * cur; struct chain * cur;
struct chain * redir = NULL; struct chain * redir = NULL;
unsigned long targetip;
unsigned short targetport;
int r2; int r2;
if(param->remsock != INVALID_SOCKET) { if(param->remsock != INVALID_SOCKET) {
return 0; return 0;
} }
targetip = 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)) || !*SAPORT(&param->req)) return 100;
targetport = param->req.sin_port;
if(!targetip || !targetport) return 100;
r2 = (myrand(param, sizeof(struct clientparam))%1000); r2 = (myrand(param, sizeof(struct clientparam))%1000);
@ -270,11 +266,16 @@ int handleredirect(struct clientparam * param, struct ace * acentry){
} }
return 0; return 0;
} }
else if(!cur->redirip && cur->redirport) param->extport = cur->redirport; else if(!cur->redirport && cur->redirip) {
else if(!cur->redirport && cur->redirip) param->extip = cur->redirip; unsigned short port = *SAPORT(&param->sinsl);
else { *SAFAMILY(&param->sinsl) = AF_INET;
param->sins.sin_port = cur->redirport; *(unsigned long *)SAADDR(&param->sinsl) = cur->redirip;
param->sins.sin_addr.s_addr = cur->redirip; *SAPORT(&param->sinsl) = port;
}
else if(!cur->redirip && cur->redirport) *SAPORT(&param->sinsl) = cur->redirport;
else if(*SAFAMILY(&param->req) == AF_INET){
*(unsigned long *)SAADDR(&param->sinsr) = cur->redirip;
*SAPORT(&param->sinsr) = cur->redirport;
} }
if((res = alwaysauth(param))){ if((res = alwaysauth(param))){
@ -282,7 +283,7 @@ int handleredirect(struct clientparam * param, struct ace * acentry){
} }
} }
else { else {
res = redir?clientnegotiate(redir, param, cur->redirip, cur->redirport):0; res = (redir && *SAFAMILY(&param->req) == AF_INET)?clientnegotiate(redir, param, cur->redirip, cur->redirport):0;
if(res) return res; if(res) return res;
} }
redir = cur; redir = cur;
@ -305,7 +306,7 @@ int handleredirect(struct clientparam * param, struct ace * acentry){
} }
if(!connected) return 9; if(!connected) return 9;
return redir?clientnegotiate(redir, param, targetip, targetport):0; return (redir && *SAFAMILY(&param->req) == AF_INET)?clientnegotiate(redir, param, *(unsigned long *)SAADDR(&param->req), *SAPORT(&param->req)):0;
} }
int IPInentry(struct sockaddr *sa, struct iplist *ipentry){ int IPInentry(struct sockaddr *sa, struct iplist *ipentry){
@ -339,7 +340,7 @@ int ACLmatches(struct ace* acentry, struct clientparam * param){
} }
if(!ipentry) return 0; if(!ipentry) return 0;
} }
if((acentry->dst && param->req.sin_addr.s_addr) || (acentry->dstnames && param->hostname)) { if((acentry->dst && memcmp(SAADDR(&param->req), "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", SAADDRLEN(&param->req))) || (acentry->dstnames && param->hostname)) {
for(ipentry = acentry->dst; ipentry; ipentry = ipentry->next) for(ipentry = acentry->dst; ipentry; ipentry = ipentry->next)
if(IPInentry((struct sockaddr *)&param->req, ipentry)) { if(IPInentry((struct sockaddr *)&param->req, ipentry)) {
break; break;
@ -374,10 +375,10 @@ int ACLmatches(struct ace* acentry, struct clientparam * param){
} }
if(!ipentry && !hstentry) return 0; if(!ipentry && !hstentry) return 0;
} }
if(acentry->ports && param->req.sin_port) { if(acentry->ports && *SAPORT(&param->req)) {
for (portentry = acentry->ports; portentry; portentry = portentry->next) for (portentry = acentry->ports; portentry; portentry = portentry->next)
if(ntohs(param->req.sin_port) >= portentry->startport && if(ntohs(*SAPORT(&param->req)) >= portentry->startport &&
ntohs(param->req.sin_port) <= portentry->endport) { ntohs(*SAPORT(&param->req)) <= portentry->endport) {
break; break;
} }
if(!portentry) return 0; if(!portentry) return 0;
@ -970,7 +971,7 @@ unsigned long udpresolve(unsigned char * name, unsigned *retttl, struct clientpa
struct sockaddr_in sin, *sinsp; struct sockaddr_in sin, *sinsp;
memset(&sin, 0, sizeof(sin)); memset(&sin, 0, sizeof(sin));
sinsp = (param && !makeauth)? &param->sins : &sin; sinsp = (param && !makeauth && *SAFAMILY(&param->sinsr) == AF_INET)? (struct sockaddr_in *)&param->sinsr : &sin;
if((sock=so._socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) break; if((sock=so._socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) break;

View File

@ -214,22 +214,26 @@ int ceparseargs(const char *str){
#endif #endif
int parsehostname(char *hostname, struct clientparam *param, unsigned short port){ int parsehostname(char *hostname, struct clientparam *param, unsigned short port){
char *sp; char *sp,*se;
if(!hostname || !*hostname)return 1; if(!hostname || !*hostname)return 1;
if ( (sp = strchr(hostname, ':')) ) *sp = 0; if(*hostname == '[') se=strchr(hostname, ']');
if ( (sp = strchr(se?se:hostname, ':')) ) *sp = 0;
if(se){
*se = 0;
}
if(hostname != param->hostname){ if(hostname != param->hostname){
if(param->hostname) myfree(param->hostname); if(param->hostname) myfree(param->hostname);
param->hostname = (unsigned char *)mystrdup(hostname); param->hostname = (unsigned char *)mystrdup(hostname + (se!=0));
} }
if(sp){ if(sp){
port = atoi(sp+1); port = atoi(sp+1);
*sp = ':'; *sp = ':';
} }
param->req.sin_port=htons(port); if(se) *se = ']';
param->req.sin_addr.s_addr = getip(param->hostname); getip46(param->srv->family, param->hostname + (se!=0), (struct sockaddr *)&param->req);
param->sins.sin_addr.s_addr = 0; *SAPORT(&param->req) = htons(port);
param->sins.sin_port = 0; memset(&param->sinsr, 0, sizeof(param->sinsr));
return 0; return 0;
} }
@ -318,7 +322,6 @@ int dobuf2(struct clientparam * param, unsigned char * buf, const unsigned char
long timezone; long timezone;
unsigned delay; unsigned delay;
struct in_addr tmpia;
@ -432,7 +435,7 @@ int dobuf2(struct clientparam * param, unsigned char * buf, const unsigned char
i++; i++;
} }
} }
else i += myinet_ntop(*SAFAMILY(&param->sins), SAADDR(&param->sins), (char *)buf + i, 64); else i += myinet_ntop(*SAFAMILY(&param->sinsr), SAADDR(&param->sinsr), (char *)buf + i, 64);
break; break;
case 'N': case 'N':
@ -461,14 +464,13 @@ int dobuf2(struct clientparam * param, unsigned char * buf, const unsigned char
} }
break; break;
case 'e': case 'e':
tmpia.s_addr = param->extip; i += myinet_ntop(*SAFAMILY(&param->sinsl), SAADDR(&param->sinsl), (char *)buf + i, 64);
i += myinet_ntop(AF_INET, &tmpia, (char *)buf + i, 64);
break; break;
case 'C': case 'C':
i += myinet_ntop(*SAFAMILY(&param->sincr), SAADDR(&param->sincr), (char *)buf + i, 64); i += myinet_ntop(*SAFAMILY(&param->sincr), SAADDR(&param->sincr), (char *)buf + i, 64);
break; break;
case 'R': case 'R':
i += myinet_ntop(*SAFAMILY(&param->sins), SAADDR(&param->sins), (char *)buf + i, 64); i += myinet_ntop(*SAFAMILY(&param->sinsr), SAADDR(&param->sinsr), (char *)buf + i, 64);
break; break;
case 'Q': case 'Q':
i += myinet_ntop(*SAFAMILY(&param->req), SAADDR(&param->req), (char *)buf + i, 64); i += myinet_ntop(*SAFAMILY(&param->req), SAADDR(&param->req), (char *)buf + i, 64);
@ -482,11 +484,11 @@ int dobuf2(struct clientparam * param, unsigned char * buf, const unsigned char
i += (int)strlen((char *)buf+i); i += (int)strlen((char *)buf+i);
break; break;
case 'r': case 'r':
sprintf((char *)buf+i, "%hu", ntohs(param->sins.sin_port)); sprintf((char *)buf+i, "%hu", ntohs(*SAPORT(&param->sinsr)));
i += (int)strlen((char *)buf+i); i += (int)strlen((char *)buf+i);
break; break;
case 'q': case 'q':
sprintf((char *)buf+i, "%hu", ntohs(param->req.sin_port)); sprintf((char *)buf+i, "%hu", ntohs(*SAPORT(&param->req)));
i += (int)strlen((char *)buf+i); i += (int)strlen((char *)buf+i);
break; break;
case 'I': case 'I':
@ -595,58 +597,52 @@ void logsyslog(struct clientparam * param, const unsigned char *s) {
#endif #endif
int doconnect(struct clientparam * param){ int doconnect(struct clientparam * param){
SASIZETYPE size = sizeof(param->sins); SASIZETYPE size = sizeof(param->sinsr);
struct sockaddr_in bindsa;
if (*SAFAMILY(&param->sincr) == *SAFAMILY(&param->req) && !memcmp(SAADDR(&param->sincr), SAADDR(&param->req), SASIZE(param->req)) && 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; *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){
if(so._getpeername(param->remsock, (struct sockaddr *)&param->sins, &size)==-1) {return (15);} if(so._getpeername(param->remsock, (struct sockaddr *)&param->sinsr, &size)==-1) {return (15);}
} }
else { else {
struct linger lg; struct linger lg;
if(!param->sins.sin_addr.s_addr) if(!memcmp(SAADDR(&param->sinsr), "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", SAADDRLEN(&param->sinsr))){
if(!(param->sins.sin_addr.s_addr = param->req.sin_addr.s_addr)) return 100; if(!memcmp(SAADDR(&param->req), "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", SAADDRLEN(&param->req))) return 100;
if(!param->sins.sin_port)param->sins.sin_port = param->req.sin_port; *SAFAMILY(&param->sinsr) = *SAFAMILY(&param->req);
if ((param->remsock=so._socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) {return (11);} memcpy(SAADDR(&param->sinsr), SAADDR(&param->req), SAADDRLEN(&param->req));
}
if(!*SAPORT(&param->sinsr))*SAPORT(&param->sinsr) = *SAPORT(&param->req);
if ((param->remsock=so._socket(*SAFAMILY(&param->sinsr), SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) {return (11);}
so._setsockopt(param->remsock, SOL_SOCKET, SO_LINGER, (unsigned char *)&lg, sizeof(lg)); so._setsockopt(param->remsock, SOL_SOCKET, SO_LINGER, (unsigned char *)&lg, sizeof(lg));
memset(&bindsa, 0, sizeof(bindsa)); if(*SAFAMILY(&param->sinsr) == AF_INET) memcpy(&param->sinsl, &param->srv->extsa, sizeof(param->srv->extsa));
bindsa.sin_family = AF_INET; else memcpy(&param->sinsl, &param->srv->extsa6, sizeof(param->srv->extsa6));
bindsa.sin_port = param->extport; if (param->srv->targetport && !*SAPORT(&param->sinsl) && ntohs(*SAPORT(&param->sincr)) > 1023) *SAPORT(&param->sinsl) = *SAPORT(&param->sincr);
bindsa.sin_addr.s_addr = param->extip; if(so._bind(param->remsock, (struct sockaddr*)&param->sinsl, sizeof(param->sinsl))==-1) {
if (param->srv->targetport && !bindsa.sin_port && ntohs(*SAPORT(&param->sincr)) > 1023) bindsa.sin_port = *SAPORT(&param->sincr); if(*SAFAMILY(&param->sinsr) == AF_INET) memcpy(&param->sinsl, &param->srv->extsa, sizeof(param->srv->extsa));
if(so._bind(param->remsock, (struct sockaddr*)&bindsa, sizeof(bindsa))==-1) { else memcpy(&param->sinsl, &param->srv->extsa6, sizeof(param->srv->extsa6));
memset(&bindsa, 0, sizeof(bindsa)); if(so._bind(param->remsock, (struct sockaddr*)&param->sinsl, sizeof(param->sinsl))==-1) {
bindsa.sin_family = AF_INET;
bindsa.sin_addr.s_addr = param->extip;
bindsa.sin_port = 0;
if(so._bind(param->remsock, (struct sockaddr*)&bindsa, sizeof(bindsa))==-1) {
return 12; return 12;
} }
} }
param->sins.sin_family = AF_INET;
if(param->operation >= 256 || (param->operation & CONNECT)){ if(param->operation >= 256 || (param->operation & CONNECT)){
#ifdef _WIN32 #ifdef _WIN32
unsigned long ul = 1; unsigned long ul = 1;
#endif #endif
if(so._connect(param->remsock,(struct sockaddr *)&param->sins,sizeof(param->sins))) {return (13);} if(so._connect(param->remsock,(struct sockaddr *)&param->sinsr,sizeof(param->sinsr))) {return (13);}
param->nconnects++; param->nconnects++;
#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
if(so._getsockname(param->remsock, (struct sockaddr *)&bindsa, &size)==-1) {return (15);} size = sizeof(param->sinsl);
param->extip = bindsa.sin_addr.s_addr;
}
else {
if(so._getsockname(param->remsock, (struct sockaddr *)&param->sins, &size)==-1) {return (15);}
} }
if(so._getsockname(param->remsock, (struct sockaddr *)&param->sinsl, &size)==-1) {return (15);}
} }
return 0; return 0;
} }

View File

@ -633,20 +633,12 @@ static void * ef_client_clisa(struct node * node){
return &((struct clientparam *)node->value) -> sincr; return &((struct clientparam *)node->value) -> sincr;
} }
static void * ef_client_srvip(struct node * node){ static void * ef_client_srvsa(struct node * node){
return &((struct clientparam *)node->value) -> sins.sin_addr.s_addr; return &((struct clientparam *)node->value) -> sinsr;
} }
static void * ef_client_reqip(struct node * node){ static void * ef_client_reqsa(struct node * node){
return &((struct clientparam *)node->value) -> req.sin_addr.s_addr; return &((struct clientparam *)node->value) -> req;
}
static void * ef_client_reqport(struct node * node){
return &((struct clientparam *)node->value) -> req.sin_port;
}
static void * ef_client_srvport(struct node * node){
return &((struct clientparam *)node->value) -> sins.sin_port;
} }
static void * ef_client_pwtype(struct node * node){ static void * ef_client_pwtype(struct node * node){
@ -784,15 +776,13 @@ static struct property prop_client[] = {
{prop_client + 10, "username", ef_client_username, TYPE_STRING, "client username"}, {prop_client + 10, "username", ef_client_username, TYPE_STRING, "client username"},
{prop_client + 11, "password", ef_client_password, TYPE_STRING, "client password"}, {prop_client + 11, "password", ef_client_password, TYPE_STRING, "client password"},
{prop_client + 12, "clisa", ef_client_clisa, TYPE_SA, "client sa"}, {prop_client + 12, "clisa", ef_client_clisa, TYPE_SA, "client sa"},
{prop_client + 13, "srvip", ef_client_srvip, TYPE_IP, "target server ip"}, {prop_client + 13, "srvsa", ef_client_srvsa, TYPE_IP, "target server sa"},
{prop_client + 14, "srvport", ef_client_srvport, TYPE_PORT, "target server port"}, {prop_client + 14, "reqsa", ef_client_reqsa, TYPE_IP, "requested server sa"},
{prop_client + 15, "reqip", ef_client_reqip, TYPE_IP, "requested server ip"}, {prop_client + 15, "bytesin", ef_client_bytesin64, TYPE_UNSIGNED64, "bytes from server to client"},
{prop_client + 16, "reqport", ef_client_reqport, TYPE_PORT, "requested server port"}, {prop_client + 16, "bytesout", ef_client_bytesout64, TYPE_UNSIGNED64, "bytes from client to server"},
{prop_client + 17, "bytesin", ef_client_bytesin64, TYPE_UNSIGNED64, "bytes from server to client"}, {prop_client + 17, "maxtrafin", ef_client_maxtrafin64, TYPE_UNSIGNED64, "maximum traffic allowed for download"},
{prop_client + 18, "bytesout", ef_client_bytesout64, TYPE_UNSIGNED64, "bytes from client to server"}, {prop_client + 18, "maxtrafout", ef_client_maxtrafout64, TYPE_UNSIGNED64, "maximum traffic allowed for upload"},
{prop_client + 19, "maxtrafin", ef_client_maxtrafin64, TYPE_UNSIGNED64, "maximum traffic allowed for download"}, {prop_client + 19, "pwtype", ef_client_pwtype, TYPE_INTEGER, "type of client password"},
{prop_client + 20, "maxtrafout", ef_client_maxtrafout64, TYPE_UNSIGNED64, "maximum traffic allowed for upload"},
{prop_client + 21, "pwtype", ef_client_pwtype, TYPE_INTEGER, "type of client password"},
{NULL, "next", ef_client_next, TYPE_CLIENT, "next"} {NULL, "next", ef_client_next, TYPE_CLIENT, "next"}

View File

@ -43,10 +43,10 @@ void * dnsprchild(struct clientparam* param) {
RETURN(818); RETURN(818);
} }
ioctlsocket(param->clisock, FIONBIO, &ul); ioctlsocket(param->clisock, FIONBIO, &ul);
size = sizeof(struct sockaddr_in); 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._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);};
if(so._bind(param->clisock,(struct sockaddr *)&param->sins,sizeof(struct sockaddr_in))) { if(so._bind(param->clisock,(struct sockaddr *)&param->sinsl,sizeof(param->sinsl))) {
RETURN(822); RETURN(822);
} }
@ -136,20 +136,21 @@ void * dnsprchild(struct clientparam* param) {
#else #else
fcntl(param->remsock,F_SETFL,O_NONBLOCK); fcntl(param->remsock,F_SETFL,O_NONBLOCK);
#endif #endif
param->sins.sin_family = AF_INET; *SAFAMILY(&param->sinsl) = AF_INET;
param->sins.sin_port = htons(0); *SAPORT(&param->sinsl) = htons(0);
param->sins.sin_addr.s_addr = htonl(0); *(unsigned long*)SAADDR(&param->sinsl) = htonl(0);
if(so._bind(param->remsock,(struct sockaddr *)&param->sins,sizeof(struct sockaddr_in))) { if(so._bind(param->remsock,(struct sockaddr *)&param->sinsl,sizeof(param->sinsl))) {
RETURN(819); RETURN(819);
} }
param->sins.sin_addr.s_addr = nservers[0]; *SAFAMILY(&param->sinsr) = AF_INET;
param->sins.sin_port = htons(53); *(unsigned long*)SAADDR(&param->sinsr) = nservers[0];
if(socksendto(param->remsock, (struct sockaddr *)&param->sins, buf, i, conf.timeouts[SINGLEBYTE_L]*1000) != i){ *SAPORT(&param->sinsr) = htons(53);
if(socksendto(param->remsock, (struct sockaddr *)&param->sinsr, buf, i, conf.timeouts[SINGLEBYTE_L]*1000) != i){
RETURN(820); RETURN(820);
} }
param->statscli64 += i; param->statscli64 += i;
param->nwrites++; param->nwrites++;
len = sockrecvfrom(param->remsock, (struct sockaddr *)&param->sins, buf, BUFSIZE, 15000); len = sockrecvfrom(param->remsock, (struct sockaddr *)&param->sinsr, buf, BUFSIZE, 15000);
if(len <= 13) { if(len <= 13) {
RETURN(821); RETURN(821);
} }

View File

@ -190,12 +190,14 @@ SOCKET ftpdata(struct clientparam *param){
if(sscanf(sb+1, "%lu,%lu,%lu,%lu,%hu,%hu", &b1, &b2, &b3, &b4, &b5, &b6)!=6) return INVALID_SOCKET; if(sscanf(sb+1, "%lu,%lu,%lu,%lu,%hu,%hu", &b1, &b2, &b3, &b4, &b5, &b6)!=6) return INVALID_SOCKET;
rem = param->remsock; rem = param->remsock;
param->remsock = INVALID_SOCKET; param->remsock = INVALID_SOCKET;
param->req.sin_family = AF_INET; memcpy(&param->req,&param->sinsr,sizeof(param->req));
param->req.sin_port = param->sins.sin_port = htons((unsigned short)((b5<<8)^b6)); *SAPORT(&param->req) = *SAPORT(&param->sinsr) = htons((unsigned short)((b5<<8)^b6));
param->req.sin_addr.s_addr = param->sins.sin_addr.s_addr = htonl((b1<<24)^(b2<<16)^(b3<<8)^b4);
i = param->operation; i = param->operation;
param->operation = FTP_DATA; param->operation = FTP_DATA;
if((param->res = (*param->srv->authfunc)(param))) return INVALID_SOCKET; if((param->res = (*param->srv->authfunc)(param))) {
param->remsock = rem;
return INVALID_SOCKET;
}
param->operation = i; param->operation = i;
s = param->remsock; s = param->remsock;
param->remsock = rem; param->remsock = rem;

View File

@ -189,7 +189,7 @@ void mylogfunc(struct clientparam * param, const unsigned char * pz) {
port = starttrafcorrect->port; port = starttrafcorrect->port;
g_s = starttrafcorrect->p_service; g_s = starttrafcorrect->p_service;
if (starttrafcorrect->p_service == S_NOSERVICE) g_s = param->service; if (starttrafcorrect->p_service == S_NOSERVICE) g_s = param->service;
if (starttrafcorrect->port <= 0) port = myhtons(param->sins.sin_port); if (starttrafcorrect->port <= 0) port = myhtons(*SAPORT(&param->sinsr));
#ifndef NOPSTDINT #ifndef NOPSTDINT
statssrv_before = param->statssrv64; statssrv_before = param->statssrv64;
@ -199,7 +199,7 @@ void mylogfunc(struct clientparam * param, const unsigned char * pz) {
statscli_before = param->statscli; statscli_before = param->statscli;
#endif #endif
rule++; rule++;
if (((g_s == param->service) && (port == myhtons(param->sins.sin_port))) || if (((g_s == param->service) && (port == myhtons(*SAPORT(&param->sinsr)))) ||
( ((starttrafcorrect->type == UDP) && ( ((starttrafcorrect->type == UDP) &&
((param->operation == UDPASSOC)|| ((param->operation == UDPASSOC)||
(param->operation == DNSRESOLVE)|| (param->operation == DNSRESOLVE)||
@ -240,7 +240,7 @@ void mylogfunc(struct clientparam * param, const unsigned char * pz) {
} }
if (DBGLEVEL == 1) { if (DBGLEVEL == 1) {
#ifndef NOPSTDINT #ifndef NOPSTDINT
fprintf(stdout, "Port=%hd; Before: srv=%"PRINTF_INT64_MODIFIER"d, cli=%"PRINTF_INT64_MODIFIER"d; After: srv=%"PRINTF_INT64_MODIFIER"d, cli=%"PRINTF_INT64_MODIFIER"d; nreads=%ld; nwrites=%ld; Rule=%d\n",myhtons(param->sins.sin_port), statssrv_before, statscli_before, param->statssrv64, param->statscli64,param->nreads,param->nwrites,rule); fprintf(stdout, "Port=%hd; Before: srv=%"PRINTF_INT64_MODIFIER"d, cli=%"PRINTF_INT64_MODIFIER"d; After: srv=%"PRINTF_INT64_MODIFIER"d, cli=%"PRINTF_INT64_MODIFIER"d; nreads=%ld; nwrites=%ld; Rule=%d\n",myhtons(*SAPORT(&param->sinsr)), statssrv_before, statscli_before, param->statssrv64, param->statscli64,param->nreads,param->nwrites,rule);
#else #else
fprintf(stdout, "Port=%hd; Before: srv=%lu, cli=%lu; After: srv=%lu, cli=%lu; nreads=%ld; nwrites=%ld; Rule=%d\n",myhtons(param->sins.sin_port), statssrv_before, statscli_before, param->statssrv, param->statscli,param->nreads,param->nwrites,rule); fprintf(stdout, "Port=%hd; Before: srv=%lu, cli=%lu; After: srv=%lu, cli=%lu; nreads=%ld; nwrites=%ld; Rule=%d\n",myhtons(param->sins.sin_port), statssrv_before, statscli_before, param->statssrv, param->statscli,param->nreads,param->nwrites,rule);
#endif #endif
@ -250,7 +250,7 @@ void mylogfunc(struct clientparam * param, const unsigned char * pz) {
} }
} }
if ((!ok) && (DBGLEVEL == 1)) { if ((!ok) && (DBGLEVEL == 1)) {
fprintf(stdout, "No rules specifed: service=%d, port=%d, operation=%d", param->service, param->sins.sin_port,param->operation); fprintf(stdout, "No rules specifed: service=%d, port=%d, operation=%d", param->service, *SAPORT(&param->sinsr),param->operation);
} }
origlogfunc(param, pz); origlogfunc(param, pz);
} }

View File

@ -195,7 +195,7 @@ int MODULEMAINFUNC (int argc, char** argv){
break; break;
case '4': case '4':
case '6': case '6':
srv.family = atoi(argv[i]); srv.family = atoi(argv[i]+1);
break; break;
case 'b': case 'b':
srv.bufsize = atoi(argv[i]+2); srv.bufsize = atoi(argv[i]+2);
@ -579,7 +579,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));
memcpy(&param->sinsl, &srv->extsa, sizeof(param->sinsl)); memcpy(&param->sinsr, (srv->family == 6 || srv->family == 64)? (void *)&srv->extsa6: (void *)&srv->extsa, sizeof(param->sinsl));
} }
void srvfree(struct srvparam * srv){ void srvfree(struct srvparam * srv){

View File

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