1 
2 const char *
wdns_rrtype_to_str(uint16_t rrtype)3 wdns_rrtype_to_str(uint16_t rrtype)
4 {
5     switch (rrtype) {
6 	case WDNS_TYPE_A: return ("A");
7 	case WDNS_TYPE_NS: return ("NS");
8 	case WDNS_TYPE_MD: return ("MD");
9 	case WDNS_TYPE_MF: return ("MF");
10 	case WDNS_TYPE_CNAME: return ("CNAME");
11 	case WDNS_TYPE_SOA: return ("SOA");
12 	case WDNS_TYPE_MB: return ("MB");
13 	case WDNS_TYPE_MG: return ("MG");
14 	case WDNS_TYPE_MR: return ("MR");
15 	case WDNS_TYPE_NULL: return ("NULL");
16 	case WDNS_TYPE_WKS: return ("WKS");
17 	case WDNS_TYPE_PTR: return ("PTR");
18 	case WDNS_TYPE_HINFO: return ("HINFO");
19 	case WDNS_TYPE_MINFO: return ("MINFO");
20 	case WDNS_TYPE_MX: return ("MX");
21 	case WDNS_TYPE_TXT: return ("TXT");
22 	case WDNS_TYPE_RP: return ("RP");
23 	case WDNS_TYPE_AFSDB: return ("AFSDB");
24 	case WDNS_TYPE_X25: return ("X25");
25 	case WDNS_TYPE_ISDN: return ("ISDN");
26 	case WDNS_TYPE_RT: return ("RT");
27 	case WDNS_TYPE_NSAP: return ("NSAP");
28 	case WDNS_TYPE_NSAP_PTR: return ("NSAP-PTR");
29 	case WDNS_TYPE_SIG: return ("SIG");
30 	case WDNS_TYPE_KEY: return ("KEY");
31 	case WDNS_TYPE_PX: return ("PX");
32 	case WDNS_TYPE_GPOS: return ("GPOS");
33 	case WDNS_TYPE_AAAA: return ("AAAA");
34 	case WDNS_TYPE_LOC: return ("LOC");
35 	case WDNS_TYPE_NXT: return ("NXT");
36 	case WDNS_TYPE_EID: return ("EID");
37 	case WDNS_TYPE_NIMLOC: return ("NIMLOC");
38 	case WDNS_TYPE_SRV: return ("SRV");
39 	case WDNS_TYPE_ATMA: return ("ATMA");
40 	case WDNS_TYPE_NAPTR: return ("NAPTR");
41 	case WDNS_TYPE_KX: return ("KX");
42 	case WDNS_TYPE_CERT: return ("CERT");
43 	case WDNS_TYPE_A6: return ("A6");
44 	case WDNS_TYPE_DNAME: return ("DNAME");
45 	case WDNS_TYPE_SINK: return ("SINK");
46 	case WDNS_TYPE_OPT: return ("OPT");
47 	case WDNS_TYPE_APL: return ("APL");
48 	case WDNS_TYPE_DS: return ("DS");
49 	case WDNS_TYPE_SSHFP: return ("SSHFP");
50 	case WDNS_TYPE_IPSECKEY: return ("IPSECKEY");
51 	case WDNS_TYPE_RRSIG: return ("RRSIG");
52 	case WDNS_TYPE_NSEC: return ("NSEC");
53 	case WDNS_TYPE_DNSKEY: return ("DNSKEY");
54 	case WDNS_TYPE_DHCID: return ("DHCID");
55 	case WDNS_TYPE_NSEC3: return ("NSEC3");
56 	case WDNS_TYPE_NSEC3PARAM: return ("NSEC3PARAM");
57 	case WDNS_TYPE_TLSA: return ("TLSA");
58 	case WDNS_TYPE_HIP: return ("HIP");
59 	case WDNS_TYPE_NINFO: return ("NINFO");
60 	case WDNS_TYPE_RKEY: return ("RKEY");
61 	case WDNS_TYPE_TALINK: return ("TALINK");
62 	case WDNS_TYPE_CDS: return ("CDS");
63 	case WDNS_TYPE_CDNSKEY: return ("CDNSKEY");
64 	case WDNS_TYPE_OPENPGPKEY: return ("OPENPGPKEY");
65 	case WDNS_TYPE_CSYNC: return ("CSYNC");
66 	case WDNS_TYPE_SPF: return ("SPF");
67 	case WDNS_TYPE_UINFO: return ("UINFO");
68 	case WDNS_TYPE_UID: return ("UID");
69 	case WDNS_TYPE_GID: return ("GID");
70 	case WDNS_TYPE_UNSPEC: return ("UNSPEC");
71 	case WDNS_TYPE_NID: return ("NID");
72 	case WDNS_TYPE_L32: return ("L32");
73 	case WDNS_TYPE_L64: return ("L64");
74 	case WDNS_TYPE_LP: return ("LP");
75 	case WDNS_TYPE_EUI48: return ("EUI48");
76 	case WDNS_TYPE_EUI64: return ("EUI64");
77 	case WDNS_TYPE_TKEY: return ("TKEY");
78 	case WDNS_TYPE_TSIG: return ("TSIG");
79 	case WDNS_TYPE_IXFR: return ("IXFR");
80 	case WDNS_TYPE_AXFR: return ("AXFR");
81 	case WDNS_TYPE_MAILB: return ("MAILB");
82 	case WDNS_TYPE_MAILA: return ("MAILA");
83 	case WDNS_TYPE_ANY: return ("ANY");
84 	case WDNS_TYPE_URI: return ("URI");
85 	case WDNS_TYPE_CAA: return ("CAA");
86 	case WDNS_TYPE_TA: return ("TA");
87 	case WDNS_TYPE_DLV: return ("DLV");
88     }
89 
90     return (NULL);
91 }
92 
93 static struct u16str {
94     uint16_t u16;
95     const char *str;
96 } rrtypes[] = {
97 	{ WDNS_TYPE_A, "A" },
98 	{ WDNS_TYPE_A6, "A6" },
99 	{ WDNS_TYPE_AAAA, "AAAA" },
100 	{ WDNS_TYPE_AFSDB, "AFSDB" },
101 	{ WDNS_TYPE_ANY, "ANY" },
102 	{ WDNS_TYPE_APL, "APL" },
103 	{ WDNS_TYPE_ATMA, "ATMA" },
104 	{ WDNS_TYPE_AXFR, "AXFR" },
105 	{ WDNS_TYPE_CAA, "CAA" },
106 	{ WDNS_TYPE_CDNSKEY, "CDNSKEY" },
107 	{ WDNS_TYPE_CDS, "CDS" },
108 	{ WDNS_TYPE_CERT, "CERT" },
109 	{ WDNS_TYPE_CNAME, "CNAME" },
110 	{ WDNS_TYPE_CSYNC, "CSYNC" },
111 	{ WDNS_TYPE_DHCID, "DHCID" },
112 	{ WDNS_TYPE_DLV, "DLV" },
113 	{ WDNS_TYPE_DNAME, "DNAME" },
114 	{ WDNS_TYPE_DNSKEY, "DNSKEY" },
115 	{ WDNS_TYPE_DS, "DS" },
116 	{ WDNS_TYPE_EID, "EID" },
117 	{ WDNS_TYPE_EUI48, "EUI48" },
118 	{ WDNS_TYPE_EUI64, "EUI64" },
119 	{ WDNS_TYPE_GID, "GID" },
120 	{ WDNS_TYPE_GPOS, "GPOS" },
121 	{ WDNS_TYPE_HINFO, "HINFO" },
122 	{ WDNS_TYPE_HIP, "HIP" },
123 	{ WDNS_TYPE_IPSECKEY, "IPSECKEY" },
124 	{ WDNS_TYPE_ISDN, "ISDN" },
125 	{ WDNS_TYPE_IXFR, "IXFR" },
126 	{ WDNS_TYPE_KEY, "KEY" },
127 	{ WDNS_TYPE_KX, "KX" },
128 	{ WDNS_TYPE_L32, "L32" },
129 	{ WDNS_TYPE_L64, "L64" },
130 	{ WDNS_TYPE_LOC, "LOC" },
131 	{ WDNS_TYPE_LP, "LP" },
132 	{ WDNS_TYPE_MAILA, "MAILA" },
133 	{ WDNS_TYPE_MAILB, "MAILB" },
134 	{ WDNS_TYPE_MB, "MB" },
135 	{ WDNS_TYPE_MD, "MD" },
136 	{ WDNS_TYPE_MF, "MF" },
137 	{ WDNS_TYPE_MG, "MG" },
138 	{ WDNS_TYPE_MINFO, "MINFO" },
139 	{ WDNS_TYPE_MR, "MR" },
140 	{ WDNS_TYPE_MX, "MX" },
141 	{ WDNS_TYPE_NAPTR, "NAPTR" },
142 	{ WDNS_TYPE_NID, "NID" },
143 	{ WDNS_TYPE_NIMLOC, "NIMLOC" },
144 	{ WDNS_TYPE_NINFO, "NINFO" },
145 	{ WDNS_TYPE_NS, "NS" },
146 	{ WDNS_TYPE_NSAP, "NSAP" },
147 	{ WDNS_TYPE_NSAP_PTR, "NSAP-PTR" },
148 	{ WDNS_TYPE_NSEC, "NSEC" },
149 	{ WDNS_TYPE_NSEC3, "NSEC3" },
150 	{ WDNS_TYPE_NSEC3PARAM, "NSEC3PARAM" },
151 	{ WDNS_TYPE_NULL, "NULL" },
152 	{ WDNS_TYPE_NXT, "NXT" },
153 	{ WDNS_TYPE_OPENPGPKEY, "OPENPGPKEY" },
154 	{ WDNS_TYPE_OPT, "OPT" },
155 	{ WDNS_TYPE_PTR, "PTR" },
156 	{ WDNS_TYPE_PX, "PX" },
157 	{ WDNS_TYPE_RKEY, "RKEY" },
158 	{ WDNS_TYPE_RP, "RP" },
159 	{ WDNS_TYPE_RRSIG, "RRSIG" },
160 	{ WDNS_TYPE_RT, "RT" },
161 	{ WDNS_TYPE_SIG, "SIG" },
162 	{ WDNS_TYPE_SINK, "SINK" },
163 	{ WDNS_TYPE_SOA, "SOA" },
164 	{ WDNS_TYPE_SPF, "SPF" },
165 	{ WDNS_TYPE_SRV, "SRV" },
166 	{ WDNS_TYPE_SSHFP, "SSHFP" },
167 	{ WDNS_TYPE_TA, "TA" },
168 	{ WDNS_TYPE_TALINK, "TALINK" },
169 	{ WDNS_TYPE_TKEY, "TKEY" },
170 	{ WDNS_TYPE_TLSA, "TLSA" },
171 	{ WDNS_TYPE_TSIG, "TSIG" },
172 	{ WDNS_TYPE_TXT, "TXT" },
173 	{ WDNS_TYPE_UID, "UID" },
174 	{ WDNS_TYPE_UINFO, "UINFO" },
175 	{ WDNS_TYPE_UNSPEC, "UNSPEC" },
176 	{ WDNS_TYPE_URI, "URI" },
177 	{ WDNS_TYPE_WKS, "WKS" },
178 	{ WDNS_TYPE_X25, "X25" },
179 };
180 
181 #define num_rrtypes (sizeof(rrtypes) / sizeof(struct u16str))
182 
183 static int
cmp_u16str(const void * a,const void * b)184 cmp_u16str(const void *a, const void *b) {
185     struct u16str *u1 = (struct u16str *) a;
186     struct u16str *u2 = (struct u16str *) b;
187     return (strcasecmp(u1->str, u2->str));
188 }
189 
190 static bool
convert_generic_rrtype(const char * s,long int * val)191 convert_generic_rrtype(const char *s, long int *val) {
192     char *endptr = NULL;
193 
194     if (strlen(s) <= 4)
195         return (false);
196     if (strncasecmp(s, "TYPE", 4) != 0)
197         return (false);
198 
199     s += 4; /* skip leading "TYPE" */
200 
201     *val = strtol(s, &endptr, 10);
202     if (endptr != NULL && *endptr != '\0')
203         return (false);
204     if (*val < 0 || *val > 65535)
205         return (false);
206 
207     return (true);
208 }
209 
210 uint16_t
wdns_str_to_rrtype(const char * str)211 wdns_str_to_rrtype(const char *str) {
212     struct u16str key, *res;
213     key.str = str;
214     res = bsearch(&key, rrtypes, num_rrtypes, sizeof(struct u16str), cmp_u16str);
215     if (res != NULL) {
216         return (res->u16);
217     } else {
218         long int val = 0;
219         if (convert_generic_rrtype(str, &val))
220             return (val);
221     }
222     return (0);
223 }
224