mirror of https://github.com/getdnsapi/getdns.git
Merge pull request #133 from wtoorop/features/stub-only-getdns_query
Features/stub only getdns query
This commit is contained in:
commit
6dba2b98a0
|
@ -2582,11 +2582,18 @@ _getdns_ns_dns_setup(struct getdns_context *context)
|
||||||
if (!context->upstreams || !context->upstreams->count)
|
if (!context->upstreams || !context->upstreams->count)
|
||||||
return GETDNS_RETURN_GENERIC_ERROR;
|
return GETDNS_RETURN_GENERIC_ERROR;
|
||||||
#ifdef STUB_NATIVE_DNSSEC
|
#ifdef STUB_NATIVE_DNSSEC
|
||||||
#ifdef DNSSEC_ROADBLOCK_AVOIDANCE
|
# ifdef DNSSEC_ROADBLOCK_AVOIDANCE
|
||||||
|
# ifdef HAVE_LIBUNBOUND
|
||||||
return ub_setup_recursing(context->unbound_ctx, context);
|
return ub_setup_recursing(context->unbound_ctx, context);
|
||||||
#else
|
# else
|
||||||
|
/* Return NOT_IMPLEMENTED on query with an
|
||||||
|
* roadblock avoidance extension.
|
||||||
|
*/
|
||||||
return GETDNS_RETURN_GOOD;
|
return GETDNS_RETURN_GOOD;
|
||||||
#endif
|
# endif
|
||||||
|
# else
|
||||||
|
return GETDNS_RETURN_GOOD;
|
||||||
|
# endif
|
||||||
#else
|
#else
|
||||||
return ub_setup_stub(context->unbound_ctx, context);
|
return ub_setup_stub(context->unbound_ctx, context);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -38,13 +38,14 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
#include "general.h"
|
||||||
#include "gldns/wire2str.h"
|
#include "gldns/wire2str.h"
|
||||||
#include "context.h"
|
#include "context.h"
|
||||||
#include "types-internal.h"
|
#include "types-internal.h"
|
||||||
#include "util-internal.h"
|
#include "util-internal.h"
|
||||||
#include "dnssec.h"
|
#include "dnssec.h"
|
||||||
#include "stub.h"
|
#include "stub.h"
|
||||||
#include "general.h"
|
#include "dict.h"
|
||||||
|
|
||||||
/* cancel, cleanup and send timeout to callback */
|
/* cancel, cleanup and send timeout to callback */
|
||||||
static void
|
static void
|
||||||
|
@ -330,6 +331,84 @@ _getdns_submit_netreq(getdns_network_req *netreq)
|
||||||
return _getdns_submit_stub_request(netreq);
|
return _getdns_submit_stub_request(netreq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* structure used by validate_extensions() to check extension formats
|
||||||
|
*/
|
||||||
|
typedef struct getdns_extension_format
|
||||||
|
{
|
||||||
|
char *extstring;
|
||||||
|
getdns_data_type exttype;
|
||||||
|
int implemented;
|
||||||
|
} getdns_extension_format;
|
||||||
|
|
||||||
|
static int
|
||||||
|
extformatcmp(const void *a, const void *b)
|
||||||
|
{
|
||||||
|
return strcmp(((getdns_extension_format *) a)->extstring,
|
||||||
|
((getdns_extension_format *) b)->extstring);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------- validate_extensions */
|
||||||
|
static getdns_return_t
|
||||||
|
validate_extensions(struct getdns_dict * extensions)
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* this is a comprehensive list of extensions and their data types
|
||||||
|
* used by validate_extensions()
|
||||||
|
* The list has to be in sorted order for bsearch lookup in function
|
||||||
|
* validate_extensions.
|
||||||
|
*/
|
||||||
|
static getdns_extension_format extformats[] = {
|
||||||
|
{"add_opt_parameters" , t_dict, 1},
|
||||||
|
{"add_warning_for_bad_dns" , t_int , 1},
|
||||||
|
{"dnssec_return_only_secure" , t_int , 1},
|
||||||
|
{"dnssec_return_status" , t_int , 1},
|
||||||
|
{"dnssec_return_validation_chain", t_int , 1},
|
||||||
|
{"dnssec_roadblock_avoidance" , t_int ,
|
||||||
|
#if defined(DNSSEC_ROADBLOCK_AVOIDANCE) && defined(HAVE_LIBUNBOUND)
|
||||||
|
1},
|
||||||
|
#else
|
||||||
|
0},
|
||||||
|
#endif
|
||||||
|
{"edns_cookies" , t_int ,
|
||||||
|
#ifdef EDNS_COOKIES
|
||||||
|
1},
|
||||||
|
#else
|
||||||
|
0},
|
||||||
|
#endif
|
||||||
|
{"return_api_information" , t_int , 1},
|
||||||
|
{"return_both_v4_and_v6" , t_int , 1},
|
||||||
|
{"return_call_reporting" , t_int , 1},
|
||||||
|
{"specify_class" , t_int , 1},
|
||||||
|
};
|
||||||
|
|
||||||
|
struct getdns_dict_item *item;
|
||||||
|
getdns_extension_format *extformat;
|
||||||
|
|
||||||
|
if (extensions)
|
||||||
|
RBTREE_FOR(item, struct getdns_dict_item *,
|
||||||
|
&(extensions->root)) {
|
||||||
|
|
||||||
|
getdns_extension_format key;
|
||||||
|
key.extstring = (char *) item->node.key;
|
||||||
|
extformat = bsearch(&key, extformats,
|
||||||
|
sizeof(extformats) /
|
||||||
|
sizeof(getdns_extension_format),
|
||||||
|
sizeof(getdns_extension_format), extformatcmp);
|
||||||
|
if (!extformat)
|
||||||
|
return GETDNS_RETURN_NO_SUCH_EXTENSION;
|
||||||
|
|
||||||
|
if (!extformat->implemented)
|
||||||
|
return GETDNS_RETURN_NOT_IMPLEMENTED;
|
||||||
|
|
||||||
|
if (item->i.dtype != extformat->exttype)
|
||||||
|
return GETDNS_RETURN_EXTENSION_MISFORMAT;
|
||||||
|
}
|
||||||
|
return GETDNS_RETURN_GOOD;
|
||||||
|
} /* _getdns_validate_extensions */
|
||||||
|
|
||||||
|
|
||||||
static getdns_return_t
|
static getdns_return_t
|
||||||
getdns_general_ns(getdns_context *context, getdns_eventloop *loop,
|
getdns_general_ns(getdns_context *context, getdns_eventloop *loop,
|
||||||
const char *name, uint16_t request_type, getdns_dict *extensions,
|
const char *name, uint16_t request_type, getdns_dict *extensions,
|
||||||
|
@ -348,7 +427,7 @@ getdns_general_ns(getdns_context *context, getdns_eventloop *loop,
|
||||||
if ((r = _getdns_validate_dname(name)))
|
if ((r = _getdns_validate_dname(name)))
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
if (extensions && (r = _getdns_validate_extensions(extensions)))
|
if (extensions && (r = validate_extensions(extensions)))
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
/* Set up the context assuming we won't use the specified namespaces.
|
/* Set up the context assuming we won't use the specified namespaces.
|
||||||
|
|
|
@ -458,7 +458,13 @@ print_usage(FILE *out, const char *progname)
|
||||||
{
|
{
|
||||||
fprintf(out, "usage: %s [<option> ...] \\\n"
|
fprintf(out, "usage: %s [<option> ...] \\\n"
|
||||||
"\t\t[@<upstream> ...] [+<extension> ...] [<name>] [<type>]\n", progname);
|
"\t\t[@<upstream> ...] [+<extension> ...] [<name>] [<type>]\n", progname);
|
||||||
fprintf(out, "\ndefault mode: recursive, synchronous resolution of NS record using UDP with TCP fallback\n");
|
fprintf(out, "\ndefault mode: "
|
||||||
|
#ifdef HAVE_LIBUNBOUND
|
||||||
|
"recursive"
|
||||||
|
#else
|
||||||
|
"stub"
|
||||||
|
#endif
|
||||||
|
", synchronous resolution of NS record using UDP with TCP fallback\n");
|
||||||
fprintf(out, "\nupstreams: @<ip>[%%<scope_id>][@<port>][#<tls port>][~<tls name>][^<tsig spec>]\n");
|
fprintf(out, "\nupstreams: @<ip>[%%<scope_id>][@<port>][#<tls port>][~<tls name>][^<tsig spec>]\n");
|
||||||
fprintf(out, "\ntsig spec: [<algorithm>:]<name>:<secret in Base64>\n");
|
fprintf(out, "\ntsig spec: [<algorithm>:]<name>:<secret in Base64>\n");
|
||||||
fprintf(out, "\nextensions:\n");
|
fprintf(out, "\nextensions:\n");
|
||||||
|
|
|
@ -160,15 +160,6 @@ typedef enum network_req_state_enum
|
||||||
NET_REQ_CANCELED
|
NET_REQ_CANCELED
|
||||||
} network_req_state;
|
} network_req_state;
|
||||||
|
|
||||||
/**
|
|
||||||
* structure used by validate_extensions() to check extension formats
|
|
||||||
*/
|
|
||||||
typedef struct getdns_extension_format
|
|
||||||
{
|
|
||||||
char *extstring;
|
|
||||||
getdns_data_type exttype;
|
|
||||||
} getdns_extension_format;
|
|
||||||
|
|
||||||
|
|
||||||
/* State for async tcp stub resolving */
|
/* State for async tcp stub resolving */
|
||||||
typedef struct getdns_tcp_state {
|
typedef struct getdns_tcp_state {
|
||||||
|
|
|
@ -52,30 +52,6 @@
|
||||||
#include "gldns/gbuffer.h"
|
#include "gldns/gbuffer.h"
|
||||||
#include "gldns/pkthdr.h"
|
#include "gldns/pkthdr.h"
|
||||||
|
|
||||||
/**
|
|
||||||
* this is a comprehensive list of extensions and their data types
|
|
||||||
* used by validate_extensions()
|
|
||||||
* The list has to be in sorted order for bsearch lookup in function
|
|
||||||
* validate_extensions.
|
|
||||||
*/
|
|
||||||
static getdns_extension_format extformats[] = {
|
|
||||||
{"add_opt_parameters", t_dict},
|
|
||||||
{"add_warning_for_bad_dns", t_int},
|
|
||||||
{"dnssec_return_only_secure", t_int},
|
|
||||||
{"dnssec_return_status", t_int},
|
|
||||||
{"dnssec_return_validation_chain", t_int},
|
|
||||||
#ifdef DNSSEC_ROADBLOCK_AVOIDANCE
|
|
||||||
{"dnssec_roadblock_avoidance", t_int},
|
|
||||||
#endif
|
|
||||||
#ifdef EDNS_COOKIES
|
|
||||||
{"edns_cookies", t_int},
|
|
||||||
#endif
|
|
||||||
{"return_api_information", t_int},
|
|
||||||
{"return_both_v4_and_v6", t_int},
|
|
||||||
{"return_call_reporting", t_int},
|
|
||||||
{"specify_class", t_int},
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
getdns_return_t
|
getdns_return_t
|
||||||
getdns_dict_util_get_string(struct getdns_dict * dict, char *name, char **result)
|
getdns_dict_util_get_string(struct getdns_dict * dict, char *name, char **result)
|
||||||
|
@ -1040,38 +1016,6 @@ error_free_result:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
extformatcmp(const void *a, const void *b)
|
|
||||||
{
|
|
||||||
return strcmp(((getdns_extension_format *) a)->extstring,
|
|
||||||
((getdns_extension_format *) b)->extstring);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*---------------------------------------- validate_extensions */
|
|
||||||
getdns_return_t
|
|
||||||
_getdns_validate_extensions(struct getdns_dict * extensions)
|
|
||||||
{
|
|
||||||
struct getdns_dict_item *item;
|
|
||||||
getdns_extension_format *extformat;
|
|
||||||
|
|
||||||
if (extensions)
|
|
||||||
RBTREE_FOR(item, struct getdns_dict_item *,
|
|
||||||
&(extensions->root)) {
|
|
||||||
|
|
||||||
getdns_extension_format key;
|
|
||||||
key.extstring = (char *) item->node.key;
|
|
||||||
extformat = bsearch(&key, extformats,
|
|
||||||
sizeof(extformats) /
|
|
||||||
sizeof(getdns_extension_format),
|
|
||||||
sizeof(getdns_extension_format), extformatcmp);
|
|
||||||
if (!extformat)
|
|
||||||
return GETDNS_RETURN_NO_SUCH_EXTENSION;
|
|
||||||
|
|
||||||
if (item->i.dtype != extformat->exttype)
|
|
||||||
return GETDNS_RETURN_EXTENSION_MISFORMAT;
|
|
||||||
}
|
|
||||||
return GETDNS_RETURN_GOOD;
|
|
||||||
} /* _getdns_validate_extensions */
|
|
||||||
|
|
||||||
#ifdef HAVE_LIBUNBOUND
|
#ifdef HAVE_LIBUNBOUND
|
||||||
getdns_return_t
|
getdns_return_t
|
||||||
|
|
Loading…
Reference in New Issue