diff options
author | Rich Felker <dalias@aerifal.cx> | 2014-06-02 04:47:45 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2014-06-02 04:47:45 -0400 |
commit | 3330198060c7b3165a2fba530ffde5fc6706ecf2 (patch) | |
tree | bc87811d35022e240dfe8d24f96402ac2feaa65a /src/network/dns_parse.c | |
parent | a2a328bd896fa909542b492601e3689119b95de0 (diff) | |
download | musl-3330198060c7b3165a2fba530ffde5fc6706ecf2.tar.gz musl-3330198060c7b3165a2fba530ffde5fc6706ecf2.tar.bz2 musl-3330198060c7b3165a2fba530ffde5fc6706ecf2.tar.xz musl-3330198060c7b3165a2fba530ffde5fc6706ecf2.zip |
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.
Diffstat (limited to 'src/network/dns_parse.c')
-rw-r--r-- | src/network/dns_parse.c | 31 |
1 files changed, 31 insertions, 0 deletions
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 <string.h> + +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; +} |