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 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 * 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 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