3 int __dns_parse(const unsigned char *r
, int rlen
, int (*callback
)(void *, int, const void *, int, const void *), void *ctx
)
6 const unsigned char *p
;
9 if (rlen
<12) return -1;
10 if ((r
[3]&15)) return 0;
12 qdcount
= r
[4]*256 + r
[5];
13 ancount
= r
[6]*256 + r
[7];
14 if (qdcount
+ancount
> 64) return -1;
16 while (p
-r
< rlen
&& *p
-1U < 127) p
++;
17 if (*p
>193 || (*p
==193 && p
[1]>254) || p
>r
+rlen
-6)
22 while (p
-r
< rlen
&& *p
-1U < 127) p
++;
23 if (*p
>193 || (*p
==193 && p
[1]>254) || p
>r
+rlen
-6)
26 len
= p
[8]*256 + p
[9];
27 if (p
+len
> r
+rlen
) return -1;
28 if (callback(ctx
, p
[1], p
+10, len
, r
) < 0) return -1;