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