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