/** * Search the given 'iptree' for response address information that matches * any of the IP addresses in an AAAA or A in the answer section of the * response (stored in 'rep'). If found, a pointer to the matched resp_addr * structure will be returned, and '*rrset_id' is set to the index in * rep->rrsets for the RRset that contains the matching IP address record * (the index is normally 0, but can be larger than that if this is a CNAME * chain or type-ANY response). */ static const struct resp_addr* respip_addr_lookup(const struct reply_info *rep, struct rbtree_type* iptree, size_t* rrset_id) { size_t i; struct resp_addr* ra; struct sockaddr_storage ss; socklen_t addrlen; for(i=0; i<rep->an_numrrsets; i++) { size_t j; const struct packed_rrset_data* rd; uint16_t rtype = ntohs(rep->rrsets[i]->rk.type); if(rtype != LDNS_RR_TYPE_A && rtype != LDNS_RR_TYPE_AAAA) continue; rd = rep->rrsets[i]->entry.data; for(j = 0; j < rd->count; j++) { if(!rdata2sockaddr(rd, rtype, j, &ss, &addrlen)) continue; ra = (struct resp_addr*)addr_tree_lookup(iptree, &ss, addrlen); if(ra) { *rrset_id = i; return ra; } } } return NULL; }
enum acl_access acl_list_lookup(struct acl_list* acl, struct sockaddr_storage* addr, socklen_t addrlen) { struct acl_addr* r = (struct acl_addr*)addr_tree_lookup(&acl->tree, addr, addrlen); if(r) return r->control; return acl_deny; }
static enum localzone_type lz_type(uint8_t *taglist, size_t taglen, uint8_t *taglist2, size_t taglen2, uint8_t *tagactions, size_t tagactionssize, enum localzone_type lzt, struct comm_reply* repinfo, struct rbtree_t* override_tree, int* tag, char** tagname, int num_tags) { size_t i, j; uint8_t tagmatch; struct local_zone_override* lzo; if(repinfo && override_tree) { lzo = (struct local_zone_override*)addr_tree_lookup( override_tree, &repinfo->addr, repinfo->addrlen); if(lzo && lzo->type) { verbose(VERB_ALGO, "local zone override to type %s", local_zone_type2str(lzo->type)); return lzo->type; } } if(!taglist || !taglist2) return lzt; for(i=0; i<taglen && i<taglen2; i++) { tagmatch = (taglist[i] & taglist2[i]); for(j=0; j<8 && tagmatch>0; j++) { if((tagmatch & 0x1)) { *tag = (int)(i*8+j); verbose(VERB_ALGO, "matched tag [%d] %s", *tag, (*tag<num_tags?tagname[*tag]:"null")); /* does this tag have a tag action? */ if(i*8+j < tagactionssize && tagactions && tagactions[i*8+j] != 0) { verbose(VERB_ALGO, "tag action [%d] %s to type %s", *tag, (*tag<num_tags?tagname[*tag]:"null"), local_zone_type2str( (enum localzone_type) tagactions[i*8+j])); return (enum localzone_type)tagactions[i*8+j]; } return lzt; } tagmatch >>= 1; } } return lzt; }