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

This commit is contained in:
z3APA3A 2015-12-07 22:58:31 +03:00
parent d6df311ba7
commit 40f9430623
2 changed files with 25 additions and 7 deletions

View File

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

View File

@ -90,18 +90,36 @@ void * sockschild(struct clientparam* param) {
} }
size = 4; size = 4;
*SAFAMILY(&param->sinsr) = *SAFAMILY(&param->req) = AF_INET;
switch(c) { switch(c) {
#ifndef NOIPV6
case 4: case 4:
if(param->srv->family == 4) RETURN(997);
size = 16; size = 16;
*SAFAMILY(&param->sinsr) = *SAFAMILY(&param->req) = AF_INET6;
#endif
case 1: case 1:
for (i = 0; i<size; 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;
} }
*SAFAMILY(&param->sinsr) = *SAFAMILY(&param->req) = (c == 1)? AF_INET:AF_INET6; #ifndef NOIPV6
memcpy(SAADDR(&param->sinsr), buf, size); if (c == 1 && param->srv->family==6){
memcpy(SAADDR(&param->req), buf, size); char prefix[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255};
if(command==1 && SAISNULL(&param->req)) { *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); RETURN(421);
} }
myinet_ntop(*SAFAMILY(&param->sinsr), SAADDR(&param->sinsr), (char *)buf, 64); myinet_ntop(*SAFAMILY(&param->sinsr), SAADDR(&param->sinsr), (char *)buf, 64);