1
2 const char *
wdns_rcode_to_str(uint16_t rcode)3 wdns_rcode_to_str(uint16_t rcode)
4 {
5 switch (rcode) {
6 case WDNS_R_NOERROR: return ("NOERROR");
7 case WDNS_R_FORMERR: return ("FORMERR");
8 case WDNS_R_SERVFAIL: return ("SERVFAIL");
9 case WDNS_R_NXDOMAIN: return ("NXDOMAIN");
10 case WDNS_R_NOTIMP: return ("NOTIMP");
11 case WDNS_R_REFUSED: return ("REFUSED");
12 case WDNS_R_YXDOMAIN: return ("YXDOMAIN");
13 case WDNS_R_YXRRSET: return ("YXRRSET");
14 case WDNS_R_NXRRSET: return ("NXRRSET");
15 case WDNS_R_NOTAUTH: return ("NOTAUTH");
16 case WDNS_R_NOTZONE: return ("NOTZONE");
17 case WDNS_R_BADVERS: return ("BADVERS");
18 }
19
20 return (NULL);
21 }
22
23 static struct u16str {
24 uint16_t u16;
25 const char *str;
26 } rcodes[] = {
27 { WDNS_R_BADVERS, "BADVERS" },
28 { WDNS_R_FORMERR, "FORMERR" },
29 { WDNS_R_NOERROR, "NOERROR" },
30 { WDNS_R_NOTAUTH, "NOTAUTH" },
31 { WDNS_R_NOTIMP, "NOTIMP" },
32 { WDNS_R_NOTZONE, "NOTZONE" },
33 { WDNS_R_NXDOMAIN, "NXDOMAIN" },
34 { WDNS_R_NXRRSET, "NXRRSET" },
35 { WDNS_R_REFUSED, "REFUSED" },
36 { WDNS_R_SERVFAIL, "SERVFAIL" },
37 { WDNS_R_YXDOMAIN, "YXDOMAIN" },
38 { WDNS_R_YXRRSET, "YXRRSET" },
39 };
40
41 #define num_rcodes (sizeof(rcodes) / sizeof(struct u16str))
42
43 static int
cmp_u16str(const void * a,const void * b)44 cmp_u16str(const void *a, const void *b) {
45 struct u16str *u1 = (struct u16str *) a;
46 struct u16str *u2 = (struct u16str *) b;
47 return (strcasecmp(u1->str, u2->str));
48 }
49
50 wdns_res
wdns_str_to_rcode(const char * str,uint16_t * out)51 wdns_str_to_rcode(const char *str, uint16_t *out) {
52 struct u16str key, *res;
53 key.str = str;
54 res = bsearch(&key, rcodes, num_rcodes, sizeof(struct u16str), cmp_u16str);
55 if (res != NULL) {
56 *out = res->u16;
57 return (wdns_res_success);
58 }
59 return (wdns_res_failure);
60 }
61