+static adns_status pa_addr(adns_query qu, int serv,
+ const byte *dgram, int dglen, int cbyte, int max,
+ void *datap) {
+ adns_addr *storeto= datap;
+
+ if (max-cbyte != 4) return adns_s_invaliddata;
+ storeto->len= sizeof(storeto->addr.inet);
+ memset(&storeto->addr,0,sizeof(storeto->addr.inet));
+ storeto->addr.inet.sin_family= AF_INET;
+ storeto->addr.inet.sin_port= 0;
+ memcpy(&storeto->addr.inet.sin_addr,dgram+cbyte,4);
+ return adns_s_ok;
+}
+
+static int di_addr(const void *datap_a, const void *datap_b) {
+ const adns_addr *ap= datap_a, *bp= datap_b;
+
+ return dip_inaddr(ap->addr.inet.sin_addr,bp->addr.inet.sin_addr);
+}
+
+static adns_status cs_addr(vbuf *vb, const void *datap) {
+ const adns_addr *rrp= datap;
+ const char *ia;
+ static char buf[30];
+
+ switch (rrp->addr.inet.sin_family) {
+ case AF_INET:
+ if (!adns__vbuf_appendstr(vb,"AF_INET ")) return adns_s_nolocalmem;
+ ia= inet_ntoa(rrp->addr.inet.sin_addr); assert(ia);
+ if (!adns__vbuf_appendstr(vb,ia)) return adns_s_nolocalmem;
+ break;
+ default:
+ sprintf(buf,"AF=%u",rrp->addr.sa.sa_family);
+ if (!adns__vbuf_appendstr(vb,buf)) return adns_s_nolocalmem;
+ break;
+ }
+ return adns_s_ok;
+}
+
+static adns_status pap_domain(adns_query qu, int serv, parsedomain_flags flags,