From 3330198060c7b3165a2fba530ffde5fc6706ecf2 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Mon, 2 Jun 2014 04:47:45 -0400 Subject: switch standard resolver functions to use the new dns backend this is the third phase of the "resolver overhaul" project. this commit removes all of the old dns code, and switches the __lookup_name backend (used by getaddrinfo, etc.) and the getnameinfo function to use the newly implemented __res_mkquery and __res_msend interfaces. for parsing the results, a new callback-based __dns_parse function, based on __dns_get_rr from the old dns code, is used. --- src/network/lookup_name.c | 82 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 61 insertions(+), 21 deletions(-) (limited to 'src/network/lookup_name.c') diff --git a/src/network/lookup_name.c b/src/network/lookup_name.c index e1b583ee..83c0fc27 100644 --- a/src/network/lookup_name.c +++ b/src/network/lookup_name.c @@ -9,7 +9,6 @@ #include "lookup.h" #include "stdio_impl.h" #include "syscall.h" -#include "__dns.h" static int is_valid_hostname(const char *host) { @@ -86,30 +85,71 @@ static int name_from_hosts(struct address buf[static MAXADDRS], char canon[stati return cnt; } -static int name_from_dns(struct address buf[static MAXADDRS], char canon[static 256], const char *name, int family) +struct dpc_ctx { + struct address *addrs; + char *canon; + int cnt; +}; + +int __dns_parse(const unsigned char *, int, int (*)(void *, int, const void *, int, const void *), void *); +int __dn_expand(const unsigned char *, const unsigned char *, const unsigned char *, char *, int); +int __res_mkquery(int, const char *, int, int, const unsigned char *, int, const unsigned char*, unsigned char *, int); +int __res_msend(int, const unsigned char *const *, const int *, unsigned char *const *, int *, int); + +#define RR_A 1 +#define RR_CNAME 5 +#define RR_AAAA 28 + +static int dns_parse_callback(void *c, int rr, const void *data, int len, const void *packet) { - unsigned char reply[1024] = { 0 }, *p = reply; char tmp[256]; - int i, cnt = 0; - - /* Perform one or more DNS queries for host */ - int result = __dns_query(reply, name, family, 0); - if (result < 0) return result; + struct dpc_ctx *ctx = c; + switch (rr) { + case RR_A: + if (len != 4) return -1; + ctx->addrs[ctx->cnt].family = AF_INET; + memcpy(ctx->addrs[ctx->cnt++].addr, data, 4); + break; + case RR_AAAA: + if (len != 16) return -1; + ctx->addrs[ctx->cnt].family = AF_INET6; + memcpy(ctx->addrs[ctx->cnt++].addr, data, 16); + break; + case RR_CNAME: + if (__dn_expand(packet, (const unsigned char *)packet + 512, + data, tmp, sizeof tmp) > 0 && is_valid_hostname(tmp)) + strcpy(ctx->canon, tmp); + break; + } + return 0; +} - for (i=0; i