/* create a new dns req to be submitted */ getdns_dns_req * dns_req_new(struct getdns_context *context, const char *name, uint16_t request_type, struct getdns_dict *extensions) { getdns_dns_req *result = NULL; getdns_network_req *req = NULL; result = GETDNS_MALLOC(context->mf, getdns_dns_req); if (result == NULL) { return NULL; } result->my_mf = context->mf; result->name = getdns_strdup(&(result->my_mf), name); result->context = context; result->canceled = 0; result->current_req = NULL; result->first_req = NULL; result->trans_id = ldns_get_random(); getdns_dict_copy(extensions, &result->extensions); result->return_dnssec_status = context->return_dnssec_status; /* will be set by caller */ result->user_pointer = NULL; result->user_callback = NULL; result->local_timeout_id = 0; /* create the requests */ req = network_req_new(result, request_type, LDNS_RR_CLASS_IN, extensions); if (!req) { dns_req_free(result); return NULL; } result->current_req = req; result->first_req = req; /* tack on A or AAAA if needed */ if (is_extension_set(extensions, "return_both_v4_and_v6") && (request_type == GETDNS_RRTYPE_A || request_type == GETDNS_RRTYPE_AAAA)) { uint16_t next_req_type = (request_type == GETDNS_RRTYPE_A) ? GETDNS_RRTYPE_AAAA : GETDNS_RRTYPE_A; getdns_network_req *next_req = network_req_new(result, next_req_type, LDNS_RR_CLASS_IN, extensions); if (!next_req) { dns_req_free(result); return NULL; } req->next = next_req; } return result; }
/* random isn't really that good */ void ldns_resolver_nameservers_randomize(ldns_resolver *r) { uint16_t i, j; ldns_rdf **ns, *tmp; /* should I check for ldns_resolver_random?? */ assert(r != NULL); ns = ldns_resolver_nameservers(r); for (i = 0; i < ldns_resolver_nameserver_count(r); i++) { j = ldns_get_random() % ldns_resolver_nameserver_count(r); tmp = ns[i]; ns[i] = ns[j]; ns[j] = tmp; } ldns_resolver_set_nameservers(r, ns); }
/** create a query to test */ static ldns_buffer* make_query(char* nm, int tp) { /* with EDNS DO and CDFLAG */ ldns_buffer* b = ldns_buffer_new(512); ldns_pkt* p; ldns_status s; if(!b) { if(verb) printf("error: out of memory\n"); return NULL; } s = ldns_pkt_query_new_frm_str(&p, nm, tp, LDNS_RR_CLASS_IN, (uint16_t)(LDNS_RD|LDNS_CD)); if(s != LDNS_STATUS_OK) { if(verb) printf("error: %s\n", ldns_get_errorstr_by_id(s)); ldns_buffer_free(b); return NULL; } if(!p) { if(verb) printf("error: out of memory\n"); ldns_buffer_free(b); return NULL; } ldns_pkt_set_edns_do(p, 1); ldns_pkt_set_edns_udp_size(p, 4096); ldns_pkt_set_id(p, ldns_get_random()); if( (s=ldns_pkt2buffer_wire(b, p)) != LDNS_STATUS_OK) { if(verb) printf("error: %s\n", ldns_get_errorstr_by_id(s)); ldns_pkt_free(p); ldns_buffer_free(b); return NULL; } ldns_pkt_free(p); return b; }