xref: /freebsd/contrib/ldns/drill/root.c (revision 7b5038d7)
1*7b5038d7SDag-Erling Smørgrav /*
2*7b5038d7SDag-Erling Smørgrav  * root.c
3*7b5038d7SDag-Erling Smørgrav  * Function to handle to the rootservers
4*7b5038d7SDag-Erling Smørgrav  * and to update and prime them
5*7b5038d7SDag-Erling Smørgrav  * (c) 2005 NLnet Labs
6*7b5038d7SDag-Erling Smørgrav  *
7*7b5038d7SDag-Erling Smørgrav  * See the file LICENSE for the license
8*7b5038d7SDag-Erling Smørgrav  *
9*7b5038d7SDag-Erling Smørgrav  */
10*7b5038d7SDag-Erling Smørgrav 
11*7b5038d7SDag-Erling Smørgrav #include "drill.h"
12*7b5038d7SDag-Erling Smørgrav #include <ldns/ldns.h>
13*7b5038d7SDag-Erling Smørgrav #include <errno.h>
14*7b5038d7SDag-Erling Smørgrav 
15*7b5038d7SDag-Erling Smørgrav /* a global list of the root-servers */
16*7b5038d7SDag-Erling Smørgrav ldns_rr_list *global_dns_root = NULL;
17*7b5038d7SDag-Erling Smørgrav 
18*7b5038d7SDag-Erling Smørgrav /* put a hardcoded list in the root and
19*7b5038d7SDag-Erling Smørgrav  * init the root rrlist structure */
20*7b5038d7SDag-Erling Smørgrav void
init_root(void)21*7b5038d7SDag-Erling Smørgrav init_root(void)
22*7b5038d7SDag-Erling Smørgrav {
23*7b5038d7SDag-Erling Smørgrav 	ldns_rr *r;
24*7b5038d7SDag-Erling Smørgrav 
25*7b5038d7SDag-Erling Smørgrav 	global_dns_root = ldns_rr_list_new();
26*7b5038d7SDag-Erling Smørgrav 
27*7b5038d7SDag-Erling Smørgrav 	(void)ldns_rr_new_frm_str(&r, "A.ROOT-SERVERS.NET.      3600000      A     198.41.0.4", 0, NULL, NULL);
28*7b5038d7SDag-Erling Smørgrav 	ldns_rr_list_push_rr(global_dns_root, r);
29*7b5038d7SDag-Erling Smørgrav 	(void)ldns_rr_new_frm_str(&r, "A.ROOT-SERVERS.NET.      3600000      AAAA  2001:503:BA3E::2:30", 0, NULL, NULL);
30*7b5038d7SDag-Erling Smørgrav 	ldns_rr_list_push_rr(global_dns_root, r);
31*7b5038d7SDag-Erling Smørgrav 	(void)ldns_rr_new_frm_str(&r, "B.ROOT-SERVERS.NET.      3600000      A     192.228.79.201", 0, NULL, NULL);
32*7b5038d7SDag-Erling Smørgrav 	ldns_rr_list_push_rr(global_dns_root, r);
33*7b5038d7SDag-Erling Smørgrav 	(void)ldns_rr_new_frm_str(&r, "C.ROOT-SERVERS.NET.      3600000      A     192.33.4.12", 0, NULL, NULL);
34*7b5038d7SDag-Erling Smørgrav 	ldns_rr_list_push_rr(global_dns_root, r);
35*7b5038d7SDag-Erling Smørgrav 	(void)ldns_rr_new_frm_str(&r, "D.ROOT-SERVERS.NET.      3600000      A     128.8.10.90", 0, NULL, NULL);
36*7b5038d7SDag-Erling Smørgrav 	ldns_rr_list_push_rr(global_dns_root, r);
37*7b5038d7SDag-Erling Smørgrav 	(void)ldns_rr_new_frm_str(&r, "E.ROOT-SERVERS.NET.      3600000      A     192.203.230.10", 0, NULL, NULL);
38*7b5038d7SDag-Erling Smørgrav 	ldns_rr_list_push_rr(global_dns_root, r);
39*7b5038d7SDag-Erling Smørgrav 	(void)ldns_rr_new_frm_str(&r, "F.ROOT-SERVERS.NET.      3600000      A     192.5.5.241", 0, NULL, NULL);
40*7b5038d7SDag-Erling Smørgrav 	ldns_rr_list_push_rr(global_dns_root, r);
41*7b5038d7SDag-Erling Smørgrav 	(void)ldns_rr_new_frm_str(&r, "F.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:2F::F", 0, NULL, NULL);
42*7b5038d7SDag-Erling Smørgrav 	ldns_rr_list_push_rr(global_dns_root, r);
43*7b5038d7SDag-Erling Smørgrav 	(void)ldns_rr_new_frm_str(&r, "G.ROOT-SERVERS.NET.      3600000      A     192.112.36.4", 0, NULL, NULL);
44*7b5038d7SDag-Erling Smørgrav 	ldns_rr_list_push_rr(global_dns_root, r);
45*7b5038d7SDag-Erling Smørgrav 	(void)ldns_rr_new_frm_str(&r, "H.ROOT-SERVERS.NET.      3600000      A     128.63.2.53", 0, NULL, NULL);
46*7b5038d7SDag-Erling Smørgrav 	ldns_rr_list_push_rr(global_dns_root, r);
47*7b5038d7SDag-Erling Smørgrav 	(void)ldns_rr_new_frm_str(&r, "H.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:1::803F:235", 0, NULL, NULL);
48*7b5038d7SDag-Erling Smørgrav 	ldns_rr_list_push_rr(global_dns_root, r);
49*7b5038d7SDag-Erling Smørgrav 	(void)ldns_rr_new_frm_str(&r, "I.ROOT-SERVERS.NET.      3600000      A     192.36.148.17", 0, NULL, NULL);
50*7b5038d7SDag-Erling Smørgrav 	ldns_rr_list_push_rr(global_dns_root, r);
51*7b5038d7SDag-Erling Smørgrav 	(void)ldns_rr_new_frm_str(&r, "J.ROOT-SERVERS.NET.      3600000      A     192.58.128.30", 0, NULL, NULL);
52*7b5038d7SDag-Erling Smørgrav 	ldns_rr_list_push_rr(global_dns_root, r);
53*7b5038d7SDag-Erling Smørgrav 	(void)ldns_rr_new_frm_str(&r, "J.ROOT-SERVERS.NET.      3600000      AAAA  2001:503:C27::2:30", 0, NULL, NULL);
54*7b5038d7SDag-Erling Smørgrav 	ldns_rr_list_push_rr(global_dns_root, r);
55*7b5038d7SDag-Erling Smørgrav 	(void)ldns_rr_new_frm_str(&r, "K.ROOT-SERVERS.NET.      3600000      A     193.0.14.129 ", 0, NULL, NULL);
56*7b5038d7SDag-Erling Smørgrav 	ldns_rr_list_push_rr(global_dns_root, r);
57*7b5038d7SDag-Erling Smørgrav 	(void)ldns_rr_new_frm_str(&r, "K.ROOT-SERVERS.NET.      3600000      AAAA  2001:7FD::1", 0, NULL, NULL);
58*7b5038d7SDag-Erling Smørgrav 	ldns_rr_list_push_rr(global_dns_root, r);
59*7b5038d7SDag-Erling Smørgrav 	(void)ldns_rr_new_frm_str(&r, "L.ROOT-SERVERS.NET.      3600000      A     199.7.83.42", 0, NULL, NULL);
60*7b5038d7SDag-Erling Smørgrav 	ldns_rr_list_push_rr(global_dns_root, r);
61*7b5038d7SDag-Erling Smørgrav 	(void)ldns_rr_new_frm_str(&r, "L.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:3::42   ", 0, NULL, NULL);
62*7b5038d7SDag-Erling Smørgrav 	ldns_rr_list_push_rr(global_dns_root, r);
63*7b5038d7SDag-Erling Smørgrav 	(void)ldns_rr_new_frm_str(&r, "M.ROOT-SERVERS.NET.      3600000      A     202.12.27.33", 0, NULL, NULL);
64*7b5038d7SDag-Erling Smørgrav 	ldns_rr_list_push_rr(global_dns_root, r);
65*7b5038d7SDag-Erling Smørgrav 	(void)ldns_rr_new_frm_str(&r, "M.ROOT-SERVERS.NET.      3600000      AAAA  2001:DC3::35", 0, NULL, NULL);
66*7b5038d7SDag-Erling Smørgrav 	ldns_rr_list_push_rr(global_dns_root, r);
67*7b5038d7SDag-Erling Smørgrav }
68*7b5038d7SDag-Erling Smørgrav 
69*7b5038d7SDag-Erling Smørgrav /*
70*7b5038d7SDag-Erling Smørgrav  * Read a hints file as root
71*7b5038d7SDag-Erling Smørgrav  *
72*7b5038d7SDag-Erling Smørgrav  * The file with the given path should contain a list of NS RRs
73*7b5038d7SDag-Erling Smørgrav  * for the root zone and A records for those NS RRs.
74*7b5038d7SDag-Erling Smørgrav  * Read them, check them, and append the a records to the rr list given.
75*7b5038d7SDag-Erling Smørgrav  */
76*7b5038d7SDag-Erling Smørgrav ldns_rr_list *
read_root_hints(const char * filename)77*7b5038d7SDag-Erling Smørgrav read_root_hints(const char *filename)
78*7b5038d7SDag-Erling Smørgrav {
79*7b5038d7SDag-Erling Smørgrav 	FILE *fp = NULL;
80*7b5038d7SDag-Erling Smørgrav 	int line_nr = 0;
81*7b5038d7SDag-Erling Smørgrav 	ldns_zone *z;
82*7b5038d7SDag-Erling Smørgrav 	ldns_status status;
83*7b5038d7SDag-Erling Smørgrav 	ldns_rr_list *addresses = NULL;
84*7b5038d7SDag-Erling Smørgrav 	ldns_rr *rr;
85*7b5038d7SDag-Erling Smørgrav 	size_t i;
86*7b5038d7SDag-Erling Smørgrav 
87*7b5038d7SDag-Erling Smørgrav 	fp = fopen(filename, "r");
88*7b5038d7SDag-Erling Smørgrav 	if (!fp) {
89*7b5038d7SDag-Erling Smørgrav 		fprintf(stderr, "Unable to open %s for reading: %s\n", filename, strerror(errno));
90*7b5038d7SDag-Erling Smørgrav 		return NULL;
91*7b5038d7SDag-Erling Smørgrav 	}
92*7b5038d7SDag-Erling Smørgrav 
93*7b5038d7SDag-Erling Smørgrav 	status = ldns_zone_new_frm_fp_l(&z, fp, NULL, 0, 0, &line_nr);
94*7b5038d7SDag-Erling Smørgrav 	fclose(fp);
95*7b5038d7SDag-Erling Smørgrav 	if (status != LDNS_STATUS_OK) {
96*7b5038d7SDag-Erling Smørgrav 		fprintf(stderr, "Error reading root hints file: %s\n", ldns_get_errorstr_by_id(status));
97*7b5038d7SDag-Erling Smørgrav 		return NULL;
98*7b5038d7SDag-Erling Smørgrav 	} else {
99*7b5038d7SDag-Erling Smørgrav 		addresses = ldns_rr_list_new();
100*7b5038d7SDag-Erling Smørgrav 		for (i = 0; i < ldns_rr_list_rr_count(ldns_zone_rrs(z)); i++) {
101*7b5038d7SDag-Erling Smørgrav 			rr = ldns_rr_list_rr(ldns_zone_rrs(z), i);
102*7b5038d7SDag-Erling Smørgrav 			/*if ((address_family == 0 || address_family == 1) &&
103*7b5038d7SDag-Erling Smørgrav 			*/
104*7b5038d7SDag-Erling Smørgrav 			if ( ldns_rr_get_type(rr) == LDNS_RR_TYPE_A ) {
105*7b5038d7SDag-Erling Smørgrav 				ldns_rr_list_push_rr(addresses, ldns_rr_clone(rr));
106*7b5038d7SDag-Erling Smørgrav 			}
107*7b5038d7SDag-Erling Smørgrav 			/*if ((address_family == 0 || address_family == 2) &&*/
108*7b5038d7SDag-Erling Smørgrav 			if ( ldns_rr_get_type(rr) == LDNS_RR_TYPE_AAAA) {
109*7b5038d7SDag-Erling Smørgrav 				ldns_rr_list_push_rr(addresses, ldns_rr_clone(rr));
110*7b5038d7SDag-Erling Smørgrav 			}
111*7b5038d7SDag-Erling Smørgrav 		}
112*7b5038d7SDag-Erling Smørgrav 		ldns_zone_deep_free(z);
113*7b5038d7SDag-Erling Smørgrav 		return addresses;
114*7b5038d7SDag-Erling Smørgrav 	}
115*7b5038d7SDag-Erling Smørgrav }
116*7b5038d7SDag-Erling Smørgrav 
117*7b5038d7SDag-Erling Smørgrav 
118*7b5038d7SDag-Erling Smørgrav void
clear_root(void)119*7b5038d7SDag-Erling Smørgrav clear_root(void)
120*7b5038d7SDag-Erling Smørgrav {
121*7b5038d7SDag-Erling Smørgrav 	ldns_rr_list_deep_free(global_dns_root);
122*7b5038d7SDag-Erling Smørgrav }
123