1238104Sdes/* 2238104Sdes * root.c 3238104Sdes * Function to handle to the rootservers 4238104Sdes * and to update and prime them 5238104Sdes * (c) 2005 NLnet Labs 6238104Sdes * 7238104Sdes * See the file LICENSE for the license 8238104Sdes * 9238104Sdes */ 10238104Sdes 11238104Sdes#include "drill.h" 12238104Sdes#include <ldns/ldns.h> 13238104Sdes#include <errno.h> 14238104Sdes 15238104Sdes/* a global list of the root-servers */ 16238104Sdesldns_rr_list *global_dns_root = NULL; 17238104Sdes 18238104Sdes/* put a hardcoded list in the root and 19238104Sdes * init the root rrlist structure */ 20238104Sdesvoid 21238104Sdesinit_root(void) 22238104Sdes{ 23238104Sdes ldns_rr *r; 24238104Sdes 25238104Sdes global_dns_root = ldns_rr_list_new(); 26238104Sdes 27238104Sdes (void)ldns_rr_new_frm_str(&r, "A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4", 0, NULL, NULL); 28238104Sdes ldns_rr_list_push_rr(global_dns_root, r); 29238104Sdes (void)ldns_rr_new_frm_str(&r, "A.ROOT-SERVERS.NET. 3600000 AAAA 2001:503:BA3E::2:30", 0, NULL, NULL); 30238104Sdes ldns_rr_list_push_rr(global_dns_root, r); 31238104Sdes (void)ldns_rr_new_frm_str(&r, "B.ROOT-SERVERS.NET. 3600000 A 192.228.79.201", 0, NULL, NULL); 32238104Sdes ldns_rr_list_push_rr(global_dns_root, r); 33238104Sdes (void)ldns_rr_new_frm_str(&r, "C.ROOT-SERVERS.NET. 3600000 A 192.33.4.12", 0, NULL, NULL); 34238104Sdes ldns_rr_list_push_rr(global_dns_root, r); 35238104Sdes (void)ldns_rr_new_frm_str(&r, "D.ROOT-SERVERS.NET. 3600000 A 128.8.10.90", 0, NULL, NULL); 36238104Sdes ldns_rr_list_push_rr(global_dns_root, r); 37238104Sdes (void)ldns_rr_new_frm_str(&r, "E.ROOT-SERVERS.NET. 3600000 A 192.203.230.10", 0, NULL, NULL); 38238104Sdes ldns_rr_list_push_rr(global_dns_root, r); 39238104Sdes (void)ldns_rr_new_frm_str(&r, "F.ROOT-SERVERS.NET. 3600000 A 192.5.5.241", 0, NULL, NULL); 40238104Sdes ldns_rr_list_push_rr(global_dns_root, r); 41238104Sdes (void)ldns_rr_new_frm_str(&r, "F.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:2F::F", 0, NULL, NULL); 42238104Sdes ldns_rr_list_push_rr(global_dns_root, r); 43238104Sdes (void)ldns_rr_new_frm_str(&r, "G.ROOT-SERVERS.NET. 3600000 A 192.112.36.4", 0, NULL, NULL); 44238104Sdes ldns_rr_list_push_rr(global_dns_root, r); 45238104Sdes (void)ldns_rr_new_frm_str(&r, "H.ROOT-SERVERS.NET. 3600000 A 128.63.2.53", 0, NULL, NULL); 46238104Sdes ldns_rr_list_push_rr(global_dns_root, r); 47238104Sdes (void)ldns_rr_new_frm_str(&r, "H.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:1::803F:235", 0, NULL, NULL); 48238104Sdes ldns_rr_list_push_rr(global_dns_root, r); 49238104Sdes (void)ldns_rr_new_frm_str(&r, "I.ROOT-SERVERS.NET. 3600000 A 192.36.148.17", 0, NULL, NULL); 50238104Sdes ldns_rr_list_push_rr(global_dns_root, r); 51238104Sdes (void)ldns_rr_new_frm_str(&r, "J.ROOT-SERVERS.NET. 3600000 A 192.58.128.30", 0, NULL, NULL); 52238104Sdes ldns_rr_list_push_rr(global_dns_root, r); 53238104Sdes (void)ldns_rr_new_frm_str(&r, "J.ROOT-SERVERS.NET. 3600000 AAAA 2001:503:C27::2:30", 0, NULL, NULL); 54238104Sdes ldns_rr_list_push_rr(global_dns_root, r); 55238104Sdes (void)ldns_rr_new_frm_str(&r, "K.ROOT-SERVERS.NET. 3600000 A 193.0.14.129 ", 0, NULL, NULL); 56238104Sdes ldns_rr_list_push_rr(global_dns_root, r); 57238104Sdes (void)ldns_rr_new_frm_str(&r, "K.ROOT-SERVERS.NET. 3600000 AAAA 2001:7FD::1", 0, NULL, NULL); 58238104Sdes ldns_rr_list_push_rr(global_dns_root, r); 59238104Sdes (void)ldns_rr_new_frm_str(&r, "L.ROOT-SERVERS.NET. 3600000 A 199.7.83.42", 0, NULL, NULL); 60238104Sdes ldns_rr_list_push_rr(global_dns_root, r); 61238104Sdes (void)ldns_rr_new_frm_str(&r, "L.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:3::42 ", 0, NULL, NULL); 62238104Sdes ldns_rr_list_push_rr(global_dns_root, r); 63238104Sdes (void)ldns_rr_new_frm_str(&r, "M.ROOT-SERVERS.NET. 3600000 A 202.12.27.33", 0, NULL, NULL); 64238104Sdes ldns_rr_list_push_rr(global_dns_root, r); 65238104Sdes (void)ldns_rr_new_frm_str(&r, "M.ROOT-SERVERS.NET. 3600000 AAAA 2001:DC3::35", 0, NULL, NULL); 66238104Sdes ldns_rr_list_push_rr(global_dns_root, r); 67238104Sdes} 68238104Sdes 69238104Sdes/* 70238104Sdes * Read a hints file as root 71238104Sdes * 72238104Sdes * The file with the given path should contain a list of NS RRs 73238104Sdes * for the root zone and A records for those NS RRs. 74238104Sdes * Read them, check them, and append the a records to the rr list given. 75238104Sdes */ 76238104Sdesldns_rr_list * 77238104Sdesread_root_hints(const char *filename) 78238104Sdes{ 79238104Sdes FILE *fp = NULL; 80238104Sdes int line_nr = 0; 81238104Sdes ldns_zone *z; 82238104Sdes ldns_status status; 83238104Sdes ldns_rr_list *addresses = NULL; 84238104Sdes ldns_rr *rr; 85238104Sdes size_t i; 86238104Sdes 87238104Sdes fp = fopen(filename, "r"); 88238104Sdes if (!fp) { 89238104Sdes fprintf(stderr, "Unable to open %s for reading: %s\n", filename, strerror(errno)); 90238104Sdes return NULL; 91238104Sdes } 92238104Sdes 93238104Sdes status = ldns_zone_new_frm_fp_l(&z, fp, NULL, 0, 0, &line_nr); 94238104Sdes fclose(fp); 95238104Sdes if (status != LDNS_STATUS_OK) { 96238104Sdes fprintf(stderr, "Error reading root hints file: %s\n", ldns_get_errorstr_by_id(status)); 97238104Sdes return NULL; 98238104Sdes } else { 99238104Sdes addresses = ldns_rr_list_new(); 100238104Sdes for (i = 0; i < ldns_rr_list_rr_count(ldns_zone_rrs(z)); i++) { 101238104Sdes rr = ldns_rr_list_rr(ldns_zone_rrs(z), i); 102238104Sdes /*if ((address_family == 0 || address_family == 1) && 103238104Sdes */ 104238104Sdes if ( ldns_rr_get_type(rr) == LDNS_RR_TYPE_A ) { 105238104Sdes ldns_rr_list_push_rr(addresses, ldns_rr_clone(rr)); 106238104Sdes } 107238104Sdes /*if ((address_family == 0 || address_family == 2) &&*/ 108238104Sdes if ( ldns_rr_get_type(rr) == LDNS_RR_TYPE_AAAA) { 109238104Sdes ldns_rr_list_push_rr(addresses, ldns_rr_clone(rr)); 110238104Sdes } 111238104Sdes } 112238104Sdes ldns_zone_deep_free(z); 113238104Sdes return addresses; 114238104Sdes } 115238104Sdes} 116238104Sdes 117238104Sdes 118238104Sdesvoid 119238104Sdesclear_root(void) 120238104Sdes{ 121238104Sdes ldns_rr_list_deep_free(global_dns_root); 122238104Sdes} 123