]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
resolved: rr - introduce dns_resource_key_new_redirect()
authorTom Gundersen <teg@jklm.no>
Thu, 3 Sep 2015 23:56:23 +0000 (01:56 +0200)
committerTom Gundersen <teg@jklm.no>
Wed, 16 Sep 2015 15:03:17 +0000 (17:03 +0200)
Takes a key and CNAME RR and returns the canonical RR of the right
type. Make use of this in dns_question_redirect().

src/resolve/resolved-bus.c
src/resolve/resolved-dns-query.c
src/resolve/resolved-dns-query.h
src/resolve/resolved-dns-question.c
src/resolve/resolved-dns-question.h
src/resolve/resolved-dns-rr.c
src/resolve/resolved-dns-rr.h

index 12c17003e9f949889daea550ce349555e07aa6e6..19db781ac48ae3b1fd8c8952b0ade44c4d855858 100644 (file)
@@ -191,7 +191,7 @@ static void bus_method_resolve_hostname_complete(DnsQuery *q) {
 
                 /* This has a cname? Then update the query with the
                  * new cname. */
-                r = dns_query_cname_redirect(q, cname->cname.name);
+                r = dns_query_cname_redirect(q, cname);
                 if (r < 0) {
                         if (r == -ELOOP)
                                 r = sd_bus_reply_method_errorf(q->request, BUS_ERROR_CNAME_LOOP, "CNAME loop on '%s'", q->request_hostname);
index c0b4c8ba81836c090fc7c5411f88496e0c1b13db..4b1d18b2ef1ef4158d552ce80bed2a2cd11bde8c 100644 (file)
@@ -831,7 +831,7 @@ void dns_query_ready(DnsQuery *q) {
         dns_query_complete(q, state);
 }
 
-int dns_query_cname_redirect(DnsQuery *q, const char *name) {
+int dns_query_cname_redirect(DnsQuery *q, const DnsResourceRecord *cname) {
         _cleanup_(dns_question_unrefp) DnsQuestion *nq = NULL;
         int r;
 
@@ -840,7 +840,7 @@ int dns_query_cname_redirect(DnsQuery *q, const char *name) {
         if (q->n_cname_redirects > CNAME_MAX)
                 return -ELOOP;
 
-        r = dns_question_cname_redirect(q->question, name, &nq);
+        r = dns_question_cname_redirect(q->question, cname, &nq);
         if (r < 0)
                 return r;
 
index 93d49301fa73058cd397d90840edcc2862a67a3b..e7063d967885f0478d536bbd09aeb0ca2a49777a 100644 (file)
@@ -72,7 +72,7 @@ DnsQuery *dns_query_free(DnsQuery *q);
 int dns_query_go(DnsQuery *q);
 void dns_query_ready(DnsQuery *q);
 
-int dns_query_cname_redirect(DnsQuery *q, const char *name);
+int dns_query_cname_redirect(DnsQuery *q, const DnsResourceRecord *cname);
 
 int dns_query_bus_track(DnsQuery *q, sd_bus_message *m);
 
index c94928d7251f409f040dba1b5c4e002aca52f5b2..1507f22da0998cfdd05b7cc9e82ead6c505507c5 100644 (file)
@@ -242,13 +242,13 @@ int dns_question_is_equal(DnsQuestion *a, DnsQuestion *b) {
         return 1;
 }
 
-int dns_question_cname_redirect(DnsQuestion *q, const char *name, DnsQuestion **ret) {
+int dns_question_cname_redirect(DnsQuestion *q, const DnsResourceRecord *cname, DnsQuestion **ret) {
         _cleanup_(dns_question_unrefp) DnsQuestion *n = NULL;
         bool same = true;
         unsigned i;
         int r;
 
-        assert(name);
+        assert(cname);
         assert(ret);
 
         if (!q) {
@@ -262,7 +262,7 @@ int dns_question_cname_redirect(DnsQuestion *q, const char *name, DnsQuestion **
         }
 
         for (i = 0; i < q->n_keys; i++) {
-                r = dns_name_equal(DNS_RESOURCE_KEY_NAME(q->keys[i]), name);
+                r = dns_name_equal(DNS_RESOURCE_KEY_NAME(q->keys[i]), cname->cname.name);
                 if (r < 0)
                         return r;
 
@@ -286,7 +286,7 @@ int dns_question_cname_redirect(DnsQuestion *q, const char *name, DnsQuestion **
         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);
+                k = dns_resource_key_new_redirect(q->keys[i], cname);
                 if (!k)
                         return -ENOMEM;
 
index 77de0c7a2c1b005067bafc5157e6b628dbda1c3c..13cd1f20f31ea893afbd6ede50e62008deec1094 100644 (file)
@@ -46,6 +46,6 @@ int dns_question_is_superset(DnsQuestion *q, DnsQuestion *other);
 int dns_question_contains(DnsQuestion *a, DnsResourceKey *k);
 int dns_question_is_equal(DnsQuestion *a, DnsQuestion *b);
 
-int dns_question_cname_redirect(DnsQuestion *q, const char *name, DnsQuestion **ret);
+int dns_question_cname_redirect(DnsQuestion *q, const DnsResourceRecord *cname, DnsQuestion **ret);
 
 DEFINE_TRIVIAL_CLEANUP_FUNC(DnsQuestion*, dns_question_unref);
index 42ccd05578b970408ed9ed57869bc053fa5a975b..fd2f53f40bdcf3dd041fc33af96c8c0a1aa13b63 100644 (file)
@@ -54,6 +54,13 @@ DnsResourceKey* dns_resource_key_new_cname(const DnsResourceKey *key) {
         return dns_resource_key_new(key->class, DNS_TYPE_CNAME, DNS_RESOURCE_KEY_NAME(key));
 }
 
+DnsResourceKey* dns_resource_key_new_redirect(const DnsResourceKey *key, const DnsResourceRecord *cname) {
+        assert(key);
+        assert(cname);
+
+        return dns_resource_key_new(key->class, key->type, cname->cname.name);
+}
+
 DnsResourceKey* dns_resource_key_new_consume(uint16_t class, uint16_t type, char *name) {
         DnsResourceKey *k;
 
index b738ac63e82d8ee8600baed4880ea127273ee80a..9e2207c0aac128992cd6ec00664563f81fd5f21c 100644 (file)
@@ -178,6 +178,7 @@ static inline const char* DNS_RESOURCE_KEY_NAME(const DnsResourceKey *key) {
 
 DnsResourceKey* dns_resource_key_new(uint16_t class, uint16_t type, const char *name);
 DnsResourceKey* dns_resource_key_new_cname(const DnsResourceKey *key);
+DnsResourceKey* dns_resource_key_new_redirect(const DnsResourceKey *key, const DnsResourceRecord *cname);
 DnsResourceKey* dns_resource_key_new_consume(uint16_t class, uint16_t type, char *name);
 DnsResourceKey* dns_resource_key_ref(DnsResourceKey *key);
 DnsResourceKey* dns_resource_key_unref(DnsResourceKey *key);