* allows common code paths to differentiate between them
*/
typedef enum {
+ RECTYPE_NORMAL,
RECTYPE_PREFETCH,
RECTYPE_RPZ,
RECTYPE_COUNT,
* Helper macros for accessing isc_nmhandle_t pointers for a specific recursion
* a given client is associated with.
*/
+#define HANDLE_RECTYPE_NORMAL(client) \
+ ((client)->query.recursions[RECTYPE_NORMAL].handle)
#define HANDLE_RECTYPE_PREFETCH(client) \
((client)->query.recursions[RECTYPE_PREFETCH].handle)
#define HANDLE_RECTYPE_RPZ(client) \
* Helper macros for accessing dns_fetch_t pointers for a specific recursion a
* given client is associated with.
*/
+#define FETCH_RECTYPE_NORMAL(client) \
+ ((client)->query.recursions[RECTYPE_NORMAL].fetch)
#define FETCH_RECTYPE_PREFETCH(client) \
((client)->query.recursions[RECTYPE_PREFETCH].fetch)
#define FETCH_RECTYPE_RPZ(client) \
REQUIRE(NS_CLIENT_VALID(client));
LOCK(&client->query.fetchlock);
- if (client->query.fetch != NULL) {
- dns_resolver_cancelfetch(client->query.fetch);
-
- client->query.fetch = NULL;
+ if (FETCH_RECTYPE_NORMAL(client) != NULL) {
+ dns_resolver_cancelfetch(FETCH_RECTYPE_NORMAL(client));
+ FETCH_RECTYPE_NORMAL(client) = NULL;
}
if (client->query.hookactx != NULL) {
client->query.hookactx->cancel(client->query.hookactx);
qctx->client->query.dboptions &=
~DNS_DBFIND_STALETIMEOUT;
qctx->options &= ~DNS_GETDB_STALEFIRST;
- if (qctx->client->query.fetch != NULL) {
+ if (FETCH_RECTYPE_NORMAL(qctx->client) != NULL)
+ {
dns_resolver_destroyfetch(
- &qctx->client->query.fetch);
+ &FETCH_RECTYPE_NORMAL(
+ qctx->client));
}
return (query_lookup(qctx));
} else {
client->nodetach = false;
LOCK(&client->query.fetchlock);
- INSIST(client->query.fetch == devent->fetch ||
- client->query.fetch == NULL);
+ INSIST(FETCH_RECTYPE_NORMAL(client) == devent->fetch ||
+ FETCH_RECTYPE_NORMAL(client) == NULL);
if (QUERY_STALEPENDING(&client->query)) {
/*
* We've gotten an authoritative answer to a query that
* was left pending after a stale timeout. We don't need
* to do anything with it; free all the data and go home.
*/
- client->query.fetch = NULL;
+ FETCH_RECTYPE_NORMAL(client) = NULL;
fetch_answered = true;
- } else if (client->query.fetch != NULL) {
+ } else if (FETCH_RECTYPE_NORMAL(client) != NULL) {
/*
* This is the fetch we've been waiting for.
*/
- INSIST(devent->fetch == client->query.fetch);
- client->query.fetch = NULL;
+ INSIST(FETCH_RECTYPE_NORMAL(client) == devent->fetch);
+ FETCH_RECTYPE_NORMAL(client) = NULL;
/*
* Update client->now.
}
UNLOCK(&client->manager->reclock);
- isc_nmhandle_detach(&client->fetchhandle);
+ isc_nmhandle_detach(&HANDLE_RECTYPE_NORMAL(client));
client->query.attributes &= ~NS_QUERYATTR_RECURSING;
client->state = NS_CLIENTSTATE_WORKING;
* Invoke the resolver.
*/
REQUIRE(nameservers == NULL || nameservers->type == dns_rdatatype_ns);
- REQUIRE(client->query.fetch == NULL);
+ REQUIRE(FETCH_RECTYPE_NORMAL(client) == NULL);
rdataset = ns_client_newrdataset(client);
client->query.fetchoptions |= DNS_FETCHOPT_TRYSTALE_ONTIMEOUT;
}
- isc_nmhandle_attach(client->handle, &client->fetchhandle);
+ isc_nmhandle_attach(client->handle, &HANDLE_RECTYPE_NORMAL(client));
result = dns_resolver_createfetch(
client->view->resolver, qname, qtype, qdomain, nameservers,
NULL, peeraddr, client->message->id, client->query.fetchoptions,
0, NULL, client->manager->task, fetch_callback, client,
- rdataset, sigrdataset, &client->query.fetch);
+ rdataset, sigrdataset, &FETCH_RECTYPE_NORMAL(client));
if (result != ISC_R_SUCCESS) {
- isc_nmhandle_detach(&client->fetchhandle);
+ isc_nmhandle_detach(&HANDLE_RECTYPE_NORMAL(client));
ns_client_putrdataset(client, &rdataset);
if (sigrdataset != NULL) {
ns_client_putrdataset(client, &sigrdataset);
dns_db_attach(qctx->client->view->cachedb, &qctx->db);
qctx->version = NULL;
qctx->client->query.dboptions |= DNS_DBFIND_STALEOK;
- if (qctx->client->query.fetch != NULL) {
- dns_resolver_destroyfetch(&qctx->client->query.fetch);
+ if (FETCH_RECTYPE_NORMAL(qctx->client) != NULL) {
+ dns_resolver_destroyfetch(
+ &FETCH_RECTYPE_NORMAL(qctx->client));
}
/*