5 static adns_status
rp_inaddr(adns_state ads
, adns_query qu
, int serv
,
6 const byte
*dgram
, int dglen
, int cbyte
, int max
,
8 struct in_addr
*dr
= store_r
;
10 if (max
-cbyte
!= 4) return adns_s_invaliddata
;
11 memcpy(dr
,dgram
+cbyte
,4);
15 static adns_status
rmf_null(adns_state ads
, adns_query qu
, void *data
) { }
17 #define TYPE_SF(size,func,free) size, rp_#func, rmf_#free
18 #define TYPE_SN(size,func) size, rp_#func, rmf_null
19 #define TYPESZ_M(member) (sizeof(((adns_answer*)0)->rrs.member))
20 #define TYPE_MF(member,parse) TYPE_SF(TYPESZ_M(member),parse,member)
21 #define TYPE_MN(member,parse) TYPE_SN(TYPESZ_M(member),parse)
24 * ms is M specify member name
25 * or S specify size explicitly
26 * nf is F full memory management, dependent on member name or specified func
27 * N no memory management required
30 static const typeinfo typeinfos
[] = {
31 /* Must be in ascending order of rrtype ! */
32 /* rr type code name style member size parser */
34 { adns_r_a
, "A", TYPE_MN( inaddr
, inaddr
) },
36 { adns_r_ns_raw
, "NS(raw)", TYPE_MF( str
, domain_raw
) },
37 { adns_r_cname
, "CNAME", TYPE_MF( str
, domain_raw
) },
38 { adns_r_soa_raw
, "SOA(raw)", TYPE_MF( soa
, soa
) },
39 { adns_r_null
, "NULL", TYPE_SN( 0, null
) },
40 { adns_r_ptr_raw
, "PTR(raw)", TYPE_MF( str
, domain_raw
) },
41 { adns_r_hinfo
, "HINFO", TYPE_MF( strpair
, hinfo
) },
42 { adns_r_mx_raw
, "MX(raw)", TYPE_MF( intstr
, mx_raw
) },
43 { adns_r_txt
, "TXT", TYPE_MF( str
, txt
) },
44 { adns_r_rp_raw
, "RP(raw)", TYPE_MF( strpair
, rp
) },
46 { adns_r_ns
, "NS(+addr)", TYPE_MF( dmaddr
, dmaddr
) },
47 { adns_r_ptr
, "PTR(checked)", TYPE_MF( str
, ptr
) },
48 { adns_r_mx
, "MX(+addr)", TYPE_MF( intdmaddr
, mx
) },
50 { adns_r_soa
, "SOA(822)", TYPE_MF( soa
, soa
) },
51 { adns_r_rp
, "RP(822)", TYPE_MF( strpair
, rp
) },
55 const typeinfo
adns__findtype(adns_rrtype type
) {
56 const typeinfo
*begin
, *end
;
58 begin
= typeinfos
; end
= typeinfos
+(sizeof(typeinfos
)/sizeof(typeinfo
));
61 mid
= begin
+ ((end
-begin
)>>1);
62 if (mid
->type
== type
) return mid
;
63 if (type
> mid
->type
) begin
= mid
+1;