const char * wdns_rcode_to_str(uint16_t rcode) { switch (rcode) { case WDNS_R_NOERROR: return ("NOERROR"); case WDNS_R_FORMERR: return ("FORMERR"); case WDNS_R_SERVFAIL: return ("SERVFAIL"); case WDNS_R_NXDOMAIN: return ("NXDOMAIN"); case WDNS_R_NOTIMP: return ("NOTIMP"); case WDNS_R_REFUSED: return ("REFUSED"); case WDNS_R_YXDOMAIN: return ("YXDOMAIN"); case WDNS_R_YXRRSET: return ("YXRRSET"); case WDNS_R_NXRRSET: return ("NXRRSET"); case WDNS_R_NOTAUTH: return ("NOTAUTH"); case WDNS_R_NOTZONE: return ("NOTZONE"); case WDNS_R_BADVERS: return ("BADVERS"); } return (NULL); } static struct u16str { uint16_t u16; const char *str; } rcodes[] = { { WDNS_R_BADVERS, "BADVERS" }, { WDNS_R_FORMERR, "FORMERR" }, { WDNS_R_NOERROR, "NOERROR" }, { WDNS_R_NOTAUTH, "NOTAUTH" }, { WDNS_R_NOTIMP, "NOTIMP" }, { WDNS_R_NOTZONE, "NOTZONE" }, { WDNS_R_NXDOMAIN, "NXDOMAIN" }, { WDNS_R_NXRRSET, "NXRRSET" }, { WDNS_R_REFUSED, "REFUSED" }, { WDNS_R_SERVFAIL, "SERVFAIL" }, { WDNS_R_YXDOMAIN, "YXDOMAIN" }, { WDNS_R_YXRRSET, "YXRRSET" }, }; #define num_rcodes (sizeof(rcodes) / sizeof(struct u16str)) static int cmp_u16str(const void *a, const void *b) { struct u16str *u1 = (struct u16str *) a; struct u16str *u2 = (struct u16str *) b; return (strcasecmp(u1->str, u2->str)); } wdns_res wdns_str_to_rcode(const char *str, uint16_t *out) { struct u16str key, *res; key.str = str; res = bsearch(&key, rcodes, num_rcodes, sizeof(struct u16str), cmp_u16str); if (res != NULL) { *out = res->u16; return (wdns_res_success); } return (wdns_res_failure); }