Ejemplo n.º 1
0
/* 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;
}
Ejemplo n.º 2
0
/* 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);
}
Ejemplo n.º 3
0
/** 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;
}