X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Ftypes.c;h=eacf2f38c56f9973d273bf0efb6f24970cc632ea;hb=c4e5d3cc968527cfc7b60585e7abd51b62f2b296;hp=7cae88178dd2cf7407987a0c90d1fece8590301a;hpb=ca00c406d966d65b85d1f94c3d618ccec8de1dc3;p=adns.git diff --git a/src/types.c b/src/types.c index 7cae881..eacf2f3 100644 --- a/src/types.c +++ b/src/types.c @@ -85,6 +85,7 @@ * cs_* * gsz_* * postsort_* + * qs_* */ /* @@ -260,11 +261,27 @@ static adns_status pa_inaddr(const parseinfo *pai, int cbyte, static int search_sortlist(adns_state ads, int af, const void *ad) { const struct sortlist *slp; + const struct in6_addr *a6; + union gen_addr a; int i; - + int v6mappedp= 0; + + if (af == AF_INET6) { + a6= ad; + if (IN6_IS_ADDR_V4MAPPED(a6)) { + a.v4.s_addr= htonl(((unsigned long)a6->s6_addr[12] << 24) | + ((unsigned long)a6->s6_addr[13] << 16) | + ((unsigned long)a6->s6_addr[14] << 8) | + ((unsigned long)a6->s6_addr[15] << 0)); + v6mappedp= 1; + } + } + for (i=0, slp=ads->sortlist; insortlist && - !adns__addr_match_p(af,ad, slp->af,&slp->base,&slp->mask); + !adns__addr_match_p(af,ad, slp->af,&slp->base,&slp->mask) && + !(v6mappedp && + adns__addr_match_p(AF_INET,&a, slp->af,&slp->base,&slp->mask)); i++, slp++); return i; } @@ -1267,11 +1284,13 @@ static void mf_flat(adns_query qu, void *data) { } #define DEEP_TYPE(code,rrt,fmt,memb,parser,comparer,/*printer*/...) \ { adns_r_##code&adns_rrt_reprmask, rrt,fmt,TYPESZ_M(memb), mf_##memb, \ GLUE(cs_, CAR(__VA_ARGS__)),pa_##parser,di_##comparer, \ - adns__ckl_hostname, 0, adns__getrrsz_default, CDR(__VA_ARGS__) } + adns__ckl_hostname, 0, adns__getrrsz_default, adns__query_send, \ + CDR(__VA_ARGS__) } #define FLAT_TYPE(code,rrt,fmt,memb,parser,comparer,/*printer*/...) \ { adns_r_##code&adns_rrt_reprmask, rrt,fmt,TYPESZ_M(memb), mf_flat, \ GLUE(cs_, CAR(__VA_ARGS__)),pa_##parser,di_##comparer, \ - adns__ckl_hostname, 0, adns__getrrsz_default, CDR(__VA_ARGS__) } + adns__ckl_hostname, 0, adns__getrrsz_default, adns__query_send, \ + CDR(__VA_ARGS__) } #define di_0 0