1*7b5038d7SDag-Erling Smørgrav /* 2*7b5038d7SDag-Erling Smørgrav * higher.c 3*7b5038d7SDag-Erling Smørgrav * 4*7b5038d7SDag-Erling Smørgrav * Specify some higher level functions that would 5*7b5038d7SDag-Erling Smørgrav * be usefull to would be developers 6*7b5038d7SDag-Erling Smørgrav * 7*7b5038d7SDag-Erling Smørgrav * a Net::DNS like library for C 8*7b5038d7SDag-Erling Smørgrav * 9*7b5038d7SDag-Erling Smørgrav * (c) NLnet Labs, 2004-2006 10*7b5038d7SDag-Erling Smørgrav * 11*7b5038d7SDag-Erling Smørgrav * See the file LICENSE for the license 12*7b5038d7SDag-Erling Smørgrav */ 13*7b5038d7SDag-Erling Smørgrav 14*7b5038d7SDag-Erling Smørgrav #include <ldns/config.h> 15*7b5038d7SDag-Erling Smørgrav 16*7b5038d7SDag-Erling Smørgrav #include <ldns/ldns.h> 17*7b5038d7SDag-Erling Smørgrav 18*7b5038d7SDag-Erling Smørgrav #ifdef HAVE_SSL 19*7b5038d7SDag-Erling Smørgrav #include <openssl/ssl.h> 20*7b5038d7SDag-Erling Smørgrav #include <openssl/sha.h> 21*7b5038d7SDag-Erling Smørgrav #endif /* HAVE_SSL */ 22*7b5038d7SDag-Erling Smørgrav 23*7b5038d7SDag-Erling Smørgrav ldns_rr_list * 24*7b5038d7SDag-Erling Smørgrav ldns_get_rr_list_addr_by_name(ldns_resolver *res, ldns_rdf *name, ldns_rr_class c, 25*7b5038d7SDag-Erling Smørgrav uint16_t flags) 26*7b5038d7SDag-Erling Smørgrav { 27*7b5038d7SDag-Erling Smørgrav ldns_pkt *pkt; 28*7b5038d7SDag-Erling Smørgrav ldns_rr_list *aaaa; 29*7b5038d7SDag-Erling Smørgrav ldns_rr_list *a; 30*7b5038d7SDag-Erling Smørgrav ldns_rr_list *result = NULL; 31*7b5038d7SDag-Erling Smørgrav ldns_rr_list *hostsfilenames; 32*7b5038d7SDag-Erling Smørgrav size_t i; 33*7b5038d7SDag-Erling Smørgrav uint8_t ip6; 34*7b5038d7SDag-Erling Smørgrav 35*7b5038d7SDag-Erling Smørgrav a = NULL; 36*7b5038d7SDag-Erling Smørgrav aaaa = NULL; 37*7b5038d7SDag-Erling Smørgrav result = NULL; 38*7b5038d7SDag-Erling Smørgrav 39*7b5038d7SDag-Erling Smørgrav if (!res) { 40*7b5038d7SDag-Erling Smørgrav return NULL; 41*7b5038d7SDag-Erling Smørgrav } 42*7b5038d7SDag-Erling Smørgrav if (ldns_rdf_get_type(name) != LDNS_RDF_TYPE_DNAME) { 43*7b5038d7SDag-Erling Smørgrav return NULL; 44*7b5038d7SDag-Erling Smørgrav } 45*7b5038d7SDag-Erling Smørgrav 46*7b5038d7SDag-Erling Smørgrav ip6 = ldns_resolver_ip6(res); /* we use INET_ANY here, save 47*7b5038d7SDag-Erling Smørgrav what was there */ 48*7b5038d7SDag-Erling Smørgrav 49*7b5038d7SDag-Erling Smørgrav ldns_resolver_set_ip6(res, LDNS_RESOLV_INETANY); 50*7b5038d7SDag-Erling Smørgrav 51*7b5038d7SDag-Erling Smørgrav hostsfilenames = ldns_get_rr_list_hosts_frm_file(NULL); 52*7b5038d7SDag-Erling Smørgrav for (i = 0; i < ldns_rr_list_rr_count(hostsfilenames); i++) { 53*7b5038d7SDag-Erling Smørgrav if (ldns_rdf_compare(name, 54*7b5038d7SDag-Erling Smørgrav ldns_rr_owner(ldns_rr_list_rr(hostsfilenames, 55*7b5038d7SDag-Erling Smørgrav i))) == 0) { 56*7b5038d7SDag-Erling Smørgrav if (!result) { 57*7b5038d7SDag-Erling Smørgrav result = ldns_rr_list_new(); 58*7b5038d7SDag-Erling Smørgrav } 59*7b5038d7SDag-Erling Smørgrav ldns_rr_list_push_rr(result, 60*7b5038d7SDag-Erling Smørgrav ldns_rr_clone(ldns_rr_list_rr(hostsfilenames, i))); 61*7b5038d7SDag-Erling Smørgrav } 62*7b5038d7SDag-Erling Smørgrav } 63*7b5038d7SDag-Erling Smørgrav ldns_rr_list_deep_free(hostsfilenames); 64*7b5038d7SDag-Erling Smørgrav 65*7b5038d7SDag-Erling Smørgrav if (result) { 66*7b5038d7SDag-Erling Smørgrav return result; 67*7b5038d7SDag-Erling Smørgrav } 68*7b5038d7SDag-Erling Smørgrav 69*7b5038d7SDag-Erling Smørgrav /* add the RD flags, because we want an answer */ 70*7b5038d7SDag-Erling Smørgrav pkt = ldns_resolver_query(res, name, LDNS_RR_TYPE_AAAA, c, flags | LDNS_RD); 71*7b5038d7SDag-Erling Smørgrav if (pkt) { 72*7b5038d7SDag-Erling Smørgrav /* extract the data we need */ 73*7b5038d7SDag-Erling Smørgrav aaaa = ldns_pkt_rr_list_by_type(pkt, LDNS_RR_TYPE_AAAA, 74*7b5038d7SDag-Erling Smørgrav LDNS_SECTION_ANSWER); 75*7b5038d7SDag-Erling Smørgrav ldns_pkt_free(pkt); 76*7b5038d7SDag-Erling Smørgrav } 77*7b5038d7SDag-Erling Smørgrav 78*7b5038d7SDag-Erling Smørgrav pkt = ldns_resolver_query(res, name, LDNS_RR_TYPE_A, c, flags | LDNS_RD); 79*7b5038d7SDag-Erling Smørgrav if (pkt) { 80*7b5038d7SDag-Erling Smørgrav /* extract the data we need */ 81*7b5038d7SDag-Erling Smørgrav a = ldns_pkt_rr_list_by_type(pkt, LDNS_RR_TYPE_A, LDNS_SECTION_ANSWER); 82*7b5038d7SDag-Erling Smørgrav ldns_pkt_free(pkt); 83*7b5038d7SDag-Erling Smørgrav } 84*7b5038d7SDag-Erling Smørgrav ldns_resolver_set_ip6(res, ip6); 85*7b5038d7SDag-Erling Smørgrav 86*7b5038d7SDag-Erling Smørgrav if (aaaa && a) { 87*7b5038d7SDag-Erling Smørgrav result = ldns_rr_list_cat_clone(aaaa, a); 88*7b5038d7SDag-Erling Smørgrav ldns_rr_list_deep_free(aaaa); 89*7b5038d7SDag-Erling Smørgrav ldns_rr_list_deep_free(a); 90*7b5038d7SDag-Erling Smørgrav return result; 91*7b5038d7SDag-Erling Smørgrav } 92*7b5038d7SDag-Erling Smørgrav 93*7b5038d7SDag-Erling Smørgrav if (aaaa) { 94*7b5038d7SDag-Erling Smørgrav result = ldns_rr_list_clone(aaaa); 95*7b5038d7SDag-Erling Smørgrav } 96*7b5038d7SDag-Erling Smørgrav 97*7b5038d7SDag-Erling Smørgrav if (a) { 98*7b5038d7SDag-Erling Smørgrav result = ldns_rr_list_clone(a); 99*7b5038d7SDag-Erling Smørgrav } 100*7b5038d7SDag-Erling Smørgrav 101*7b5038d7SDag-Erling Smørgrav ldns_rr_list_deep_free(aaaa); 102*7b5038d7SDag-Erling Smørgrav ldns_rr_list_deep_free(a); 103*7b5038d7SDag-Erling Smørgrav return result; 104*7b5038d7SDag-Erling Smørgrav } 105*7b5038d7SDag-Erling Smørgrav 106*7b5038d7SDag-Erling Smørgrav ldns_rr_list * 107*7b5038d7SDag-Erling Smørgrav ldns_get_rr_list_name_by_addr(ldns_resolver *res, ldns_rdf *addr, ldns_rr_class c, 108*7b5038d7SDag-Erling Smørgrav uint16_t flags) 109*7b5038d7SDag-Erling Smørgrav { 110*7b5038d7SDag-Erling Smørgrav ldns_pkt *pkt; 111*7b5038d7SDag-Erling Smørgrav ldns_rr_list *names; 112*7b5038d7SDag-Erling Smørgrav ldns_rdf *name; 113*7b5038d7SDag-Erling Smørgrav 114*7b5038d7SDag-Erling Smørgrav names = NULL; 115*7b5038d7SDag-Erling Smørgrav 116*7b5038d7SDag-Erling Smørgrav if (!res || !addr) { 117*7b5038d7SDag-Erling Smørgrav return NULL; 118*7b5038d7SDag-Erling Smørgrav } 119*7b5038d7SDag-Erling Smørgrav 120*7b5038d7SDag-Erling Smørgrav if (ldns_rdf_get_type(addr) != LDNS_RDF_TYPE_A && 121*7b5038d7SDag-Erling Smørgrav ldns_rdf_get_type(addr) != LDNS_RDF_TYPE_AAAA) { 122*7b5038d7SDag-Erling Smørgrav return NULL; 123*7b5038d7SDag-Erling Smørgrav } 124*7b5038d7SDag-Erling Smørgrav 125*7b5038d7SDag-Erling Smørgrav name = ldns_rdf_address_reverse(addr); 126*7b5038d7SDag-Erling Smørgrav 127*7b5038d7SDag-Erling Smørgrav /* add the RD flags, because we want an answer */ 128*7b5038d7SDag-Erling Smørgrav pkt = ldns_resolver_query(res, name, LDNS_RR_TYPE_PTR, c, flags | LDNS_RD); 129*7b5038d7SDag-Erling Smørgrav if (pkt) { 130*7b5038d7SDag-Erling Smørgrav /* extract the data we need */ 131*7b5038d7SDag-Erling Smørgrav names = ldns_pkt_rr_list_by_type(pkt, 132*7b5038d7SDag-Erling Smørgrav LDNS_RR_TYPE_PTR, LDNS_SECTION_ANSWER); 133*7b5038d7SDag-Erling Smørgrav } 134*7b5038d7SDag-Erling Smørgrav return names; 135*7b5038d7SDag-Erling Smørgrav } 136*7b5038d7SDag-Erling Smørgrav 137*7b5038d7SDag-Erling Smørgrav /* read a line, put it in a buffer, parse the buffer */ 138*7b5038d7SDag-Erling Smørgrav ldns_rr_list * 139*7b5038d7SDag-Erling Smørgrav ldns_get_rr_list_hosts_frm_fp(FILE *fp) 140*7b5038d7SDag-Erling Smørgrav { 141*7b5038d7SDag-Erling Smørgrav return ldns_get_rr_list_hosts_frm_fp_l(fp, NULL); 142*7b5038d7SDag-Erling Smørgrav } 143*7b5038d7SDag-Erling Smørgrav 144*7b5038d7SDag-Erling Smørgrav ldns_rr_list * 145*7b5038d7SDag-Erling Smørgrav ldns_get_rr_list_hosts_frm_fp_l(FILE *fp, int *line_nr) 146*7b5038d7SDag-Erling Smørgrav { 147*7b5038d7SDag-Erling Smørgrav ssize_t i, j; 148*7b5038d7SDag-Erling Smørgrav size_t cnt; 149*7b5038d7SDag-Erling Smørgrav char *line; 150*7b5038d7SDag-Erling Smørgrav char *word; 151*7b5038d7SDag-Erling Smørgrav char *addr; 152*7b5038d7SDag-Erling Smørgrav char *rr_str; 153*7b5038d7SDag-Erling Smørgrav ldns_buffer *linebuf; 154*7b5038d7SDag-Erling Smørgrav ldns_rr *rr; 155*7b5038d7SDag-Erling Smørgrav ldns_rr_list *list; 156*7b5038d7SDag-Erling Smørgrav ldns_rdf *tmp; 157*7b5038d7SDag-Erling Smørgrav bool ip6; 158*7b5038d7SDag-Erling Smørgrav ldns_status parse_result; 159*7b5038d7SDag-Erling Smørgrav 160*7b5038d7SDag-Erling Smørgrav line = LDNS_XMALLOC(char, LDNS_MAX_LINELEN + 1); 161*7b5038d7SDag-Erling Smørgrav word = LDNS_XMALLOC(char, LDNS_MAX_LINELEN + 1); 162*7b5038d7SDag-Erling Smørgrav addr = LDNS_XMALLOC(char, LDNS_MAX_LINELEN + 1); 163*7b5038d7SDag-Erling Smørgrav rr_str = LDNS_XMALLOC(char, LDNS_MAX_LINELEN + 1); 164*7b5038d7SDag-Erling Smørgrav ip6 = false; 165*7b5038d7SDag-Erling Smørgrav list = ldns_rr_list_new(); 166*7b5038d7SDag-Erling Smørgrav rr = NULL; 167*7b5038d7SDag-Erling Smørgrav if(!line || !word || !addr || !rr_str || !list) { 168*7b5038d7SDag-Erling Smørgrav LDNS_FREE(line); 169*7b5038d7SDag-Erling Smørgrav LDNS_FREE(word); 170*7b5038d7SDag-Erling Smørgrav LDNS_FREE(addr); 171*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rr_str); 172*7b5038d7SDag-Erling Smørgrav ldns_rr_list_free(list); 173*7b5038d7SDag-Erling Smørgrav return NULL; 174*7b5038d7SDag-Erling Smørgrav } 175*7b5038d7SDag-Erling Smørgrav 176*7b5038d7SDag-Erling Smørgrav for(i = ldns_fget_token_l(fp, line, "\n", LDNS_MAX_LINELEN, line_nr); 177*7b5038d7SDag-Erling Smørgrav i > 0; i = ldns_fget_token_l(fp, line, "\n", LDNS_MAX_LINELEN, line_nr)) { 178*7b5038d7SDag-Erling Smørgrav /* # is comment */ 179*7b5038d7SDag-Erling Smørgrav if (line[0] == '#') { 180*7b5038d7SDag-Erling Smørgrav continue; 181*7b5038d7SDag-Erling Smørgrav } 182*7b5038d7SDag-Erling Smørgrav /* put it in a buffer for further processing */ 183*7b5038d7SDag-Erling Smørgrav linebuf = LDNS_MALLOC(ldns_buffer); 184*7b5038d7SDag-Erling Smørgrav if(!linebuf) { 185*7b5038d7SDag-Erling Smørgrav LDNS_FREE(line); 186*7b5038d7SDag-Erling Smørgrav LDNS_FREE(word); 187*7b5038d7SDag-Erling Smørgrav LDNS_FREE(addr); 188*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rr_str); 189*7b5038d7SDag-Erling Smørgrav ldns_rr_list_deep_free(list); 190*7b5038d7SDag-Erling Smørgrav return NULL; 191*7b5038d7SDag-Erling Smørgrav } 192*7b5038d7SDag-Erling Smørgrav 193*7b5038d7SDag-Erling Smørgrav ldns_buffer_new_frm_data(linebuf, line, (size_t) i); 194*7b5038d7SDag-Erling Smørgrav for(cnt = 0, j = ldns_bget_token(linebuf, word, LDNS_PARSE_NO_NL, LDNS_MAX_LINELEN); 195*7b5038d7SDag-Erling Smørgrav j > 0; 196*7b5038d7SDag-Erling Smørgrav j = ldns_bget_token(linebuf, word, LDNS_PARSE_NO_NL, LDNS_MAX_LINELEN), cnt++) { 197*7b5038d7SDag-Erling Smørgrav if (cnt == 0) { 198*7b5038d7SDag-Erling Smørgrav /* the address */ 199*7b5038d7SDag-Erling Smørgrav if ((tmp = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_AAAA, 200*7b5038d7SDag-Erling Smørgrav word))) { 201*7b5038d7SDag-Erling Smørgrav /* ip6 */ 202*7b5038d7SDag-Erling Smørgrav ldns_rdf_deep_free(tmp); 203*7b5038d7SDag-Erling Smørgrav ip6 = true; 204*7b5038d7SDag-Erling Smørgrav } else { 205*7b5038d7SDag-Erling Smørgrav if ((tmp = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_A, 206*7b5038d7SDag-Erling Smørgrav word))) { 207*7b5038d7SDag-Erling Smørgrav /* ip4 */ 208*7b5038d7SDag-Erling Smørgrav ldns_rdf_deep_free(tmp); 209*7b5038d7SDag-Erling Smørgrav ip6 = false; 210*7b5038d7SDag-Erling Smørgrav } else { 211*7b5038d7SDag-Erling Smørgrav /* kaput */ 212*7b5038d7SDag-Erling Smørgrav break; 213*7b5038d7SDag-Erling Smørgrav } 214*7b5038d7SDag-Erling Smørgrav } 215*7b5038d7SDag-Erling Smørgrav (void)strlcpy(addr, word, LDNS_MAX_LINELEN+1); 216*7b5038d7SDag-Erling Smørgrav } else { 217*7b5038d7SDag-Erling Smørgrav /* la al la la */ 218*7b5038d7SDag-Erling Smørgrav if (ip6) { 219*7b5038d7SDag-Erling Smørgrav snprintf(rr_str, LDNS_MAX_LINELEN, 220*7b5038d7SDag-Erling Smørgrav "%s IN AAAA %s", word, addr); 221*7b5038d7SDag-Erling Smørgrav } else { 222*7b5038d7SDag-Erling Smørgrav snprintf(rr_str, LDNS_MAX_LINELEN, 223*7b5038d7SDag-Erling Smørgrav "%s IN A %s", word, addr); 224*7b5038d7SDag-Erling Smørgrav } 225*7b5038d7SDag-Erling Smørgrav parse_result = ldns_rr_new_frm_str(&rr, rr_str, 0, NULL, NULL); 226*7b5038d7SDag-Erling Smørgrav if (parse_result == LDNS_STATUS_OK && ldns_rr_owner(rr) && ldns_rr_rd_count(rr) > 0) { 227*7b5038d7SDag-Erling Smørgrav ldns_rr_list_push_rr(list, ldns_rr_clone(rr)); 228*7b5038d7SDag-Erling Smørgrav } 229*7b5038d7SDag-Erling Smørgrav ldns_rr_free(rr); 230*7b5038d7SDag-Erling Smørgrav } 231*7b5038d7SDag-Erling Smørgrav } 232*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(linebuf); 233*7b5038d7SDag-Erling Smørgrav } 234*7b5038d7SDag-Erling Smørgrav LDNS_FREE(line); 235*7b5038d7SDag-Erling Smørgrav LDNS_FREE(word); 236*7b5038d7SDag-Erling Smørgrav LDNS_FREE(addr); 237*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rr_str); 238*7b5038d7SDag-Erling Smørgrav return list; 239*7b5038d7SDag-Erling Smørgrav } 240*7b5038d7SDag-Erling Smørgrav 241*7b5038d7SDag-Erling Smørgrav ldns_rr_list * 242*7b5038d7SDag-Erling Smørgrav ldns_get_rr_list_hosts_frm_file(char *filename) 243*7b5038d7SDag-Erling Smørgrav { 244*7b5038d7SDag-Erling Smørgrav ldns_rr_list *names; 245*7b5038d7SDag-Erling Smørgrav FILE *fp; 246*7b5038d7SDag-Erling Smørgrav 247*7b5038d7SDag-Erling Smørgrav if (!filename) { 248*7b5038d7SDag-Erling Smørgrav fp = fopen(LDNS_RESOLV_HOSTS, "r"); 249*7b5038d7SDag-Erling Smørgrav 250*7b5038d7SDag-Erling Smørgrav } else { 251*7b5038d7SDag-Erling Smørgrav fp = fopen(filename, "r"); 252*7b5038d7SDag-Erling Smørgrav } 253*7b5038d7SDag-Erling Smørgrav if (!fp) { 254*7b5038d7SDag-Erling Smørgrav return NULL; 255*7b5038d7SDag-Erling Smørgrav } 256*7b5038d7SDag-Erling Smørgrav 257*7b5038d7SDag-Erling Smørgrav names = ldns_get_rr_list_hosts_frm_fp(fp); 258*7b5038d7SDag-Erling Smørgrav fclose(fp); 259*7b5038d7SDag-Erling Smørgrav return names; 260*7b5038d7SDag-Erling Smørgrav } 261*7b5038d7SDag-Erling Smørgrav 262*7b5038d7SDag-Erling Smørgrav uint16_t 263*7b5038d7SDag-Erling Smørgrav ldns_getaddrinfo(ldns_resolver *res, ldns_rdf *node, ldns_rr_class c, 264*7b5038d7SDag-Erling Smørgrav ldns_rr_list **ret) 265*7b5038d7SDag-Erling Smørgrav { 266*7b5038d7SDag-Erling Smørgrav ldns_rdf_type t; 267*7b5038d7SDag-Erling Smørgrav uint16_t names_found; 268*7b5038d7SDag-Erling Smørgrav ldns_resolver *r; 269*7b5038d7SDag-Erling Smørgrav ldns_status s; 270*7b5038d7SDag-Erling Smørgrav 271*7b5038d7SDag-Erling Smørgrav t = ldns_rdf_get_type(node); 272*7b5038d7SDag-Erling Smørgrav names_found = 0; 273*7b5038d7SDag-Erling Smørgrav r = res; 274*7b5038d7SDag-Erling Smørgrav 275*7b5038d7SDag-Erling Smørgrav if (res == NULL) { 276*7b5038d7SDag-Erling Smørgrav /* prepare a new resolver, using /etc/resolv.conf as a guide */ 277*7b5038d7SDag-Erling Smørgrav s = ldns_resolver_new_frm_file(&r, NULL); 278*7b5038d7SDag-Erling Smørgrav if (s != LDNS_STATUS_OK) { 279*7b5038d7SDag-Erling Smørgrav return 0; 280*7b5038d7SDag-Erling Smørgrav } 281*7b5038d7SDag-Erling Smørgrav } 282*7b5038d7SDag-Erling Smørgrav 283*7b5038d7SDag-Erling Smørgrav if (t == LDNS_RDF_TYPE_DNAME) { 284*7b5038d7SDag-Erling Smørgrav /* we're asked to query for a name */ 285*7b5038d7SDag-Erling Smørgrav *ret = ldns_get_rr_list_addr_by_name(r, node, c, 0); 286*7b5038d7SDag-Erling Smørgrav names_found = ldns_rr_list_rr_count(*ret); 287*7b5038d7SDag-Erling Smørgrav } 288*7b5038d7SDag-Erling Smørgrav 289*7b5038d7SDag-Erling Smørgrav if (t == LDNS_RDF_TYPE_A || t == LDNS_RDF_TYPE_AAAA) { 290*7b5038d7SDag-Erling Smørgrav /* an address */ 291*7b5038d7SDag-Erling Smørgrav *ret = ldns_get_rr_list_name_by_addr(r, node, c, 0); 292*7b5038d7SDag-Erling Smørgrav names_found = ldns_rr_list_rr_count(*ret); 293*7b5038d7SDag-Erling Smørgrav } 294*7b5038d7SDag-Erling Smørgrav 295*7b5038d7SDag-Erling Smørgrav if (res == NULL) { 296*7b5038d7SDag-Erling Smørgrav ldns_resolver_deep_free(r); 297*7b5038d7SDag-Erling Smørgrav } 298*7b5038d7SDag-Erling Smørgrav 299*7b5038d7SDag-Erling Smørgrav return names_found; 300*7b5038d7SDag-Erling Smørgrav } 301*7b5038d7SDag-Erling Smørgrav 302*7b5038d7SDag-Erling Smørgrav bool 303*7b5038d7SDag-Erling Smørgrav ldns_nsec_type_check(ldns_rr *nsec, ldns_rr_type t) 304*7b5038d7SDag-Erling Smørgrav { 305*7b5038d7SDag-Erling Smørgrav /* does the nsec cover the t given? */ 306*7b5038d7SDag-Erling Smørgrav /* copied from host2str.c line 465: ldns_rdf2buffer_str_nsec */ 307*7b5038d7SDag-Erling Smørgrav uint8_t window_block_nr; 308*7b5038d7SDag-Erling Smørgrav uint8_t bitmap_length; 309*7b5038d7SDag-Erling Smørgrav uint16_t type; 310*7b5038d7SDag-Erling Smørgrav uint16_t pos = 0; 311*7b5038d7SDag-Erling Smørgrav uint16_t bit_pos; 312*7b5038d7SDag-Erling Smørgrav ldns_rdf *nsec_type_list = ldns_rr_rdf(nsec, 1); 313*7b5038d7SDag-Erling Smørgrav uint8_t *data; 314*7b5038d7SDag-Erling Smørgrav 315*7b5038d7SDag-Erling Smørgrav if (nsec_type_list == NULL) { 316*7b5038d7SDag-Erling Smørgrav return false; 317*7b5038d7SDag-Erling Smørgrav } 318*7b5038d7SDag-Erling Smørgrav data = ldns_rdf_data(nsec_type_list); 319*7b5038d7SDag-Erling Smørgrav 320*7b5038d7SDag-Erling Smørgrav while(pos < ldns_rdf_size(nsec_type_list)) { 321*7b5038d7SDag-Erling Smørgrav window_block_nr = data[pos]; 322*7b5038d7SDag-Erling Smørgrav bitmap_length = data[pos + 1]; 323*7b5038d7SDag-Erling Smørgrav pos += 2; 324*7b5038d7SDag-Erling Smørgrav 325*7b5038d7SDag-Erling Smørgrav for (bit_pos = 0; bit_pos < (bitmap_length) * 8; bit_pos++) { 326*7b5038d7SDag-Erling Smørgrav if (ldns_get_bit(&data[pos], bit_pos)) { 327*7b5038d7SDag-Erling Smørgrav type = 256 * (uint16_t) window_block_nr + bit_pos; 328*7b5038d7SDag-Erling Smørgrav 329*7b5038d7SDag-Erling Smørgrav if ((ldns_rr_type)type == t) { 330*7b5038d7SDag-Erling Smørgrav /* we have a winner */ 331*7b5038d7SDag-Erling Smørgrav return true; 332*7b5038d7SDag-Erling Smørgrav } 333*7b5038d7SDag-Erling Smørgrav } 334*7b5038d7SDag-Erling Smørgrav } 335*7b5038d7SDag-Erling Smørgrav pos += (uint16_t) bitmap_length; 336*7b5038d7SDag-Erling Smørgrav } 337*7b5038d7SDag-Erling Smørgrav return false; 338*7b5038d7SDag-Erling Smørgrav } 339*7b5038d7SDag-Erling Smørgrav 340*7b5038d7SDag-Erling Smørgrav void 341*7b5038d7SDag-Erling Smørgrav ldns_print_rr_rdf(FILE *fp, ldns_rr *r, int rdfnum, ...) 342*7b5038d7SDag-Erling Smørgrav { 343*7b5038d7SDag-Erling Smørgrav int16_t rdf; 344*7b5038d7SDag-Erling Smørgrav ldns_rdf *rd; 345*7b5038d7SDag-Erling Smørgrav va_list va_rdf; 346*7b5038d7SDag-Erling Smørgrav va_start(va_rdf, rdfnum); 347*7b5038d7SDag-Erling Smørgrav 348*7b5038d7SDag-Erling Smørgrav for (rdf = (int16_t)rdfnum; rdf != -1; rdf = (int16_t)va_arg(va_rdf, int)) 349*7b5038d7SDag-Erling Smørgrav { 350*7b5038d7SDag-Erling Smørgrav rd = ldns_rr_rdf(r, rdf); 351*7b5038d7SDag-Erling Smørgrav if (!rd) { 352*7b5038d7SDag-Erling Smørgrav continue; 353*7b5038d7SDag-Erling Smørgrav } else { 354*7b5038d7SDag-Erling Smørgrav ldns_rdf_print(fp, rd); 355*7b5038d7SDag-Erling Smørgrav fprintf(fp, " "); /* not sure if we want to do this */ 356*7b5038d7SDag-Erling Smørgrav } 357*7b5038d7SDag-Erling Smørgrav } 358*7b5038d7SDag-Erling Smørgrav va_end(va_rdf); 359*7b5038d7SDag-Erling Smørgrav } 360