summaryrefslogtreecommitdiff
path: root/src/network/dns_parse.c
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2014-06-02 04:47:45 -0400
committerRich Felker <dalias@aerifal.cx>2014-06-02 04:47:45 -0400
commit3330198060c7b3165a2fba530ffde5fc6706ecf2 (patch)
treebc87811d35022e240dfe8d24f96402ac2feaa65a /src/network/dns_parse.c
parenta2a328bd896fa909542b492601e3689119b95de0 (diff)
downloadmusl-3330198060c7b3165a2fba530ffde5fc6706ecf2.tar.gz
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.c31
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;
+}