/** change an rrsig rrset for use as data rrset */ static struct rrset_parse* change_rrsig_rrset(struct rrset_parse* sigset, struct msg_parse* msg, sldns_buffer* pkt, uint16_t datatype, uint32_t rrset_flags, int hasother, sldns_pkt_section section, struct regional* region) { struct rrset_parse* dataset = sigset; hashvalue_t hash = pkt_hash_rrset(pkt, sigset->dname, datatype, sigset->rrset_class, rrset_flags); log_assert( sigset->type == LDNS_RR_TYPE_RRSIG ); log_assert( datatype != LDNS_RR_TYPE_RRSIG ); if(hasother) { /* need to make new rrset to hold data type */ dataset = new_rrset(msg, sigset->dname, sigset->dname_len, datatype, sigset->rrset_class, hash, rrset_flags, section, region); if(!dataset) return NULL; switch(section) { case LDNS_SECTION_ANSWER: msg->an_rrsets++; break; case LDNS_SECTION_AUTHORITY: msg->ns_rrsets++; break; case LDNS_SECTION_ADDITIONAL: msg->ar_rrsets++; break; default: log_assert(0); } if(!moveover_rrsigs(pkt, region, sigset, dataset, msg->qtype == LDNS_RR_TYPE_RRSIG || (msg->qtype == LDNS_RR_TYPE_ANY && section != LDNS_SECTION_ANSWER) )) return NULL; return dataset; } /* changeover the type of the rrset to data set */ msgparse_bucket_remove(msg, dataset); /* insert into new hash bucket */ dataset->rrset_bucket_next = msg->hashtable[hash&(PARSE_TABLE_SIZE-1)]; msg->hashtable[hash&(PARSE_TABLE_SIZE-1)] = dataset; dataset->hash = hash; /* use section of data item for result */ change_section(msg, dataset, section); dataset->type = datatype; dataset->flags = rrset_flags; dataset->rrsig_count += dataset->rr_count; dataset->rr_count = 0; /* move sigs to end of siglist */ if(dataset->rrsig_last) dataset->rrsig_last->next = dataset->rr_first; else dataset->rrsig_first = dataset->rr_first; dataset->rrsig_last = dataset->rr_last; dataset->rr_first = 0; dataset->rr_last = 0; return dataset; }
bool change(const std::string & key, const std::string & value) { return search_and_apply(key, value, change_section(key, value)); }