summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorJakub Hrozek <jakub.hrozek@gmail.com>2014-12-03 15:45:05 +0100
committerAndrew Bartlett <abartlet@samba.org>2014-12-05 23:32:06 +0100
commit27828774c3633389b5ce5397d8e25fab2e278624 (patch)
treee5a543313e4e22a44fcbdd1f992def0723de1a84 /lib
parent917c3f08440c302511bdf06b5ac11b42630bdd28 (diff)
downloadsamba-27828774c3633389b5ce5397d8e25fab2e278624.tar.gz
samba-27828774c3633389b5ce5397d8e25fab2e278624.tar.xz
samba-27828774c3633389b5ce5397d8e25fab2e278624.zip
rwrap: CNAME record can recurse into A, AAAA or CNAME
Signed-off-by: Jakub Hrozek <jakub.hrozek@gmail.com> Reviewed-by: Andreas Schneider <asn@samba.org> Reviewed-by: Guenther Deschner <gd@samba.org> Signed-off-by: Andreas Schneider <asn@samba.org> Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Diffstat (limited to 'lib')
-rw-r--r--lib/resolv_wrapper/resolv_wrapper.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/lib/resolv_wrapper/resolv_wrapper.c b/lib/resolv_wrapper/resolv_wrapper.c
index 99c091d0de..75439fac6c 100644
--- a/lib/resolv_wrapper/resolv_wrapper.c
+++ b/lib/resolv_wrapper/resolv_wrapper.c
@@ -677,6 +677,23 @@ static int rwrap_srv_recurse(const char *hostfile, unsigned recursion,
return rc;
}
+static int rwrap_cname_recurse(const char *hostfile, unsigned recursion,
+ const char *query, struct rwrap_fake_rr *rr)
+{
+ int rc;
+
+ rc = rwrap_get_record(hostfile, recursion, query, ns_t_a, rr);
+ if (rc == 0) return 0;
+
+ rc = rwrap_get_record(hostfile, recursion, query, ns_t_aaaa, rr);
+ if (rc == 0) return 0;
+
+ rc = rwrap_get_record(hostfile, recursion, query, ns_t_cname, rr);
+ if (rc == ENOENT) rc = 0;
+
+ return rc;
+}
+
static int rwrap_get_record(const char *hostfile, unsigned recursion,
const char *query, int type,
struct rwrap_fake_rr *rr)
@@ -749,6 +766,10 @@ static int rwrap_get_record(const char *hostfile, unsigned recursion,
} else if (TYPE_MATCH(type, ns_t_cname,
rec_type, "CNAME", key, query)) {
rc = rwrap_create_fake_cname_rr(key, value, rr);
+ if (rc == 0) {
+ rc = rwrap_cname_recurse(hostfile, recursion+1,
+ value, rr + 1);
+ }
break;
}
}