diff --git a/src/3proxy.c b/src/3proxy.c index f07b8db..8f7a10d 100644 --- a/src/3proxy.c +++ b/src/3proxy.c @@ -1069,7 +1069,15 @@ static int h_nscache6(int argc, unsigned char **argv){ } static int h_nsrecord(int argc, unsigned char **argv){ - hashadd(&dns_table, argv[1], getip(argv[2]), (time_t)0xffffffff); +#ifndef NOIPV6 + struct sockaddr_in6 sa; +#else + struct sockaddr_in sa; +#endif + memset(&sa, 0, sizeof(sa)); + if(!getip46(46, argv[2], (struct sockaddr *)&sa)) return 1; + + hashadd(*SAFAMILY(&sa)==AF_INET6?&dns6_table:&dns_table, argv[1], SAADDR(&sa), (time_t)0xffffffff); return 0; } @@ -1819,34 +1827,35 @@ struct commands commandhandlers[]={ {commandhandlers+26, "nserver", h_nserver, 2, 2}, {commandhandlers+27, "fakeresolve", h_fakeresolve, 1, 1}, {commandhandlers+28, "nscache", h_nscache, 2, 2}, - {commandhandlers+29, "nsrecord", h_nsrecord, 3, 3}, - {commandhandlers+30, "dialer", h_dialer, 2, 2}, - {commandhandlers+31, "system", h_system, 2, 2}, - {commandhandlers+32, "pidfile", h_pidfile, 2, 2}, - {commandhandlers+33, "monitor", h_monitor, 2, 2}, - {commandhandlers+34, "parent", h_parent, 5, 0}, - {commandhandlers+35, "allow", h_ace, 1, 0}, - {commandhandlers+36, "deny", h_ace, 1, 0}, - {commandhandlers+37, "redirect", h_ace, 3, 0}, - {commandhandlers+38, "bandlimin", h_ace, 2, 0}, - {commandhandlers+39, "bandlimout", h_ace, 2, 0}, - {commandhandlers+40, "nobandlimin", h_ace, 1, 0}, - {commandhandlers+41, "nobandlimout", h_ace, 1, 0}, - {commandhandlers+42, "countin", h_ace, 4, 0}, - {commandhandlers+43, "nocountin", h_ace, 1, 0}, - {commandhandlers+44, "countout", h_ace, 4, 0}, - {commandhandlers+45, "nocountout", h_ace, 1, 0}, - {commandhandlers+46, "plugin", h_plugin, 3, 0}, - {commandhandlers+47, "logdump", h_logdump, 2, 3}, - {commandhandlers+48, "filtermaxsize", h_filtermaxsize, 2, 2}, - {commandhandlers+49, "nolog", h_nolog, 1, 1}, - {commandhandlers+50, "weight", h_nolog, 2, 2}, - {commandhandlers+51, "authcache", h_authcache, 2, 3}, - {commandhandlers+52, "smtpp", h_proxy, 1, 0}, - {commandhandlers+53, "icqpr", h_proxy, 4, 0}, - {commandhandlers+54, "msnpr", h_proxy, 4, 0}, - {commandhandlers+55, "delimchar",h_delimchar, 2, 2}, - {commandhandlers+56, "authnserver", h_authnserver, 2, 2}, + {commandhandlers+29, "nscache6", h_nscache6, 2, 2}, + {commandhandlers+30, "nsrecord", h_nsrecord, 3, 3}, + {commandhandlers+31, "dialer", h_dialer, 2, 2}, + {commandhandlers+32, "system", h_system, 2, 2}, + {commandhandlers+33, "pidfile", h_pidfile, 2, 2}, + {commandhandlers+34, "monitor", h_monitor, 2, 2}, + {commandhandlers+35, "parent", h_parent, 5, 0}, + {commandhandlers+36, "allow", h_ace, 1, 0}, + {commandhandlers+37, "deny", h_ace, 1, 0}, + {commandhandlers+38, "redirect", h_ace, 3, 0}, + {commandhandlers+39, "bandlimin", h_ace, 2, 0}, + {commandhandlers+40, "bandlimout", h_ace, 2, 0}, + {commandhandlers+41, "nobandlimin", h_ace, 1, 0}, + {commandhandlers+42, "nobandlimout", h_ace, 1, 0}, + {commandhandlers+43, "countin", h_ace, 4, 0}, + {commandhandlers+44, "nocountin", h_ace, 1, 0}, + {commandhandlers+45, "countout", h_ace, 4, 0}, + {commandhandlers+46, "nocountout", h_ace, 1, 0}, + {commandhandlers+47, "plugin", h_plugin, 3, 0}, + {commandhandlers+48, "logdump", h_logdump, 2, 3}, + {commandhandlers+49, "filtermaxsize", h_filtermaxsize, 2, 2}, + {commandhandlers+50, "nolog", h_nolog, 1, 1}, + {commandhandlers+51, "weight", h_nolog, 2, 2}, + {commandhandlers+52, "authcache", h_authcache, 2, 3}, + {commandhandlers+53, "smtpp", h_proxy, 1, 0}, + {commandhandlers+54, "icqpr", h_proxy, 4, 0}, + {commandhandlers+55, "msnpr", h_proxy, 4, 0}, + {commandhandlers+56, "delimchar",h_delimchar, 2, 2}, + {commandhandlers+57, "authnserver", h_authnserver, 2, 2}, {specificcommands, "", h_noop, 1, 0} }; diff --git a/src/auth.c b/src/auth.c index 34596ef..155517d 100644 --- a/src/auth.c +++ b/src/auth.c @@ -733,24 +733,36 @@ int userauth(struct clientparam * param){ } int dnsauth(struct clientparam * param){ - char buf[32]; + char buf[128]; + char addr[16]; + char dig[]="0123456789abcdef"; -/* FIX IT */ - unsigned u ; + unsigned u; + int i; - if(*SAFAMILY(¶m->sincr)!=AF_INET) return 6; - u = ntohl(*(unsigned long *)SAADDR(¶m->sincr)); + if(*SAFAMILY(¶m->sincr)!=AF_INET){ + char *s = buf; + for(i=15; i>=0; i--){ + unsigned char c=((unsigned char *)SAADDR(¶m->sincr))[i]; + *s++ = dig[(c&0xf)]; + *s++ = '.'; + *s++ = dig[(c>>4)]; + *s++ = '.'; + } + sprintf(s, "ip6.arpa"); + } + else { + u = ntohl(*(unsigned long *)SAADDR(¶m->sincr)); - sprintf(buf, "%u.%u.%u.%u.in-addr.arpa", - - - ((u&0x000000FF)), - ((u&0x0000FF00)>>8), - ((u&0x00FF0000)>>16), - ((u&0xFF000000)>>24)); + sprintf(buf, "%u.%u.%u.%u.in-addr.arpa", + ((u&0x000000FF)), + ((u&0x0000FF00)>>8), + ((u&0x00FF0000)>>16), + ((u&0xFF000000)>>24)); -/* FIX IT */ - if(*(unsigned long *)SAADDR(¶m->sincr) != udpresolve(buf, NULL, param, 1)) return 6; + } + if(!udpresolve(*SAFAMILY(¶m->sincr), buf, addr, NULL, param, 1)) return 6; + if(!memcmp(SAADDR(¶m->sincr), addr, SAADDRLEN(¶m->sincr))) return 6; return param->username? 0:4; } @@ -830,13 +842,13 @@ struct auth authfuncs[] = { -struct hashtable dns_table = {0, {0}, NULL, NULL, NULL}; -struct hashtable dns6_table = {0, {0}, NULL, NULL, NULL}; +struct hashtable dns_table = {0, 4, {0}, NULL, NULL, NULL}; +struct hashtable dns6_table = {0, 16, {0}, NULL, NULL, NULL}; void nametohash(const unsigned char * name, unsigned char *hash, unsigned char *rnd){ unsigned i, j, k; - memcpy(hash, 0, sizeof(unsigned)*4); + memcpy(hash, rnd, sizeof(unsigned)*4); for(i=0, j=0, k=0; name[j]; j++){ hash[i] += (toupper(name[j]) - 32)+rnd[((toupper(name[j]))*29277+rnd[(k+j+i)%16]+k+j+i)%16]; if(++i == sizeof(unsigned)*4) { @@ -870,6 +882,7 @@ void destroyhashtable(struct hashtable *ht){ pthread_mutex_unlock(&hash_mutex); } +#define hvalue(i) ((struct hashentry *)((char *)ht->hashvalues + i*(sizeof(struct hashentry) + ht->recsize - 4))) int inithashtable(struct hashtable *ht, unsigned nhashsize){ unsigned i; clock_t c; @@ -897,10 +910,10 @@ int inithashtable(struct hashtable *ht, unsigned nhashsize){ ht->hashvalues = NULL; } ht->hashsize = 0; - if(!(ht->hashtable = myalloc((nhashsize>>2) * sizeof(struct hashentry *)))){ + if(!(ht->hashtable = myalloc((nhashsize>>2) * sizeof(struct hashentry *)))){ return 2; } - if(!(ht->hashvalues = myalloc(nhashsize * sizeof(struct hashentry)))){ + if(!(ht->hashvalues = myalloc(nhashsize * (sizeof(struct hashentry) + (ht->recsize-4))))){ myfree(ht->hashtable); ht->hashtable = NULL; return 3; @@ -911,58 +924,57 @@ int inithashtable(struct hashtable *ht, unsigned nhashsize){ ht->rnd[2] = myrand(&c, sizeof(c)); ht->rnd[3] = myrand(ht->hashvalues,sizeof(ht->hashvalues)); memset(ht->hashtable, 0, (ht->hashsize>>2) * sizeof(struct hashentry *)); - memset(ht->hashvalues, 0, ht->hashsize * sizeof(struct hashentry)); + memset(ht->hashvalues, 0, ht->hashsize * (sizeof(struct hashentry) + ht->recsize -4)); for(i = 0; i< (ht->hashsize - 1); i++) { - (ht->hashvalues + i)->next = ht->hashvalues + i + 1; + hvalue(i)->next = hvalue(i+1); } ht->hashempty = ht->hashvalues; return 0; } -int initdnshashtable(unsigned nhashsize){ - return inithashtable(&dns_table, nhashsize); -} +void hashadd(struct hashtable *ht, const unsigned char* name, unsigned char* value, time_t expires){ + struct hashentry * hen, *he; + struct hashentry ** hep; -void hashadd(struct hashtable *ht, const unsigned char* name, unsigned long value, time_t expires){ - struct hashentry * he; unsigned index; if(!value||!name||!ht->hashtable||!ht->hashempty) return; pthread_mutex_lock(&hash_mutex); - he = ht->hashempty; + hen = ht->hashempty; ht->hashempty = ht->hashempty->next; - nametohash(name, he->hash, (unsigned char *)ht->rnd); - he->value = value; - he->expires = expires; - he->next = NULL; - index = hashindex(ht, he->hash); - if(!ht->hashtable[index] || !memcmp(he->hash, ht->hashtable[index]->hash, sizeof(he->hash))){ - he->next = ht->hashtable[index]; - ht->hashtable[index] = he; - } - else { - memset(he, 0, sizeof(struct hashentry)); - he->next = ht->hashempty; - ht->hashempty = he; + nametohash(name, hen->hash, (unsigned char *)ht->rnd); + memcpy(hen->value, value, ht->recsize); + hen->expires = expires; + hen->next = NULL; + index = hashindex(ht, hen->hash); + + for(hep = ht->hashtable + index; (he = *hep)!=NULL; ){ + if(he->expires < conf.time || !memcmp(hen->hash, he->hash, sizeof(he->hash))) { + (*hep) = he->next; + he->expires = 0; + he->next = ht->hashempty; + ht->hashempty = he; + } + else hep=&(he->next); } + hen->next = ht->hashtable[index]; + ht->hashtable[index] = hen; pthread_mutex_unlock(&hash_mutex); } -unsigned long hashresolv(struct hashtable *ht, const unsigned char* name, unsigned *ttl){ +unsigned long hashresolv(struct hashtable *ht, const unsigned char* name, unsigned char* value, unsigned *ttl){ unsigned char hash[sizeof(unsigned)*4]; struct hashentry ** hep; struct hashentry *he; unsigned index; - time_t t; if(!ht->hashtable || !name) return 0; - time(&t); nametohash(name, hash, (unsigned char *)ht->rnd); index = hashindex(ht, hash); pthread_mutex_lock(&hash_mutex); for(hep = ht->hashtable + index; (he = *hep)!=NULL; ){ - if((unsigned long)he->expires < (unsigned long)t) { + if(he->expires < conf.time) { (*hep) = he->next; he->expires = 0; he->next = ht->hashempty; @@ -970,8 +982,9 @@ unsigned long hashresolv(struct hashtable *ht, const unsigned char* name, unsign } else if(!memcmp(hash, he->hash, sizeof(unsigned)*4)){ pthread_mutex_unlock(&hash_mutex); - if(ttl) *ttl = (unsigned)(he->expires - t); - return he->value; + if(ttl) *ttl = (unsigned)(he->expires - conf.time); + memcpy(value, he->value, ht->recsize); + return 1; } else hep=&(he->next); } @@ -983,12 +996,15 @@ struct nserver nservers[MAXNSERVERS] = {{{0},0}, {{0},0}, {{0},0}, {{0},0}, {{0} struct nserver authnserver; -unsigned long udpresolve(unsigned char * name, unsigned *retttl, struct clientparam* param, int makeauth){ +unsigned long udpresolve(int af, unsigned char * name, unsigned char * value, unsigned *retttl, struct clientparam* param, int makeauth){ int i,n; unsigned long retval; - if((retval = hashresolv(&dns_table, name, retttl))) { + if((af == AF_INET) && (retval = hashresolv(&dns_table, name, value, retttl))) { + return retval; + } + if((af == AF_INET6) && (retval = hashresolv(&dns6_table, name, value, retttl))) { return retval; } n = (makeauth && !SAISNULL(&authnserver.addr))? 1 : numservers; @@ -1064,7 +1080,7 @@ unsigned long udpresolve(unsigned char * name, unsigned *retttl, struct clientpa *s2 = (len - (int)(s2 - buf)) - 1; len++; buf[len++] = 0; - buf[len++] = (makeauth == 1)? 0x0c : 0x01; /* PTR:host address */ + buf[len++] = (makeauth == 1)? 0x0c : (af==AF_INET6? 0x1c:0x01); /* PTR:host address */ buf[len++] = 0; buf[len++] = 1; /* INET */ if(usetcp){ @@ -1112,25 +1128,27 @@ unsigned long udpresolve(unsigned char * name, unsigned *retttl, struct clientpa k += 4; if(na > 255) na = 255; /* somebody is very evil */ for (j = 0; j < na; j++) { /* now there should be answers */ - if((k+16) > len) { + if((k+(af == AF_INET6?28:16)) > len) { break; } flen = buf[k+11] + (((unsigned short)buf[k+10])<<8); - if((k+12+flen) > len) break; + if((k+12+flen) > len) { + break; + } if(makeauth != 1){ - if(buf[k+2] != 0 || buf[k+3] != 0x01 || flen != 4) { + if(buf[k+2] != 0 || buf[k+3] != (af == AF_INET6?0x1c:0x1) || flen != (af == AF_INET6?16:4)) { k+= (12 + flen); continue; /* we need A IPv4 */ } - retval = *(unsigned long *)(buf + k + 12); ttl = ntohl(*(unsigned long *)(buf + k + 6)); - t = time(0); + memcpy(value, buf + k + 12, af == AF_INET6? 16:4); if(ttl < 60 || ((unsigned)t)+ttl < ttl) ttl = 300; if(ttl){ - hashadd(&dns_table, name, retval, ((unsigned)t)+ttl); + hashadd(af == AF_INET6?&dns6_table:&dns_table, name, value, conf.time+ttl); + } if(retttl) *retttl = ttl; - return retval; + return 1; } else { @@ -1147,19 +1165,30 @@ unsigned long udpresolve(unsigned char * name, unsigned *retttl, struct clientpa if(param->username)myfree(param->username); param->username = mystrdup (buf + k + 13); - return udpresolve(param->username, NULL, NULL, 2); + return udpresolve(af,param->username, value, NULL, NULL, 2); } } } return 0; } -unsigned long myresolver(unsigned char * name){ - return udpresolve(name, NULL, NULL, 0); +unsigned long myresolver(int af, unsigned char * name, unsigned char * value){ + return udpresolve(af, name, value, NULL, NULL, 0); } -unsigned long fakeresolver (unsigned char *name){ - return htonl(0x7F000002); +unsigned long fakeresolver (int af, unsigned char *name, unsigned char * value){ + memset(value, 0, af == AF_INET6? 16 : 4); + if(af == AF_INET6){ + memset(value, 0, 16); + value[15] = 2; + } + else { + value[0] = 127; + value[1] = 0; + value[2] = 0; + value[3] = 2; + } + return 1; } #ifndef NOODBC diff --git a/src/common.c b/src/common.c index 137da1f..52287c2 100644 --- a/src/common.c +++ b/src/common.c @@ -693,6 +693,7 @@ struct hostent * my_gethostbyname(char *name, char *buf, struct hostent *hp){ } #endif +#ifdef NOIPV6 unsigned long getip(unsigned char *name){ unsigned long retval; int i; @@ -719,9 +720,9 @@ unsigned long getip(unsigned char *name){ } } if(resolvfunc){ - if((retval = (*resolvfunc)(name))) return retval; + if((*resolvfunc)(AF_INET, name, &retval)) return retval; if(conf.demanddialprog) system(conf.demanddialprog); - return (*resolvfunc)(name); + return (*resolvfunc)(AF_INET, name, &retval)?retval:0; } #if !defined(_WIN32) && !defined(GETHOSTBYNAME_R) if(!ghbn_init){ @@ -744,6 +745,7 @@ unsigned long getip(unsigned char *name){ #endif return retval; } +#endif unsigned long getip46(int family, unsigned char *name, struct sockaddr *sa){ #ifndef NOIPV6 @@ -753,9 +755,11 @@ unsigned long getip46(int family, unsigned char *name, struct sockaddr *sa){ if(!sa) return 0; if(!family) { -#endif + family = AF_INET; +#else ((struct sockaddr_in *)sa)->sin_family = AF_INET; return (((struct sockaddr_in *)sa)->sin_addr.s_addr = getip(name))? AF_INET:0; +#endif #ifndef NOIPV6 } for(i=0; name[i]; i++){ @@ -786,6 +790,16 @@ unsigned long getip46(int family, unsigned char *name, struct sockaddr *sa){ return inet_pton(AF_INET6, name, SAADDR(sa))?(family==4? 0:AF_INET6) : 0; } } + if(resolvfunc){ + int f = (family == 6 || family == 64)?AF_INET6:AF_INET; + *SAFAMILY(sa) = f; + if(resolvfunc(f, name, SAADDR(sa))) return f; + if(family == 4 || family == 6) return 0; + f = (family == 46)? AF_INET6 : AF_INET; + *SAFAMILY(sa) = f; + if(resolvfunc(f, name, SAADDR(sa))) return f; + return 0; + } memset(&hint, 0, sizeof(hint)); hint.ai_family = (family == 6 || family == 64)?AF_INET6:AF_INET; if (getaddrinfo(name, NULL, &hint, &ai)) { diff --git a/src/dighosts.c b/src/dighosts.c index 5f4af9b..2d25989 100644 --- a/src/dighosts.c +++ b/src/dighosts.c @@ -83,12 +83,11 @@ int main(int argc, char *argv[]){ return 4; } *hostend = '/'; - if(!(sa.sin_addr.s_addr = getip(host))) { + if(!getip46(4, host, (struct sockaddr *)&sa)) { fprintf(stderr, "Unable to resolve %s\n", host); return 5; } sa.sin_port = htons(80); - sa.sin_family = AF_INET; if((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) return 6; sprintf((char *)buf, (char *)request, hostend, host); if(connect(sock,(struct sockaddr *)&sa,sizeof(sa))) { diff --git a/src/dnspr.c b/src/dnspr.c index b8caeaa..bdee19e 100644 --- a/src/dnspr.c +++ b/src/dnspr.c @@ -27,6 +27,7 @@ void * dnsprchild(struct clientparam* param) { int len; unsigned type=0; unsigned ttl; + unsigned char addr[16]; #ifdef _WIN32 unsigned long ul = 1; #endif @@ -81,8 +82,8 @@ void * dnsprchild(struct clientparam* param) { *s2 = (len - (int)(s2 - buf)) - 1; type = ((unsigned)buf[len+1])*256 + (unsigned)buf[len+2]; - if(type==1 && !param->srv->singlepacket){ - ip = udpresolve((unsigned char *)host, &ttl, param, 0); + if((type==0x01 || type==0x1c) && !param->srv->singlepacket){ + ip = udpresolve((type==0x1c)?AF_INET6:AF_INET, (unsigned char *)host, addr, &ttl, param, 0); } len+=5; @@ -96,13 +97,13 @@ void * dnsprchild(struct clientparam* param) { memset(buf+len, 0, 16); buf[len] = 0xc0; buf[len+1] = 0x0c; - buf[len+3] = 1; + buf[len+3] = type; buf[len+5] = 1; ttl = htonl(ttl); memcpy(buf + len + 6, &ttl, 4); - buf[len+11] = 4; - memcpy(buf+len+12,(void *)&ip,4); - len+=16; + buf[len+11] = type==1? 4:16; + memcpy(buf+len+12,(void *)&addr,type==1? 4:16); + len+=(type==1?16:28); } else if(type == 0x0c) { unsigned a, b, c, d; @@ -191,14 +192,12 @@ void * dnsprchild(struct clientparam* param) { CLEANRET: if(param->res!=813){ - sprintf((char *)buf, "%04x/%s(%u.%u.%u.%u)", + sprintf((char *)buf, "%04x/%s/", (unsigned)type, - host?host:"", - (unsigned)(ntohl(ip)&0xff000000)>>24, - (unsigned)(ntohl(ip)&0x00ff0000)>>16, - (unsigned)(ntohl(ip)&0x0000ff00)>>8, - (unsigned)(ntohl(ip)&0x000000ff) - ); + host?host:""); + if(ip && type == 0x01 || type == 0x1c){ + myinet_ntop(type == 0x01? AF_INET:AF_INET6, addr, buf+strlen(buf), 64); + } (*param->srv->logfunc)(param, buf); } if(bbuf)myfree(bbuf); diff --git a/src/plugins.c b/src/plugins.c index d9981ed..e7b0cc9 100644 --- a/src/plugins.c +++ b/src/plugins.c @@ -35,7 +35,7 @@ struct symbol symbols[] = { {symbols+8, "myinet_ntop", (void *) myinet_ntop}, {symbols+9, "dobuf", (void *) dobuf}, {symbols+10, "scanaddr", (void *) scanaddr}, - {symbols+11, "getip", (void *) getip}, + {symbols+11, "getip46", (void *) getip46}, {symbols+12, "sockmap", (void *) sockmap}, {symbols+13, "sockfuncs", (void *) &so}, {symbols+14, "ACLmatches", (void *) ACLmatches}, @@ -78,7 +78,6 @@ struct symbol symbols[] = { {symbols+48, "parsestr", (void *) parsestr}, {symbols+49, "make_ace", (void *) make_ace}, {symbols+50, "freeacl", (void *) freeacl}, - {symbols+51, "getip46", (void *) getip46}, {NULL, "", NULL} }; @@ -108,7 +107,6 @@ struct pluginlink pluginlink = { dobuf, dobuf2, scanaddr, - getip, getip46, sockmap, ACLmatches, diff --git a/src/proxy.h b/src/proxy.h index 4558546..82b4dcf 100644 --- a/src/proxy.h +++ b/src/proxy.h @@ -187,8 +187,8 @@ extern struct nserver nservers[MAXNSERVERS]; struct nserver authnserver; unsigned long getip(unsigned char *name); unsigned long getip46(int family, unsigned char *name, struct sockaddr *sa); -unsigned long myresolver(unsigned char *); -unsigned long fakeresolver (unsigned char *name); +unsigned long myresolver(int, unsigned char *, unsigned char *); +unsigned long fakeresolver (int, unsigned char *, unsigned char*); int inithashtable(struct hashtable *hashtable, unsigned nhashsize); void freeparam(struct clientparam * param); void clearstat(struct clientparam * param); @@ -227,14 +227,14 @@ void mschap(const unsigned char *win_password, const unsigned char *challenge, unsigned char *response); struct hashtable; -void hashadd(struct hashtable *ht, const unsigned char* name, unsigned long value, time_t expires); +void hashadd(struct hashtable *ht, const unsigned char* name, unsigned char* value, time_t expires); int parsehostname(char *hostname, struct clientparam *param, unsigned short port); int parseusername(char *username, struct clientparam *param, int extpasswd); int parseconnusername(char *username, struct clientparam *param, int extpasswd, unsigned short port); int ACLmatches(struct ace* acentry, struct clientparam * param); -unsigned long udpresolve(unsigned char * name, unsigned *retttl, struct clientparam* param, int makeauth); +unsigned long udpresolve(int af, unsigned char * name, unsigned char * value, unsigned *retttl, struct clientparam* param, int makeauth); struct ace * copyacl (struct ace *ac); struct auth * copyauth (struct auth *); diff --git a/src/structures.h b/src/structures.h index aaf4322..9b0f26a 100644 --- a/src/structures.h +++ b/src/structures.h @@ -155,7 +155,7 @@ struct srvparam; typedef void (*LOGFUNC)(struct clientparam * param, const unsigned char *); typedef int (*AUTHFUNC)(struct clientparam * param); typedef void * (*REDIRECTFUNC)(struct clientparam * param); -typedef unsigned long (*RESOLVFUNC)(unsigned char *); +typedef unsigned long (*RESOLVFUNC)(int af, unsigned char *name, unsigned char *value); typedef unsigned (*BANDLIMFUNC)(struct clientparam * param, unsigned nbytesin, unsigned nbytesout); typedef void (*TRAFCOUNTFUNC)(struct clientparam * param); typedef void * (*EXTENDFUNC) (struct node *node); @@ -583,16 +583,17 @@ struct child { struct hashentry { unsigned char hash[sizeof(unsigned)*4]; - unsigned value; time_t expires; struct hashentry *next; + char value[4]; }; struct hashtable { unsigned hashsize; + unsigned recsize; unsigned rnd[4]; struct hashentry ** hashtable; - struct hashentry * hashvalues; + void * hashvalues; struct hashentry * hashempty; }; @@ -656,7 +657,6 @@ struct pluginlink { int (*dobuf)(struct clientparam * param, unsigned char * buf, const unsigned char *s, const unsigned char * doublec); int (*dobuf2)(struct clientparam * param, unsigned char * buf, const unsigned char *s, const unsigned char * doublec, struct tm* tm, char * format); int (*scanaddr)(const unsigned char *s, unsigned long * ip, unsigned long * mask); - unsigned long (*getip)(unsigned char *name); unsigned long (*getip46)(int family, unsigned char *name, struct sockaddr *sa); int (*sockmap)(struct clientparam * param, int timeo); int (*ACLMatches)(struct ace* acentry, struct clientparam * param); diff --git a/src/version.h b/src/version.h index d0ce229..2a103c2 100644 --- a/src/version.h +++ b/src/version.h @@ -1,2 +1,2 @@ #define VERSION "3proxy-0.8b-devel" -#define BUILDDATE "141214004331" +#define BUILDDATE "141214052453"