diff options
Diffstat (limited to 'util/edns.c')
-rw-r--r-- | util/edns.c | 73 |
1 files changed, 38 insertions, 35 deletions
diff --git a/util/edns.c b/util/edns.c index c83a4a545fe3..ddbb46e892ce 100644 --- a/util/edns.c +++ b/util/edns.c @@ -48,81 +48,84 @@ #include "util/data/msgparse.h" #include "util/data/msgreply.h" -struct edns_tags* edns_tags_create(void) +struct edns_strings* edns_strings_create(void) { - struct edns_tags* edns_tags = calloc(1, sizeof(struct edns_tags)); - if(!edns_tags) + struct edns_strings* edns_strings = calloc(1, + sizeof(struct edns_strings)); + if(!edns_strings) return NULL; - if(!(edns_tags->region = regional_create())) { - edns_tags_delete(edns_tags); + if(!(edns_strings->region = regional_create())) { + edns_strings_delete(edns_strings); return NULL; } - return edns_tags; + return edns_strings; } -void edns_tags_delete(struct edns_tags* edns_tags) +void edns_strings_delete(struct edns_strings* edns_strings) { - if(!edns_tags) + if(!edns_strings) return; - regional_destroy(edns_tags->region); - free(edns_tags); + regional_destroy(edns_strings->region); + free(edns_strings); } static int -edns_tags_client_insert(struct edns_tags* edns_tags, +edns_strings_client_insert(struct edns_strings* edns_strings, struct sockaddr_storage* addr, socklen_t addrlen, int net, - uint16_t tag_data) + const char* string) { - struct edns_tag_addr* eta = regional_alloc_zero(edns_tags->region, - sizeof(struct edns_tag_addr)); - if(!eta) + struct edns_string_addr* esa = regional_alloc_zero(edns_strings->region, + sizeof(struct edns_string_addr)); + if(!esa) return 0; - eta->tag_data = tag_data; - if(!addr_tree_insert(&edns_tags->client_tags, &eta->node, addr, addrlen, - net)) { - verbose(VERB_QUERY, "duplicate EDNS client tag ignored."); + esa->string_len = strlen(string); + esa->string = regional_alloc_init(edns_strings->region, string, + esa->string_len); + if(!esa->string) + return 0; + if(!addr_tree_insert(&edns_strings->client_strings, &esa->node, addr, + addrlen, net)) { + verbose(VERB_QUERY, "duplicate EDNS client string ignored."); } return 1; } -int edns_tags_apply_cfg(struct edns_tags* edns_tags, +int edns_strings_apply_cfg(struct edns_strings* edns_strings, struct config_file* config) { struct config_str2list* c; - regional_free_all(edns_tags->region); - addr_tree_init(&edns_tags->client_tags); + regional_free_all(edns_strings->region); + addr_tree_init(&edns_strings->client_strings); - for(c=config->edns_client_tags; c; c=c->next) { + for(c=config->edns_client_strings; c; c=c->next) { struct sockaddr_storage addr; socklen_t addrlen; int net; - uint16_t tag_data; log_assert(c->str && c->str2); if(!netblockstrtoaddr(c->str, UNBOUND_DNS_PORT, &addr, &addrlen, &net)) { - log_err("cannot parse EDNS client tag IP netblock: %s", - c->str); + log_err("cannot parse EDNS client string IP netblock: " + "%s", c->str); return 0; } - tag_data = atoi(c->str2); /* validated in config parser */ - if(!edns_tags_client_insert(edns_tags, &addr, addrlen, net, - tag_data)) { - log_err("out of memory while adding EDNS tags"); + if(!edns_strings_client_insert(edns_strings, &addr, addrlen, + net, c->str2)) { + log_err("out of memory while adding EDNS strings"); return 0; } } - edns_tags->client_tag_opcode = config->edns_client_tag_opcode; + edns_strings->client_string_opcode = config->edns_client_string_opcode; - addr_tree_init_parents(&edns_tags->client_tags); + addr_tree_init_parents(&edns_strings->client_strings); return 1; } -struct edns_tag_addr* -edns_tag_addr_lookup(rbtree_type* tree, struct sockaddr_storage* addr, +struct edns_string_addr* +edns_string_addr_lookup(rbtree_type* tree, struct sockaddr_storage* addr, socklen_t addrlen) { - return (struct edns_tag_addr*)addr_tree_lookup(tree, addr, addrlen); + return (struct edns_string_addr*)addr_tree_lookup(tree, addr, addrlen); } static int edns_keepalive(struct edns_data* edns_out, struct edns_data* edns_in, |