Housekeeping of ldns res. Fix transport test.

This commit is contained in:
saradickinson 2014-09-17 18:24:07 +00:00
parent 5a765ad632
commit 46748c9a0c
3 changed files with 39 additions and 33 deletions

View File

@ -494,6 +494,8 @@ getdns_context_create_with_extended_memory_functions(
getdns_context_destroy(result);
return GETDNS_RETURN_GENERIC_ERROR;
}
/* ldns context is initialised to NULL here and rebuilt later if needed */
result->ldns_res = NULL;
*context = result;
@ -577,9 +579,11 @@ getdns_context_destroy(struct getdns_context *context)
getdns_list_destroy(context->dnssec_trust_anchors);
getdns_list_destroy(context->upstream_list);
/* destroy the ub context */
/* destroy the contexts */
if (context->unbound_ctx)
ub_ctx_delete(context->unbound_ctx);
if (context->ldns_res)
ldns_resolver_deep_free(context->ldns_res);
if (context->outbound_requests)
GETDNS_FREE(context->my_mf, context->outbound_requests);
@ -667,18 +671,16 @@ rebuild_ldns_res(struct getdns_context* context) {
return GETDNS_RETURN_MEMORY_ERROR;
}
/* TODO: Don't think ldns supports this option currently
* set_ldns_dnssec_allowed_skew(context,
* context->dnssec_allowed_skew);
*/
/* TODO: ldns doesn't support this option so this will have to be taken
account expliticly during the ldns validation
* set_ldns_dnssec_allowed_skew();*/
/* This is all the settings required for stub operation in sync mode.
* Will need additional work here when supporting async mode.*/
set_ldns_edns_maximum_udp_payload_size(context,
context->edns_maximum_udp_payload_size);
set_ldns_dns_transport(context, context->dns_transport);
/* Also need to check any other settings that might have been
* and make sure they get set until we have changed all the get/set
* methods */
/* We need to set up the upstream recursive servers from the context */
set_ldns_nameservers(context, context->upstream_list);
return GETDNS_RETURN_GOOD;
@ -1529,7 +1531,7 @@ getdns_context_prepare_for_resolution(struct getdns_context *context,
switch (context->namespaces[i]) {
case GETDNS_NAMESPACE_LOCALNAMES:
/* TODO: Note to self! This must change once we have
* asynchronous stub mode using ldns. */
* proper namespace hanlding or asynch stub mode using ldns.*/
(void) ub_ctx_hosts(context->unbound_ctx, NULL);
break;

View File

@ -103,26 +103,32 @@ void* run_transport_server(void* data) {
n = read(conn, mesg, 65536);
tcp_count++;
}
ldns_wire2pkt(&query, mesg, n);
ldns_resolver_send_pkt(&pkt, resolver, query);
ldns_str2rdf_a(&answerfrom, "127.0.0.1");
ldns_pkt_set_answerfrom(pkt, answerfrom);
ldns_pkt_free(query);
uint8_t* pkt_data;
size_t pkt_len;
ldns_pkt* answer = pkt;
ldns_pkt2wire(&pkt_data, answer, &pkt_len);
ldns_buffer *send_buf;
send_buf = ldns_buffer_new(LDNS_MIN_BUFLEN);
ldns_pkt2buffer_wire(send_buf, pkt);
if (udp_count > 0) {
sendto(udp, pkt_data, pkt_len, 0, (struct sockaddr *) &client_addr, sizeof (client_addr));
sendto(udp, (void*)ldns_buffer_begin(send_buf), ldns_buffer_position(send_buf),
0, (struct sockaddr *) &client_addr, sizeof (client_addr));
} else if (conn > 0) {
int wcount = write(conn, pkt_data, pkt_len);
if (wcount != pkt_len) {
/* For now ignore this */
continue;
}
uint8_t *send_array;
/* add length of packet */
send_array = LDNS_XMALLOC(uint8_t, ldns_buffer_position(send_buf) + 2);
if(!send_array) return 0;
ldns_write_uint16(send_array, ldns_buffer_position(send_buf));
memcpy(send_array + 2, ldns_buffer_begin(send_buf), ldns_buffer_position(send_buf));
write(conn, (void*)send_array, ldns_buffer_position(send_buf) + 2);
LDNS_FREE(send_array);
}
free(pkt_data);
ldns_pkt_free(answer);
LDNS_FREE(send_buf);
ldns_pkt_free(pkt);
} /* End of if */
} /* end of while loop */
close(udp);
@ -210,7 +216,7 @@ START_TEST(getdns_transport_udp_sync) {
t_data.running = 0;
pthread_join(thread, NULL);
ck_assert_msg(t_data.udp_count == 1, "udp_count != 1");
ck_assert_msg(t_data.udp_count >= 1, "udp_count !>= 1");
ck_assert_msg(t_data.tcp_count == 0, "tcp_count != 0");
}
@ -285,7 +291,7 @@ START_TEST(getdns_transport_tcp_sync) {
t_data.running = 0;
pthread_join(thread, NULL);
ck_assert_msg(t_data.udp_count == 0, "udp_count != 0");
ck_assert_msg(t_data.tcp_count == 1, "tcp_count != 1");
ck_assert_msg(t_data.tcp_count >= 1, "tcp_count !>= 1");
}
@ -362,7 +368,7 @@ START_TEST(getdns_transport_udp_async) {
t_data.running = 0;
pthread_join(thread, NULL);
ck_assert_msg(t_data.udp_count == 1, "udp_count != 1");
ck_assert_msg(t_data.udp_count >= 1, "udp_count !>= 1");
ck_assert_msg(t_data.tcp_count == 0, "tcp_count != 0");
}
@ -441,7 +447,7 @@ START_TEST(getdns_transport_tcp_async) {
t_data.running = 0;
pthread_join(thread, NULL);
ck_assert_msg(t_data.udp_count == 0, "udp_count != 0");
ck_assert_msg(t_data.tcp_count == 1, "tcp_count != 1");
ck_assert_msg(t_data.tcp_count >= 1, "tcp_count !>= 1");
}
@ -454,12 +460,10 @@ Suite *
getdns_transport_suite(void) {
Suite *s = suite_create("getdns_transport()");
/*TODO: The sync tests will fail if root keys are configured!
* Unbound does DNSSEC even if the extention is not set if
* it has root keys. This seems very inefficient....!
* Need to either unset the root keys during this test
* or detect the correct number of responses based on
* DNS vs DNSSEC.*/
/* Note that the exact number of messages received depends on if a trust
* anchor is configured so these tests just check that no messages are
* received on the wrong transport and at least one is recieved on the
* expected transport */
/* Positive test cases */
TCase *tc_pos = tcase_create("Positive");

View File

@ -83,7 +83,7 @@ main()
getdns_dict_destroy(response);
/* Now switch to TCP and make sure everything works */
getdns_context_set_dns_transport(this_context, GETDNS_TRANSPORT_TCP_ONLY);
getdns_context_set_dns_transport(this_context, GETDNS_TRANSPORT_TCP_ONLY);
ret = getdns_general_sync(this_context, "www.google.com", GETDNS_RRTYPE_A,
NULL, &response);