mirror of https://github.com/getdnsapi/getdns.git
Stub resolving with the libmini_event extension
This commit is contained in:
parent
21bb7d6197
commit
3ee930d44e
69
src/stub.c
69
src/stub.c
|
@ -41,12 +41,12 @@
|
||||||
#include "util-internal.h"
|
#include "util-internal.h"
|
||||||
#include "gldns/gbuffer.h"
|
#include "gldns/gbuffer.h"
|
||||||
#include "gldns/wire2str.h"
|
#include "gldns/wire2str.h"
|
||||||
#include "util/mini_event.h"
|
#include "extension/libmini_event.h"
|
||||||
|
|
||||||
#define STUBDEBUG 1
|
#define STUBDEBUG 1
|
||||||
|
|
||||||
typedef struct stub_resolver {
|
typedef struct stub_resolver {
|
||||||
struct getdns_event_base *base;
|
getdns_eventloop *ext;
|
||||||
getdns_context *context;
|
getdns_context *context;
|
||||||
getdns_upstreams *upstreams;
|
getdns_upstreams *upstreams;
|
||||||
const char *name;
|
const char *name;
|
||||||
|
@ -61,31 +61,25 @@ typedef struct stub_resolver {
|
||||||
size_t ns_index;
|
size_t ns_index;
|
||||||
size_t to_retry;
|
size_t to_retry;
|
||||||
int udp_fd;
|
int udp_fd;
|
||||||
|
|
||||||
|
getdns_eventloop_event event;
|
||||||
} stub_resolver;
|
} stub_resolver;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
resolver_done(stub_resolver *resolver)
|
udp_request_timeout_cb(void *arg)
|
||||||
{
|
{
|
||||||
(void) getdns_event_base_loopexit(resolver->base, NULL);
|
stub_resolver *resolver = (stub_resolver *)arg;
|
||||||
|
resolver->ext->vmt->clear(resolver->ext, &resolver->event);
|
||||||
if (--resolver->upstreams->referenced == 0)
|
fprintf(stderr, "TIMEOUT!\n");
|
||||||
GETDNS_FREE(resolver->upstreams->mf, resolver->upstreams);
|
|
||||||
GETDNS_FREE(resolver->context->mf, resolver);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cb_udp_request(int fd, short bits, void *arg)
|
udp_request_read_cb(void *arg)
|
||||||
{
|
{
|
||||||
stub_resolver *resolver = (stub_resolver *)arg;
|
stub_resolver *resolver = (stub_resolver *)arg;
|
||||||
ssize_t read;
|
ssize_t read;
|
||||||
|
|
||||||
if (bits & EV_TIMEOUT) {
|
resolver->ext->vmt->clear(resolver->ext, &resolver->event);
|
||||||
fprintf(stderr, "TIMEOUT!\n");
|
|
||||||
resolver_done(resolver);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (! (bits & EV_READ))
|
|
||||||
return;
|
|
||||||
|
|
||||||
read = recvfrom(resolver->udp_fd,
|
read = recvfrom(resolver->udp_fd,
|
||||||
gldns_buffer_current(resolver->response),
|
gldns_buffer_current(resolver->response),
|
||||||
|
@ -106,7 +100,6 @@ cb_udp_request(int fd, short bits, void *arg)
|
||||||
free(str);
|
free(str);
|
||||||
} while(0);
|
} while(0);
|
||||||
#endif
|
#endif
|
||||||
resolver_done(resolver);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static getdns_return_t
|
static getdns_return_t
|
||||||
|
@ -114,8 +107,6 @@ query_ns(stub_resolver *resolver)
|
||||||
{
|
{
|
||||||
struct getdns_upstream *upstream;
|
struct getdns_upstream *upstream;
|
||||||
ssize_t sent;
|
ssize_t sent;
|
||||||
struct timeval tv;
|
|
||||||
struct getdns_event *ev;
|
|
||||||
|
|
||||||
assert(resolver);
|
assert(resolver);
|
||||||
|
|
||||||
|
@ -141,18 +132,18 @@ query_ns(stub_resolver *resolver)
|
||||||
if (sent == -1 || sent != resolver->request_pkt_len)
|
if (sent == -1 || sent != resolver->request_pkt_len)
|
||||||
return GETDNS_RETURN_GENERIC_ERROR;
|
return GETDNS_RETURN_GENERIC_ERROR;
|
||||||
|
|
||||||
ev = GETDNS_MALLOC(resolver->context->mf, struct getdns_event);
|
resolver->event.userarg = resolver;
|
||||||
getdns_event_set(ev, resolver->udp_fd, EV_READ | EV_TIMEOUT, cb_udp_request, resolver);
|
resolver->event.read_cb = udp_request_read_cb;
|
||||||
(void) getdns_event_base_set(resolver->base, ev);
|
resolver->event.write_cb = NULL;
|
||||||
tv.tv_sec = resolver->context->timeout / 1000;
|
resolver->event.timeout_cb = udp_request_timeout_cb;
|
||||||
tv.tv_usec = (resolver->context->timeout % 1000) * 1000;
|
resolver->ext->vmt->schedule(resolver->ext, resolver->udp_fd,
|
||||||
(void) getdns_event_add(ev, &tv);
|
resolver->context->timeout, &resolver->event);
|
||||||
|
|
||||||
return GETDNS_RETURN_GOOD;
|
return GETDNS_RETURN_GOOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
getdns_return_t
|
getdns_return_t
|
||||||
getdns_stub_dns_query_async(struct getdns_event_base *base,
|
getdns_stub_dns_query_async(struct getdns_eventloop *ext,
|
||||||
getdns_context *context, const char *name, uint16_t request_type,
|
getdns_context *context, const char *name, uint16_t request_type,
|
||||||
getdns_dict *extensions, gldns_buffer *response)
|
getdns_dict *extensions, gldns_buffer *response)
|
||||||
{
|
{
|
||||||
|
@ -163,7 +154,7 @@ getdns_stub_dns_query_async(struct getdns_event_base *base,
|
||||||
if (! resolver)
|
if (! resolver)
|
||||||
return GETDNS_RETURN_MEMORY_ERROR;
|
return GETDNS_RETURN_MEMORY_ERROR;
|
||||||
|
|
||||||
resolver->base = base;
|
resolver->ext = ext;
|
||||||
resolver->context = context;
|
resolver->context = context;
|
||||||
resolver->upstreams = context->upstreams;
|
resolver->upstreams = context->upstreams;
|
||||||
resolver->upstreams->referenced++;
|
resolver->upstreams->referenced++;
|
||||||
|
@ -201,25 +192,21 @@ getdns_stub_dns_query_sync(
|
||||||
getdns_context *context, const char *name, uint16_t request_type,
|
getdns_context *context, const char *name, uint16_t request_type,
|
||||||
getdns_dict *extensions, gldns_buffer *response)
|
getdns_dict *extensions, gldns_buffer *response)
|
||||||
{
|
{
|
||||||
time_t time_secs;
|
getdns_return_t r;
|
||||||
struct timeval time_tv;
|
getdns_mini_event mini_event;
|
||||||
struct getdns_event_base *base;
|
getdns_eventloop *ext = &mini_event.loop;
|
||||||
getdns_return_t r = GETDNS_RETURN_GOOD;
|
|
||||||
|
|
||||||
base = getdns_event_init(&time_secs, &time_tv);
|
r = getdns_mini_event_init(context, &mini_event);
|
||||||
if (! base)
|
if (r)
|
||||||
return GETDNS_RETURN_MEMORY_ERROR;
|
return r;
|
||||||
|
|
||||||
r = getdns_stub_dns_query_async(base, context, name, request_type,
|
r = getdns_stub_dns_query_async(ext, context, name, request_type,
|
||||||
extensions, response);
|
extensions, response);
|
||||||
if (r)
|
if (r)
|
||||||
goto done;
|
return r;
|
||||||
|
|
||||||
if (getdns_event_base_dispatch(base))
|
ext->vmt->run(ext);
|
||||||
r = GETDNS_RETURN_GENERIC_ERROR;
|
return GETDNS_RETURN_GOOD;
|
||||||
done:
|
|
||||||
getdns_event_base_free(base);
|
|
||||||
return r;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
Loading…
Reference in New Issue