From 40f9430623e4cd77f073d6717ebb14c400eef023 Mon Sep 17 00:00:00 2001 From: z3APA3A <3APA3A@3proxy.ru> Date: Mon, 7 Dec 2015 22:58:31 +0300 Subject: [PATCH] Force use of IPv6 translated address instead of IPv4 with -6 --- src/common.c | 6 +++--- src/socks.c | 26 ++++++++++++++++++++++---- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/common.c b/src/common.c index 0bcfa2e..ce52860 100644 --- a/src/common.c +++ b/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; diff --git a/src/socks.c b/src/socks.c index 48f48b4..4112325 100644 --- a/src/socks.c +++ b/src/socks.c @@ -90,18 +90,36 @@ void * sockschild(struct clientparam* param) { } size = 4; + *SAFAMILY(¶m->sinsr) = *SAFAMILY(¶m->req) = AF_INET; switch(c) { +#ifndef NOIPV6 case 4: + if(param->srv->family == 4) RETURN(997); size = 16; + *SAFAMILY(¶m->sinsr) = *SAFAMILY(¶m->req) = AF_INET6; +#endif case 1: for (i = 0; isinsr) = *SAFAMILY(¶m->req) = (c == 1)? AF_INET:AF_INET6; - memcpy(SAADDR(¶m->sinsr), buf, size); - memcpy(SAADDR(¶m->req), buf, size); - if(command==1 && SAISNULL(¶m->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(¶m->sinsr) = *SAFAMILY(¶m->req) = AF_INET6; + memcpy(SAADDR(¶m->sinsr), prefix, 12); + memcpy(12 + (char *)SAADDR(¶m->sinsr), buf, 4); + memcpy(SAADDR(¶m->req), prefix, 12); + memcpy(12 + (char *)SAADDR(¶m->req), buf, 4); + } + else { +#endif + memcpy(SAADDR(¶m->sinsr), buf, size); + memcpy(SAADDR(¶m->req), buf, size); +#ifndef NOIPV6 + } +#endif + if(SAISNULL(¶m->req)) { RETURN(421); } myinet_ntop(*SAFAMILY(¶m->sinsr), SAADDR(¶m->sinsr), (char *)buf, 64);