mirror of https://github.com/getdnsapi/getdns.git
Organise code in stub.c and add some utility methods.
This commit is contained in:
parent
d6d83b219d
commit
01adce8299
112
src/context.c
112
src/context.c
|
@ -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)
|
||||||
|
|
|
@ -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
1265
src/stub.c
File diff suppressed because it is too large
Load Diff
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue