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/dns_parse.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/network/dns_parse.c (limited to 'src/network/dns_parse.c') diff --git a/src/network/dns_parse.c b/src/network/dns_parse.c new file mode 100644 index 00000000..aa0d39f3 --- /dev/null +++ b/src/network/dns_parse.c @@ -0,0 +1,31 @@ +#include + +int __dns_parse(const unsigned char *r, int rlen, int (*callback)(void *, int, const void *, int, const void *), void *ctx) +{ + int qdcount, ancount; + const unsigned char *p; + int len; + + if ((r[3]&15)) return 0; + p = r+12; + qdcount = r[4]*256 + r[5]; + ancount = r[6]*256 + r[7]; + if (qdcount+ancount > 64) return -1; + while (qdcount--) { + while (p-r < rlen && *p-1U < 127) p++; + if (*p>193 || (*p==193 && p[1]>254) || p>r+506) + return -1; + p += 5 + !!*p; + } + while (ancount--) { + while (p-r < rlen && *p-1U < 127) p++; + if (*p>193 || (*p==193 && p[1]>254) || p>r+506) + return -1; + p += 1 + !!*p; + len = p[8]*256 + p[9]; + if (p+len > r+rlen) return -1; + if (callback(ctx, p[1], p+10, len, r) < 0) return -1; + p += 10 + len; + } + return 0; +} -- cgit v1.2.3-70-g09d2