|
|
@@ -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; i<size; i++){
|
|
|
if ((res = sockgetcharcli(param, conf.timeouts[SINGLEBYTE_S], 0)) == EOF) {RETURN(441);}
|
|
|
buf[i] = (unsigned char)res;
|
|
|
}
|
|
|
- *SAFAMILY(¶m->sinsr) = *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);
|