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