ldns_pkt * ldns_resolver_query(const ldns_resolver *r, const ldns_rdf *name, ldns_rr_type type, ldns_rr_class c, uint16_t flags) { ldns_rdf *newname; ldns_pkt *pkt; ldns_status status; pkt = NULL; if (!ldns_resolver_defnames(r)) { status = ldns_resolver_send(&pkt, (ldns_resolver *)r, name, type, c, flags); if (status == LDNS_STATUS_OK) { return pkt; } else { if (pkt) { ldns_pkt_free(pkt); } fprintf(stderr, "error: %s\n", ldns_get_errorstr_by_id(status)); return NULL; } } if (!ldns_resolver_domain(r)) { /* _defnames is set, but the domain is not....?? */ status = ldns_resolver_send(&pkt, (ldns_resolver *)r, name, type, c, flags); if (status == LDNS_STATUS_OK) { return pkt; } else { if (pkt) { ldns_pkt_free(pkt); } return NULL; } } newname = ldns_dname_cat_clone((const ldns_rdf*)name, ldns_resolver_domain(r)); if (!newname) { if (pkt) { ldns_pkt_free(pkt); } return NULL; } status = ldns_resolver_send(&pkt, (ldns_resolver *)r, newname, type, c, flags); ldns_rdf_free(newname); return pkt; }
void ldns_resolver_deep_free(ldns_resolver *res) { size_t i; if (res) { if (res->_searchlist) { for (i = 0; i < ldns_resolver_searchlist_count(res); i++) { ldns_rdf_deep_free(res->_searchlist[i]); } LDNS_FREE(res->_searchlist); } if (res->_nameservers) { for (i = 0; i < res->_nameserver_count; i++) { ldns_rdf_deep_free(res->_nameservers[i]); } LDNS_FREE(res->_nameservers); } if (ldns_resolver_domain(res)) { ldns_rdf_deep_free(ldns_resolver_domain(res)); } if (res->_tsig_keyname) { LDNS_FREE(res->_tsig_keyname); } if (res->_tsig_keydata) { LDNS_FREE(res->_tsig_keydata); } if (res->_tsig_algorithm) { LDNS_FREE(res->_tsig_algorithm); } if (res->_cur_axfr_pkt) { ldns_pkt_free(res->_cur_axfr_pkt); } if (res->_rtt) { LDNS_FREE(res->_rtt); } if (res->_dnssec_anchors) { ldns_rr_list_deep_free(res->_dnssec_anchors); } LDNS_FREE(res); } }