X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fresolve%2Fresolved-dns-question.c;h=45bcbbf23a15f5e2e62ac5996e6f2651826e95f0;hp=026a67d7b37bfeeff98e7e176368ae261e456145;hb=34b9656f0b2890743eee6a746ef08d817abfd5e9;hpb=faa133f3aa7a18f26563dc5d6b95898cb315c37a diff --git a/src/resolve/resolved-dns-question.c b/src/resolve/resolved-dns-question.c index 026a67d7b..45bcbbf23 100644 --- a/src/resolve/resolved-dns-question.c +++ b/src/resolve/resolved-dns-question.c @@ -65,9 +65,20 @@ DnsQuestion *dns_question_unref(DnsQuestion *q) { } int dns_question_add(DnsQuestion *q, DnsResourceKey *key) { + unsigned i; + int r; + assert(q); assert(key); + for (i = 0; i < q->n_keys; i++) { + r = dns_resource_key_equal(q->keys[i], key); + if (r < 0) + return r; + if (r > 0) + return 0; + } + if (q->n_keys >= q->n_allocated) return -ENOSPC; @@ -104,7 +115,7 @@ int dns_question_matches_cname(DnsQuestion *q, DnsResourceRecord *rr) { return r; } - return 1; + return 0; } int dns_question_is_valid(DnsQuestion *q) { @@ -126,6 +137,8 @@ int dns_question_is_valid(DnsQuestion *q) { /* Check that all keys in this question bear the same name */ for (i = 1; i < q->n_keys; i++) { + assert(q->keys[i]); + r = dns_name_equal(DNS_RESOURCE_KEY_NAME(q->keys[i]), name); if (r <= 0) return r; @@ -207,7 +220,7 @@ int dns_question_cname_redirect(DnsQuestion *q, const char *name, DnsQuestion ** return -ENOMEM; /* Create a new question, and patch in the new name */ - for (n->n_keys = 0; n->n_keys < q->n_keys; n->n_keys++) { + for (i = 0; i < q->n_keys; i++) { _cleanup_(dns_resource_key_unrefp) DnsResourceKey *k = NULL; k = dns_resource_key_new(q->keys[i]->class, q->keys[i]->type, name); @@ -224,3 +237,38 @@ int dns_question_cname_redirect(DnsQuestion *q, const char *name, DnsQuestion ** return 1; } + +int dns_question_endswith(DnsQuestion *q, const char *suffix) { + unsigned i; + + assert(q); + assert(suffix); + + for (i = 0; i < q->n_keys; i++) { + int k; + + k = dns_name_endswith(DNS_RESOURCE_KEY_NAME(q->keys[i]), suffix); + if (k <= 0) + return k; + } + + return 1; +} + +int dns_question_extract_reverse_address(DnsQuestion *q, int *family, union in_addr_union *address) { + unsigned i; + + assert(q); + assert(family); + assert(address); + + for (i = 0; i < q->n_keys; i++) { + int k; + + k = dns_name_address(DNS_RESOURCE_KEY_NAME(q->keys[i]), family, address); + if (k != 0) + return k; + } + + return 0; +}