resolved: respond to ANY queries from our zone
This commit is contained in:
parent
0e2bcd6a17
commit
d532366133
|
@ -194,9 +194,9 @@ int dns_zone_put(DnsZone *z, DnsResourceRecord *rr) {
|
||||||
|
|
||||||
int dns_zone_lookup(DnsZone *z, DnsQuestion *q, DnsAnswer **ret) {
|
int dns_zone_lookup(DnsZone *z, DnsQuestion *q, DnsAnswer **ret) {
|
||||||
_cleanup_(dns_answer_unrefp) DnsAnswer *answer = NULL;
|
_cleanup_(dns_answer_unrefp) DnsAnswer *answer = NULL;
|
||||||
int r;
|
|
||||||
unsigned i, n = 0;
|
|
||||||
bool has_other_rrs = false;
|
bool has_other_rrs = false;
|
||||||
|
unsigned i, n = 0;
|
||||||
|
int r;
|
||||||
|
|
||||||
assert(z);
|
assert(z);
|
||||||
assert(q);
|
assert(q);
|
||||||
|
@ -210,16 +210,39 @@ int dns_zone_lookup(DnsZone *z, DnsQuestion *q, DnsAnswer **ret) {
|
||||||
for (i = 0; i < q->n_keys; i++) {
|
for (i = 0; i < q->n_keys; i++) {
|
||||||
DnsZoneItem *j;
|
DnsZoneItem *j;
|
||||||
|
|
||||||
j = hashmap_get(z->by_key, q->keys[i]);
|
if (q->keys[i]->type == DNS_TYPE_ANY ||
|
||||||
if (!j) {
|
q->keys[i]->class == DNS_CLASS_ANY) {
|
||||||
if (hashmap_get(z->by_name, DNS_RESOURCE_KEY_NAME(q->keys[i])))
|
int k;
|
||||||
|
|
||||||
|
/* If this is a generic match, then we have to
|
||||||
|
* go through the list by the name and look
|
||||||
|
* for everything manually */
|
||||||
|
|
||||||
|
j = hashmap_get(z->by_name, DNS_RESOURCE_KEY_NAME(q->keys[i]));
|
||||||
|
LIST_FOREACH(by_name, j, j) {
|
||||||
has_other_rrs = true;
|
has_other_rrs = true;
|
||||||
|
|
||||||
continue;
|
k = dns_resource_key_match_rr(q->keys[i], j->rr);
|
||||||
}
|
if (k < 0)
|
||||||
|
return k;
|
||||||
|
if (k == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
LIST_FOREACH(by_name, j, j)
|
n++;
|
||||||
n++;
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
j = hashmap_get(z->by_key, q->keys[i]);
|
||||||
|
if (!j) {
|
||||||
|
if (hashmap_get(z->by_name, DNS_RESOURCE_KEY_NAME(q->keys[i])))
|
||||||
|
has_other_rrs = true;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
LIST_FOREACH(by_key, j, j)
|
||||||
|
n++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n <= 0) {
|
if (n <= 0) {
|
||||||
|
@ -234,11 +257,30 @@ int dns_zone_lookup(DnsZone *z, DnsQuestion *q, DnsAnswer **ret) {
|
||||||
for (i = 0; i < q->n_keys; i++) {
|
for (i = 0; i < q->n_keys; i++) {
|
||||||
DnsZoneItem *j;
|
DnsZoneItem *j;
|
||||||
|
|
||||||
j = hashmap_get(z->by_key, q->keys[i]);
|
if (q->keys[i]->type == DNS_TYPE_ANY ||
|
||||||
LIST_FOREACH(by_key, j, j) {
|
q->keys[i]->class == DNS_CLASS_ANY) {
|
||||||
r = dns_answer_add(answer, j->rr);
|
int k;
|
||||||
if (r < 0)
|
|
||||||
return r;
|
j = hashmap_get(z->by_name, DNS_RESOURCE_KEY_NAME(q->keys[i]));
|
||||||
|
LIST_FOREACH(by_name, j, j) {
|
||||||
|
k = dns_resource_key_match_rr(q->keys[i], j->rr);
|
||||||
|
if (k < 0)
|
||||||
|
return k;
|
||||||
|
if (k == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
r = dns_answer_add(answer, j->rr);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
|
j = hashmap_get(z->by_key, q->keys[i]);
|
||||||
|
LIST_FOREACH(by_key, j, j) {
|
||||||
|
r = dns_answer_add(answer, j->rr);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue