xref: /freebsd/contrib/ldns/higher.c (revision 7b5038d71c5c74ab863c1ff3fec33de94bf35a57)
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