Organise code in stub.c and add some utility methods.

This commit is contained in:
Sara Dickinson 2015-05-02 18:08:45 +01:00
parent d6d83b219d
commit 01adce8299
4 changed files with 740 additions and 643 deletions

View File

@ -703,6 +703,7 @@ set_os_defaults(struct getdns_context *context)
upstream = &context->upstreams-> upstream = &context->upstreams->
upstreams[context->upstreams->count++]; upstreams[context->upstreams->count++];
fprintf(stderr, "[TLS]: OS: creating upstream %d, %p, with port %s with transport %d\n", (int)context->upstreams->count, (void*)upstream, port_str, base_transport);
upstream_init(upstream, context->upstreams, result); upstream_init(upstream, context->upstreams, result);
upstream->dns_base_transport = base_transport; upstream->dns_base_transport = base_transport;
} }
@ -1487,6 +1488,7 @@ getdns_context_set_upstream_recursive_servers(struct getdns_context *context,
getdns_return_t r; getdns_return_t r;
size_t count = 0; size_t count = 0;
size_t i; size_t i;
//size_t upstreams_limit;
getdns_upstreams *upstreams; getdns_upstreams *upstreams;
char addrstr[1024], portstr[1024], *eos; char addrstr[1024], portstr[1024], *eos;
struct addrinfo hints; struct addrinfo hints;
@ -1507,70 +1509,84 @@ getdns_context_set_upstream_recursive_servers(struct getdns_context *context,
hints.ai_addr = NULL; hints.ai_addr = NULL;
hints.ai_next = NULL; hints.ai_next = NULL;
/* TODO[TLS]: Resize on the fly to avoid hardcoding this*/
upstreams = upstreams_create(context, count*3); upstreams = upstreams_create(context, count*3);
//upstreams_limit = count;
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
getdns_dict *dict;
getdns_bindata *address_type;
getdns_bindata *address_data;
struct sockaddr_storage addr;
getdns_bindata *scope_id;
getdns_upstream *upstream;
if ((r = getdns_list_get_dict(upstream_list, i, &dict)))
goto error;
if ((r = getdns_dict_get_bindata(
dict, "address_type",&address_type)))
goto error;
if (address_type->size < 4)
goto invalid_parameter;
if (strncmp((char *)address_type->data, "IPv4", 4) == 0)
addr.ss_family = AF_INET;
else if (strncmp((char *)address_type->data, "IPv6", 4) == 0)
addr.ss_family = AF_INET6;
else goto invalid_parameter;
if ((r = getdns_dict_get_bindata(
dict, "address_data", &address_data)))
goto error;
if ((addr.ss_family == AF_INET &&
address_data->size != 4) ||
(addr.ss_family == AF_INET6 &&
address_data->size != 16))
goto invalid_parameter;
if (inet_ntop(addr.ss_family, address_data->data,
addrstr, 1024) == NULL)
goto invalid_parameter;
if (getdns_dict_get_bindata(dict, "scope_id", &scope_id) ==
GETDNS_RETURN_GOOD) {
if (strlen(addrstr) + scope_id->size > 1022)
goto invalid_parameter;
eos = &addrstr[strlen(addrstr)];
*eos++ = '%';
(void) memcpy(eos, scope_id->data, scope_id->size);
eos[scope_id->size] = 0;
}
/* Loop to create upstreams as needed*/ /* Loop to create upstreams as needed*/
getdns_base_transport_t base_transport = GETDNS_BASE_TRANSPORT_MIN; getdns_base_transport_t base_transport = GETDNS_BASE_TRANSPORT_MIN;
for (; base_transport < GETDNS_BASE_TRANSPORT_MAX; base_transport++) { for (; base_transport < GETDNS_BASE_TRANSPORT_MAX; base_transport++) {
getdns_dict *dict;
getdns_bindata *address_type;
getdns_bindata *address_data;
uint32_t port; uint32_t port;
getdns_bindata *scope_id;
struct addrinfo *ai; struct addrinfo *ai;
getdns_upstream *upstream;
port = getdns_port_array[base_transport]; port = getdns_port_array[base_transport];
if (port == GETDNS_PORT_ZERO) if (port == GETDNS_PORT_ZERO)
continue; continue;
upstream = &upstreams->upstreams[upstreams->count]; /* TODO[TLS]:Respect the user port for TCP and STARTTLS, but for
if ((r = getdns_list_get_dict(upstream_list, i, &dict))) * now hardcode the TLS port */
goto error; if (base_transport != GETDNS_BASE_TRANSPORT_TLS)
(void) getdns_dict_get_int(dict, "port", &port);
if ((r = getdns_dict_get_bindata(
dict, "address_type",&address_type)))
goto error;
if (address_type->size < 4)
goto invalid_parameter;
if (strncmp((char *)address_type->data, "IPv4", 4) == 0)
upstream->addr.ss_family = AF_INET;
else if (strncmp((char *)address_type->data, "IPv6", 4) == 0)
upstream->addr.ss_family = AF_INET6;
else goto invalid_parameter;
if ((r = getdns_dict_get_bindata(
dict, "address_data", &address_data)))
goto error;
if ((upstream->addr.ss_family == AF_INET &&
address_data->size != 4) ||
(upstream->addr.ss_family == AF_INET6 &&
address_data->size != 16))
goto invalid_parameter;
if (inet_ntop(upstream->addr.ss_family, address_data->data,
addrstr, 1024) == NULL)
goto invalid_parameter;
(void) getdns_dict_get_int(dict, "port", &port);
(void) snprintf(portstr, 1024, "%d", (int)port); (void) snprintf(portstr, 1024, "%d", (int)port);
if (getdns_dict_get_bindata(dict, "scope_id", &scope_id) ==
GETDNS_RETURN_GOOD) {
if (strlen(addrstr) + scope_id->size > 1022)
goto invalid_parameter;
eos = &addrstr[strlen(addrstr)];
*eos++ = '%';
(void) memcpy(eos, scope_id->data, scope_id->size);
eos[scope_id->size] = 0;
}
if (getaddrinfo(addrstr, portstr, &hints, &ai)) if (getaddrinfo(addrstr, portstr, &hints, &ai))
goto invalid_parameter; goto invalid_parameter;
/* TODO[TLS]: Should probably check that the upstream doesn't /* TODO[TLS]: Should probably check that the upstream doesn't
* already exist (in case user has specified port explicitly)*/ * already exist (in case user has specified TLS port explicitly and
* to prevent duplicates) */
/* TODO[TLS]: Grow array when needed. This causes a crash later....
if (upstreams->count == upstreams_limit)
upstreams = upstreams_resize(
upstreams, (upstreams_limit *= 2)); */
upstream = &upstreams->upstreams[upstreams->count];
upstream->addr.ss_family = addr.ss_family;
upstream_init(upstream, upstreams, ai); upstream_init(upstream, upstreams, ai);
fprintf(stderr, "[TLS]: creating upstream %d, %p, with port %d with transport %d\n", (int)upstreams->count, (void*)upstream,(int)port, base_transport);
upstream->dns_base_transport = base_transport; upstream->dns_base_transport = base_transport;
upstreams->count++; upstreams->count++;
freeaddrinfo(ai); freeaddrinfo(ai);
@ -1912,8 +1928,8 @@ getdns_context_prepare_for_resolution(struct getdns_context *context,
} }
/* Block use of TLS ONLY in recursive mode as it won't work */ /* Block use of TLS ONLY in recursive mode as it won't work */
/* TODO[TLS]: Check if TLS is the only option in the list*/ /* TODO[TLS]: Check if TLS is the only option in the list*/
if (context->resolution_type == GETDNS_RESOLUTION_RECURSING if (context->resolution_type == GETDNS_RESOLUTION_RECURSING &&
&& context->dns_transport == GETDNS_TRANSPORT_TLS_ONLY_KEEP_CONNECTIONS_OPEN) context->dns_transport == GETDNS_TRANSPORT_TLS_ONLY_KEEP_CONNECTIONS_OPEN)
return GETDNS_RETURN_BAD_CONTEXT; return GETDNS_RETURN_BAD_CONTEXT;
if (context->resolution_type_set == context->resolution_type) if (context->resolution_type_set == context->resolution_type)

View File

@ -91,7 +91,7 @@ network_req_init(getdns_network_req *net_req, getdns_dns_req *owner,
net_req->fd = -1; net_req->fd = -1;
for (i = 0; i < GETDNS_BASE_TRANSPORT_MAX; i++) for (i = 0; i < GETDNS_BASE_TRANSPORT_MAX; i++)
net_req->dns_base_transports[i] = owner->context->dns_base_transports[i]; net_req->dns_base_transports[i] = owner->context->dns_base_transports[i];
net_req->dns_base_transport = net_req->dns_base_transports; net_req->transport = 0;
memset(&net_req->event, 0, sizeof(net_req->event)); memset(&net_req->event, 0, sizeof(net_req->event));
memset(&net_req->tcp, 0, sizeof(net_req->tcp)); memset(&net_req->tcp, 0, sizeof(net_req->tcp));
net_req->query_id = 0; net_req->query_id = 0;

1265
src/stub.c

File diff suppressed because it is too large Load Diff

View File

@ -169,7 +169,7 @@ typedef enum getdns_base_transport {
GETDNS_BASE_TRANSPORT_NONE = 0, GETDNS_BASE_TRANSPORT_NONE = 0,
GETDNS_BASE_TRANSPORT_UDP, GETDNS_BASE_TRANSPORT_UDP,
GETDNS_BASE_TRANSPORT_TCP_SINGLE, /* To be removed? */ GETDNS_BASE_TRANSPORT_TCP_SINGLE, /* To be removed? */
GETDNS_BASE_TRANSPORT_STARTTLS, /* Define before TCP to allow fallback when scheduling*/ GETDNS_BASE_TRANSPORT_STARTTLS, /* Define before TCP to allow fallback */
GETDNS_BASE_TRANSPORT_TCP, GETDNS_BASE_TRANSPORT_TCP,
GETDNS_BASE_TRANSPORT_TLS, GETDNS_BASE_TRANSPORT_TLS,
GETDNS_BASE_TRANSPORT_MAX GETDNS_BASE_TRANSPORT_MAX
@ -203,7 +203,7 @@ typedef struct getdns_network_req
struct getdns_upstream *upstream; struct getdns_upstream *upstream;
int fd; int fd;
getdns_base_transport_t dns_base_transports[GETDNS_BASE_TRANSPORT_MAX]; getdns_base_transport_t dns_base_transports[GETDNS_BASE_TRANSPORT_MAX];
getdns_base_transport_t *dns_base_transport; int transport;
getdns_eventloop_event event; getdns_eventloop_event event;
getdns_tcp_state tcp; getdns_tcp_state tcp;
uint16_t query_id; uint16_t query_id;