summaryrefslogtreecommitdiffstats
path: root/lib/resolv_wrapper/resolv_wrapper.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/resolv_wrapper/resolv_wrapper.c')
-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;
}
}