bool handle_domain(void *k, void *l, void *c) { lookup_t *lookup = (lookup_t *) l; lookup_context_t *context = (lookup_context_t *) c; struct timeval now; gettimeofday(&now, NULL); if (timediff(&now, &lookup->next_lookup) < 0) { uint16_t query_flags = 0; if (!context->cmd_args.norecurse) { query_flags |= LDNS_RD; } ldns_pkt *packet; if(LDNS_STATUS_OK != ldns_pkt_query_new_frm_str(&packet, lookup->domain, context->cmd_args.record_types, LDNS_RR_CLASS_IN, query_flags)) { abort(); } ldns_pkt_set_id(packet, lookup->transaction); uint8_t *buf = NULL; size_t packet_size = 0; if(LDNS_STATUS_OK != ldns_pkt2wire(&buf, packet, &packet_size)) { abort(); } ldns_pkt_free(packet); packet = NULL; sockaddr_in_t *resolver = massdns_get_resolver((size_t) rand(), &context->resolvers); ssize_t n = -1; while (n < 0) { n = sendto(context->sock, buf, packet_size, 0, (sockaddr_t *) resolver, sizeof(*resolver)); } free(buf); long addusec = context->cmd_args.interval_ms * 1000; addusec += rand() % (addusec / 5); // Avoid congestion by adding some randomness lookup->next_lookup.tv_usec = (now.tv_usec + addusec) % 1000000; lookup->next_lookup.tv_sec = now.tv_sec + (now.tv_usec + addusec) / 1000000; lookup->tries++; if (lookup->tries == context->cmd_args.resolve_count) { hashmapRemove(context->map, lookup->domain); free(lookup->domain); free(lookup); } } return true; }
/** 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; }