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

Force use of IPv6 translated address instead of IPv4 with -6

z3APA3A 10 лет назад
Родитель
Сommit
40f9430623
2 измененных файлов с 25 добавлено и 7 удалено
  1. 3 3
      src/common.c
  2. 22 4
      src/socks.c

+ 3 - 3
src/common.c

@@ -779,7 +779,7 @@ unsigned long getip46(int family, unsigned char *name,  struct sockaddr *sa){
 
 	if(!sa) return 0;
 	if(!family) {
-		family = AF_INET;
+		family = 4;
 #else
 		((struct sockaddr_in *)sa)->sin_family = AF_INET;
 		return (((struct sockaddr_in *)sa)->sin_addr.s_addr = getip(name))? AF_INET:0;
@@ -806,8 +806,8 @@ unsigned long getip46(int family, unsigned char *name,  struct sockaddr *sa){
 	}
 	if(!name[i]){
 		if(ndots == 3 && ncols == 0 && nhex == 0){
-			*SAFAMILY(sa)=AF_INET;
-			return inet_pton(AF_INET, name, SAADDR(sa))? (family==6? 0:AF_INET) : 0; 
+			*SAFAMILY(sa)=(family == 6)?AF_INET6 : AF_INET;
+			return inet_pton(*SAFAMILY(sa), name, SAADDR(sa))? *SAFAMILY(sa) : 0; 
 		}
 		if(ncols >= 2) {
 			*SAFAMILY(sa)=AF_INET6;

+ 22 - 4
src/socks.c

@@ -90,18 +90,36 @@ void * sockschild(struct clientparam* param) {
  }
  
  size = 4;
+ *SAFAMILY(&param->sinsr) = *SAFAMILY(&param->req) = AF_INET;
  switch(c) {
+#ifndef NOIPV6
 	case 4:
+		if(param->srv->family == 4) RETURN(997);
 		size = 16;
+		*SAFAMILY(&param->sinsr) = *SAFAMILY(&param->req) = AF_INET6;
+#endif
 	case 1:
 		for (i = 0; i<size; i++){
 			if ((res = sockgetcharcli(param, conf.timeouts[SINGLEBYTE_S], 0)) == EOF) {RETURN(441);}
 			buf[i] = (unsigned char)res;
 		}
-		*SAFAMILY(&param->sinsr) = *SAFAMILY(&param->req) = (c == 1)? AF_INET:AF_INET6;
-		memcpy(SAADDR(&param->sinsr), buf, size);
-		memcpy(SAADDR(&param->req), buf, size);
-		if(command==1 && SAISNULL(&param->req)) {
+#ifndef NOIPV6
+		if (c == 1 && param->srv->family==6){
+			char prefix[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255};
+			*SAFAMILY(&param->sinsr) = *SAFAMILY(&param->req) = AF_INET6;
+			memcpy(SAADDR(&param->sinsr), prefix, 12);
+			memcpy(12 + (char *)SAADDR(&param->sinsr), buf, 4);
+			memcpy(SAADDR(&param->req), prefix, 12);
+			memcpy(12 + (char *)SAADDR(&param->req), buf, 4);
+		}
+		else {
+#endif
+			memcpy(SAADDR(&param->sinsr), buf, size);
+			memcpy(SAADDR(&param->req), buf, size);
+#ifndef NOIPV6
+		}
+#endif
+		if(SAISNULL(&param->req)) {
 			RETURN(421);
 		}
 		myinet_ntop(*SAFAMILY(&param->sinsr), SAADDR(&param->sinsr), (char *)buf, 64);