diff --git a/src/auth.c b/src/auth.c index a3b2831..e0b3d5e 100644 --- a/src/auth.c +++ b/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(¶m->req),"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0",SAADDRLEN(¶m->req)) || !*SAPORT(¶m->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(¶m->sinsl); + *SAFAMILY(¶m->sinsl) = AF_INET; + *(unsigned long *)SAADDR(¶m->sinsl) = cur->redirip; + *SAPORT(¶m->sinsl) = port; + } + else if(!cur->redirip && cur->redirport) *SAPORT(¶m->sinsl) = cur->redirport; + else if(*SAFAMILY(¶m->req) == AF_INET){ + *(unsigned long *)SAADDR(¶m->sinsr) = cur->redirip; + *SAPORT(¶m->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(¶m->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(¶m->req) == AF_INET)?clientnegotiate(redir, param, *(unsigned long *)SAADDR(¶m->req), *SAPORT(¶m->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(¶m->req), "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", SAADDRLEN(¶m->req))) || (acentry->dstnames && param->hostname)) { for(ipentry = acentry->dst; ipentry; ipentry = ipentry->next) if(IPInentry((struct sockaddr *)¶m->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(¶m->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(¶m->req)) >= portentry->startport && + ntohs(*SAPORT(¶m->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)? ¶m->sins : &sin; + sinsp = (param && !makeauth && *SAFAMILY(¶m->sinsr) == AF_INET)? (struct sockaddr_in *)¶m->sinsr : &sin; if((sock=so._socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) break; diff --git a/src/common.c b/src/common.c index bf96d55..c8bd49e 100644 --- a/src/common.c +++ b/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 *)¶m->req); + *SAPORT(¶m->req) = htons(port); + memset(¶m->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(¶m->sins), SAADDR(¶m->sins), (char *)buf + i, 64); + else i += myinet_ntop(*SAFAMILY(¶m->sinsr), SAADDR(¶m->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(¶m->sinsl), SAADDR(¶m->sinsl), (char *)buf + i, 64); break; case 'C': i += myinet_ntop(*SAFAMILY(¶m->sincr), SAADDR(¶m->sincr), (char *)buf + i, 64); break; case 'R': - i += myinet_ntop(*SAFAMILY(¶m->sins), SAADDR(¶m->sins), (char *)buf + i, 64); + i += myinet_ntop(*SAFAMILY(¶m->sinsr), SAADDR(¶m->sinsr), (char *)buf + i, 64); break; case 'Q': i += myinet_ntop(*SAFAMILY(¶m->req), SAADDR(¶m->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(¶m->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(¶m->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(¶m->sincr) == *SAFAMILY(¶m->req) && !memcmp(SAADDR(¶m->sincr), SAADDR(¶m->req), SASIZE(param->req)) && + if (*SAFAMILY(¶m->sincr) == *SAFAMILY(¶m->req) && !memcmp(SAADDR(¶m->sincr), SAADDR(¶m->req), SASIZE(¶m->req)) && *SAPORT(¶m->sincr) == *SAPORT(¶m->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 *)¶m->sins, &size)==-1) {return (15);} + if(so._getpeername(param->remsock, (struct sockaddr *)¶m->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(¶m->sinsr), "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", SAADDRLEN(¶m->sinsr))){ + if(!memcmp(SAADDR(¶m->req), "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", SAADDRLEN(¶m->req))) return 100; + *SAFAMILY(¶m->sinsr) = *SAFAMILY(¶m->req); + memcpy(SAADDR(¶m->sinsr), SAADDR(¶m->req), SAADDRLEN(¶m->req)); + } + if(!*SAPORT(¶m->sinsr))*SAPORT(¶m->sinsr) = *SAPORT(¶m->req); + if ((param->remsock=so._socket(*SAFAMILY(¶m->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(¶m->sincr)) > 1023) bindsa.sin_port = *SAPORT(¶m->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(¶m->sinsr) == AF_INET) memcpy(¶m->sinsl, ¶m->srv->extsa, sizeof(param->srv->extsa)); + else memcpy(¶m->sinsl, ¶m->srv->extsa6, sizeof(param->srv->extsa6)); + if (param->srv->targetport && !*SAPORT(¶m->sinsl) && ntohs(*SAPORT(¶m->sincr)) > 1023) *SAPORT(¶m->sinsl) = *SAPORT(¶m->sincr); + if(so._bind(param->remsock, (struct sockaddr*)¶m->sinsl, sizeof(param->sinsl))==-1) { + if(*SAFAMILY(¶m->sinsr) == AF_INET) memcpy(¶m->sinsl, ¶m->srv->extsa, sizeof(param->srv->extsa)); + else memcpy(¶m->sinsl, ¶m->srv->extsa6, sizeof(param->srv->extsa6)); + if(so._bind(param->remsock, (struct sockaddr*)¶m->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 *)¶m->sins,sizeof(param->sins))) {return (13);} + if(so._connect(param->remsock,(struct sockaddr *)¶m->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 *)¶m->sins, &size)==-1) {return (15);} + size = sizeof(param->sinsl); } + if(so._getsockname(param->remsock, (struct sockaddr *)¶m->sinsl, &size)==-1) {return (15);} } return 0; } diff --git a/src/datatypes.c b/src/datatypes.c index 40b5649..75c6279 100644 --- a/src/datatypes.c +++ b/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"} diff --git a/src/dnspr.c b/src/dnspr.c index 945edcc..56e9d5b 100644 --- a/src/dnspr.c +++ b/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 *)¶m->sins, &size)) {RETURN(21);}; + size = sizeof(param->sinsl); + if(so._getsockname(param->srv->srvsock, (struct sockaddr *)¶m->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 *)¶m->sins,sizeof(struct sockaddr_in))) { + if(so._bind(param->clisock,(struct sockaddr *)¶m->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 *)¶m->sins,sizeof(struct sockaddr_in))) { + *SAFAMILY(¶m->sinsl) = AF_INET; + *SAPORT(¶m->sinsl) = htons(0); + *(unsigned long*)SAADDR(¶m->sinsl) = htonl(0); + if(so._bind(param->remsock,(struct sockaddr *)¶m->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 *)¶m->sins, buf, i, conf.timeouts[SINGLEBYTE_L]*1000) != i){ + *SAFAMILY(¶m->sinsr) = AF_INET; + *(unsigned long*)SAADDR(¶m->sinsr) = nservers[0]; + *SAPORT(¶m->sinsr) = htons(53); + if(socksendto(param->remsock, (struct sockaddr *)¶m->sinsr, buf, i, conf.timeouts[SINGLEBYTE_L]*1000) != i){ RETURN(820); } param->statscli64 += i; param->nwrites++; - len = sockrecvfrom(param->remsock, (struct sockaddr *)¶m->sins, buf, BUFSIZE, 15000); + len = sockrecvfrom(param->remsock, (struct sockaddr *)¶m->sinsr, buf, BUFSIZE, 15000); if(len <= 13) { RETURN(821); } diff --git a/src/ftp.c b/src/ftp.c index d6708f2..4f763bc 100644 --- a/src/ftp.c +++ b/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(¶m->req,¶m->sinsr,sizeof(param->req)); + *SAPORT(¶m->req) = *SAPORT(¶m->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; diff --git a/src/plugins/TrafficPlugin/TrafficPlugin.c b/src/plugins/TrafficPlugin/TrafficPlugin.c index d4da35d..09009a0 100644 --- a/src/plugins/TrafficPlugin/TrafficPlugin.c +++ b/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(¶m->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(¶m->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(¶m->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(¶m->sinsr),param->operation); } origlogfunc(param, pz); } diff --git a/src/proxymain.c b/src/proxymain.c index eb3f91d..b903654 100644 --- a/src/proxymain.c +++ b/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(¶m->sincr, &srv->intsa, sizeof(param->sincr)); - memcpy(¶m->sinsl, &srv->extsa, sizeof(param->sinsl)); + memcpy(¶m->sinsr, (srv->family == 6 || srv->family == 64)? (void *)&srv->extsa6: (void *)&srv->extsa, sizeof(param->sinsl)); } void srvfree(struct srvparam * srv){ diff --git a/src/version.h b/src/version.h index 030dff4..26dcb17 100644 --- a/src/version.h +++ b/src/version.h @@ -1,2 +1,2 @@ #define VERSION "3proxy-0.8b-devel" -#define BUILDDATE "141019215116" +#define BUILDDATE "141021055913"