]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
answer: minor refactor – move link local check into RR code
authorLennart Poettering <lennart@poettering.net>
Thu, 5 Nov 2020 12:34:22 +0000 (13:34 +0100)
committerLennart Poettering <lennart@poettering.net>
Sun, 14 Feb 2021 14:43:01 +0000 (15:43 +0100)
src/resolve/resolved-dns-answer.c
src/resolve/resolved-dns-rr.c
src/resolve/resolved-dns-rr.h

index 8591ed0f3b07c200e864c55f92053b65dd8fa521..7746cb08ea5d5a570ae0cae90ebe5098654762e3 100644 (file)
@@ -713,10 +713,7 @@ void dns_answer_order_by_scope(DnsAnswer *a, bool prefer_link_local) {
 
         items = newa(DnsAnswerItem, a->n_rrs);
         for (i = 0; i < a->n_rrs; i++) {
-
-                if (a->items[i].rr->key->class == DNS_CLASS_IN &&
-                    ((a->items[i].rr->key->type == DNS_TYPE_A && in_addr_is_link_local(AF_INET, (union in_addr_union*) &a->items[i].rr->a.in_addr) != prefer_link_local) ||
-                     (a->items[i].rr->key->type == DNS_TYPE_AAAA && in_addr_is_link_local(AF_INET6, (union in_addr_union*) &a->items[i].rr->aaaa.in6_addr) != prefer_link_local)))
+                if (dns_resource_record_is_link_local_address(a->items[i].rr) != prefer_link_local)
                         /* Order address records that are not preferred to the end of the array */
                         items[end--] = a->items[i];
                 else
index 19e075479f75ba58cfc8d337924f0098c5414b68..9e64c6dd31115ecc156a9325861f35ec36541a51 100644 (file)
@@ -1721,6 +1721,20 @@ int dns_resource_record_clamp_ttl(DnsResourceRecord **rr, uint32_t max_ttl) {
         return 1;
 }
 
+bool dns_resource_record_is_link_local_address(DnsResourceRecord *rr) {
+
+        if (rr->key->class != DNS_CLASS_IN)
+                return false;
+
+        if (rr->key->type == DNS_TYPE_A)
+                return in4_addr_is_link_local(&rr->a.in_addr);
+
+        if (rr->key->type == DNS_TYPE_AAAA)
+                return IN6_IS_ADDR_LINKLOCAL(&rr->aaaa.in6_addr);
+
+        return false;
+}
+
 DnsTxtItem *dns_txt_item_free_all(DnsTxtItem *i) {
         DnsTxtItem *n;
 
index aa17d6d391b66a796f301d8776ed29d65894eb65..d788d797fc8fd30a10bf8a3695d9ae0f1354b291 100644 (file)
@@ -324,6 +324,8 @@ int dns_resource_record_is_synthetic(DnsResourceRecord *rr);
 
 int dns_resource_record_clamp_ttl(DnsResourceRecord **rr, uint32_t max_ttl);
 
+bool dns_resource_record_is_link_local_address(DnsResourceRecord *rr);
+
 DnsTxtItem *dns_txt_item_free_all(DnsTxtItem *i);
 bool dns_txt_item_equal(DnsTxtItem *a, DnsTxtItem *b);
 DnsTxtItem *dns_txt_item_copy(DnsTxtItem *i);