Просмотр исходного кода

more changes for IPv6 client support

z3APA3A 11 лет назад
Родитель
Сommit
db5c4b1255
8 измененных файлов с 90 добавлено и 100 удалено
  1. 18 17
      src/auth.c
  2. 36 40
      src/common.c
  3. 11 21
      src/datatypes.c
  4. 12 11
      src/dnspr.c
  5. 6 4
      src/ftp.c
  6. 4 4
      src/plugins/TrafficPlugin/TrafficPlugin.c
  7. 2 2
      src/proxymain.c
  8. 1 1
      src/version.h

+ 18 - 17
src/auth.c

@@ -205,16 +205,12 @@ int handleredirect(struct clientparam * param, struct ace * acentry){
 	int done = 0;
 	struct chain * cur;
 	struct chain * redir = NULL;
-	unsigned long targetip;
-	unsigned short targetport;
 	int r2;
 
 	if(param->remsock != INVALID_SOCKET) {
 		return 0;
 	}
-	targetip = param->req.sin_addr.s_addr;
-	targetport = param->req.sin_port;
-	if(!targetip || !targetport) 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)) || !*SAPORT(&param->req)) return 100;
 
 	r2 = (myrand(param, sizeof(struct clientparam))%1000);
 
@@ -270,11 +266,16 @@ int handleredirect(struct clientparam * param, struct ace * acentry){
 				}
 				return 0;
 			}
-			else if(!cur->redirip && cur->redirport) param->extport = cur->redirport;
-			else if(!cur->redirport && cur->redirip) param->extip = cur->redirip;
-			else {
-				param->sins.sin_port = cur->redirport;
-				param->sins.sin_addr.s_addr = cur->redirip;
+			else if(!cur->redirport && cur->redirip) {
+				unsigned short port = *SAPORT(&param->sinsl);
+				*SAFAMILY(&param->sinsl) = AF_INET;
+				*(unsigned long *)SAADDR(&param->sinsl) = 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))){
@@ -282,7 +283,7 @@ int handleredirect(struct clientparam * param, struct ace * acentry){
 			}
 		}
 		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;
 		}
 		redir = cur;
@@ -305,7 +306,7 @@ int handleredirect(struct clientparam * param, struct ace * acentry){
 	}
 
 	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){
@@ -339,7 +340,7 @@ int ACLmatches(struct ace* acentry, struct clientparam * param){
 		}
 	 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)
 		if(IPInentry((struct sockaddr *)&param->req, ipentry)) {
 			break;
@@ -374,10 +375,10 @@ int ACLmatches(struct ace* acentry, struct clientparam * param){
 	 }
 	 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)
-		if(ntohs(param->req.sin_port) >= portentry->startport &&
-			   ntohs(param->req.sin_port) <= portentry->endport) {
+		if(ntohs(*SAPORT(&param->req)) >= portentry->startport &&
+			   ntohs(*SAPORT(&param->req)) <= portentry->endport) {
 			break;
 		}
 		if(!portentry) return 0;
@@ -970,7 +971,7 @@ unsigned long udpresolve(unsigned char * name, unsigned *retttl, struct clientpa
 		struct sockaddr_in sin, *sinsp;
 
 		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;

+ 36 - 40
src/common.c

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

+ 11 - 21
src/datatypes.c

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

+ 12 - 11
src/dnspr.c

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

+ 6 - 4
src/ftp.c

@@ -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;
 	rem = param->remsock;
 	param->remsock = INVALID_SOCKET;
-	param->req.sin_family = AF_INET;
-	param->req.sin_port = param->sins.sin_port = 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);
+	memcpy(&param->req,&param->sinsr,sizeof(param->req));
+	*SAPORT(&param->req) = *SAPORT(&param->sinsr) = htons((unsigned short)((b5<<8)^b6));
 	i = param->operation;
 	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;
 	s = param->remsock;
 	param->remsock = rem;

+ 4 - 4
src/plugins/TrafficPlugin/TrafficPlugin.c

@@ -189,7 +189,7 @@ void mylogfunc(struct clientparam * param, const unsigned char * pz) {
 		port = starttrafcorrect->port;
 		g_s = starttrafcorrect->p_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
 		statssrv_before = param->statssrv64;
@@ -199,7 +199,7 @@ void mylogfunc(struct clientparam * param, const unsigned char * pz) {
 		statscli_before = param->statscli;
 #endif
 		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) && 
 				((param->operation == UDPASSOC)||
 				 (param->operation == DNSRESOLVE)||
@@ -240,7 +240,7 @@ void mylogfunc(struct clientparam * param, const unsigned char * pz) {
 				}
 				if (DBGLEVEL == 1) {
 #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
 					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
@@ -250,7 +250,7 @@ void mylogfunc(struct clientparam * param, const unsigned char * pz) {
 		}
 	}
 	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);
 }

+ 2 - 2
src/proxymain.c

@@ -195,7 +195,7 @@ int MODULEMAINFUNC (int argc, char** argv){
 			break;
 		 case '4':
 		 case '6':
-			srv.family = atoi(argv[i]);
+			srv.family = atoi(argv[i]+1);
 			break;
 		 case 'b':
 			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);
  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){

+ 1 - 1
src/version.h

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