186d7f5d3SJohn Marino /*
286d7f5d3SJohn Marino * root.c
386d7f5d3SJohn Marino * Function to handle to the rootservers
486d7f5d3SJohn Marino * and to update and prime them
586d7f5d3SJohn Marino * (c) 2005 NLnet Labs
686d7f5d3SJohn Marino *
786d7f5d3SJohn Marino * See the file LICENSE for the license
886d7f5d3SJohn Marino *
986d7f5d3SJohn Marino */
1086d7f5d3SJohn Marino
1186d7f5d3SJohn Marino #include "drill.h"
1286d7f5d3SJohn Marino #include <ldns/ldns.h>
1386d7f5d3SJohn Marino #include <errno.h>
1486d7f5d3SJohn Marino
1586d7f5d3SJohn Marino /* a global list of the root-servers */
1686d7f5d3SJohn Marino ldns_rr_list *global_dns_root = NULL;
1786d7f5d3SJohn Marino
1886d7f5d3SJohn Marino /* put a hardcoded list in the root and
1986d7f5d3SJohn Marino * init the root rrlist structure */
2086d7f5d3SJohn Marino void
init_root(void)2186d7f5d3SJohn Marino init_root(void)
2286d7f5d3SJohn Marino {
2386d7f5d3SJohn Marino ldns_rr *r;
2486d7f5d3SJohn Marino
2586d7f5d3SJohn Marino global_dns_root = ldns_rr_list_new();
2686d7f5d3SJohn Marino
2786d7f5d3SJohn Marino (void)ldns_rr_new_frm_str(&r, "A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4", 0, NULL, NULL);
2886d7f5d3SJohn Marino ldns_rr_list_push_rr(global_dns_root, r);
2986d7f5d3SJohn Marino (void)ldns_rr_new_frm_str(&r, "A.ROOT-SERVERS.NET. 3600000 AAAA 2001:503:BA3E::2:30", 0, NULL, NULL);
3086d7f5d3SJohn Marino ldns_rr_list_push_rr(global_dns_root, r);
3186d7f5d3SJohn Marino (void)ldns_rr_new_frm_str(&r, "B.ROOT-SERVERS.NET. 3600000 A 192.228.79.201", 0, NULL, NULL);
3286d7f5d3SJohn Marino ldns_rr_list_push_rr(global_dns_root, r);
3386d7f5d3SJohn Marino (void)ldns_rr_new_frm_str(&r, "C.ROOT-SERVERS.NET. 3600000 A 192.33.4.12", 0, NULL, NULL);
3486d7f5d3SJohn Marino ldns_rr_list_push_rr(global_dns_root, r);
3586d7f5d3SJohn Marino (void)ldns_rr_new_frm_str(&r, "D.ROOT-SERVERS.NET. 3600000 A 128.8.10.90", 0, NULL, NULL);
3686d7f5d3SJohn Marino ldns_rr_list_push_rr(global_dns_root, r);
3786d7f5d3SJohn Marino (void)ldns_rr_new_frm_str(&r, "E.ROOT-SERVERS.NET. 3600000 A 192.203.230.10", 0, NULL, NULL);
3886d7f5d3SJohn Marino ldns_rr_list_push_rr(global_dns_root, r);
3986d7f5d3SJohn Marino (void)ldns_rr_new_frm_str(&r, "F.ROOT-SERVERS.NET. 3600000 A 192.5.5.241", 0, NULL, NULL);
4086d7f5d3SJohn Marino ldns_rr_list_push_rr(global_dns_root, r);
4186d7f5d3SJohn Marino (void)ldns_rr_new_frm_str(&r, "F.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:2F::F", 0, NULL, NULL);
4286d7f5d3SJohn Marino ldns_rr_list_push_rr(global_dns_root, r);
4386d7f5d3SJohn Marino (void)ldns_rr_new_frm_str(&r, "G.ROOT-SERVERS.NET. 3600000 A 192.112.36.4", 0, NULL, NULL);
4486d7f5d3SJohn Marino ldns_rr_list_push_rr(global_dns_root, r);
4586d7f5d3SJohn Marino (void)ldns_rr_new_frm_str(&r, "H.ROOT-SERVERS.NET. 3600000 A 128.63.2.53", 0, NULL, NULL);
4686d7f5d3SJohn Marino ldns_rr_list_push_rr(global_dns_root, r);
4786d7f5d3SJohn Marino (void)ldns_rr_new_frm_str(&r, "H.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:1::803F:235", 0, NULL, NULL);
4886d7f5d3SJohn Marino ldns_rr_list_push_rr(global_dns_root, r);
4986d7f5d3SJohn Marino (void)ldns_rr_new_frm_str(&r, "I.ROOT-SERVERS.NET. 3600000 A 192.36.148.17", 0, NULL, NULL);
5086d7f5d3SJohn Marino ldns_rr_list_push_rr(global_dns_root, r);
5186d7f5d3SJohn Marino (void)ldns_rr_new_frm_str(&r, "J.ROOT-SERVERS.NET. 3600000 A 192.58.128.30", 0, NULL, NULL);
5286d7f5d3SJohn Marino ldns_rr_list_push_rr(global_dns_root, r);
5386d7f5d3SJohn Marino (void)ldns_rr_new_frm_str(&r, "J.ROOT-SERVERS.NET. 3600000 AAAA 2001:503:C27::2:30", 0, NULL, NULL);
5486d7f5d3SJohn Marino ldns_rr_list_push_rr(global_dns_root, r);
5586d7f5d3SJohn Marino (void)ldns_rr_new_frm_str(&r, "K.ROOT-SERVERS.NET. 3600000 A 193.0.14.129 ", 0, NULL, NULL);
5686d7f5d3SJohn Marino ldns_rr_list_push_rr(global_dns_root, r);
5786d7f5d3SJohn Marino (void)ldns_rr_new_frm_str(&r, "K.ROOT-SERVERS.NET. 3600000 AAAA 2001:7FD::1", 0, NULL, NULL);
5886d7f5d3SJohn Marino ldns_rr_list_push_rr(global_dns_root, r);
5986d7f5d3SJohn Marino (void)ldns_rr_new_frm_str(&r, "L.ROOT-SERVERS.NET. 3600000 A 199.7.83.42", 0, NULL, NULL);
6086d7f5d3SJohn Marino ldns_rr_list_push_rr(global_dns_root, r);
6186d7f5d3SJohn Marino (void)ldns_rr_new_frm_str(&r, "L.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:3::42 ", 0, NULL, NULL);
6286d7f5d3SJohn Marino ldns_rr_list_push_rr(global_dns_root, r);
6386d7f5d3SJohn Marino (void)ldns_rr_new_frm_str(&r, "M.ROOT-SERVERS.NET. 3600000 A 202.12.27.33", 0, NULL, NULL);
6486d7f5d3SJohn Marino ldns_rr_list_push_rr(global_dns_root, r);
6586d7f5d3SJohn Marino (void)ldns_rr_new_frm_str(&r, "M.ROOT-SERVERS.NET. 3600000 AAAA 2001:DC3::35", 0, NULL, NULL);
6686d7f5d3SJohn Marino ldns_rr_list_push_rr(global_dns_root, r);
6786d7f5d3SJohn Marino }
6886d7f5d3SJohn Marino
6986d7f5d3SJohn Marino /*
7086d7f5d3SJohn Marino * Read a hints file as root
7186d7f5d3SJohn Marino *
7286d7f5d3SJohn Marino * The file with the given path should contain a list of NS RRs
7386d7f5d3SJohn Marino * for the root zone and A records for those NS RRs.
7486d7f5d3SJohn Marino * Read them, check them, and append the a records to the rr list given.
7586d7f5d3SJohn Marino */
7686d7f5d3SJohn Marino ldns_rr_list *
read_root_hints(const char * filename)7786d7f5d3SJohn Marino read_root_hints(const char *filename)
7886d7f5d3SJohn Marino {
7986d7f5d3SJohn Marino FILE *fp = NULL;
8086d7f5d3SJohn Marino int line_nr = 0;
8186d7f5d3SJohn Marino ldns_zone *z;
8286d7f5d3SJohn Marino ldns_status status;
8386d7f5d3SJohn Marino ldns_rr_list *addresses = NULL;
8486d7f5d3SJohn Marino ldns_rr *rr;
8586d7f5d3SJohn Marino size_t i;
8686d7f5d3SJohn Marino
8786d7f5d3SJohn Marino fp = fopen(filename, "r");
8886d7f5d3SJohn Marino if (!fp) {
8986d7f5d3SJohn Marino fprintf(stderr, "Unable to open %s for reading: %s\n", filename, strerror(errno));
9086d7f5d3SJohn Marino return NULL;
9186d7f5d3SJohn Marino }
9286d7f5d3SJohn Marino
9386d7f5d3SJohn Marino status = ldns_zone_new_frm_fp_l(&z, fp, NULL, 0, 0, &line_nr);
9486d7f5d3SJohn Marino fclose(fp);
9586d7f5d3SJohn Marino if (status != LDNS_STATUS_OK) {
9686d7f5d3SJohn Marino fprintf(stderr, "Error reading root hints file: %s\n", ldns_get_errorstr_by_id(status));
9786d7f5d3SJohn Marino return NULL;
9886d7f5d3SJohn Marino } else {
9986d7f5d3SJohn Marino addresses = ldns_rr_list_new();
10086d7f5d3SJohn Marino for (i = 0; i < ldns_rr_list_rr_count(ldns_zone_rrs(z)); i++) {
10186d7f5d3SJohn Marino rr = ldns_rr_list_rr(ldns_zone_rrs(z), i);
10286d7f5d3SJohn Marino /*if ((address_family == 0 || address_family == 1) &&
10386d7f5d3SJohn Marino */
10486d7f5d3SJohn Marino if ( ldns_rr_get_type(rr) == LDNS_RR_TYPE_A ) {
10586d7f5d3SJohn Marino ldns_rr_list_push_rr(addresses, ldns_rr_clone(rr));
10686d7f5d3SJohn Marino }
10786d7f5d3SJohn Marino /*if ((address_family == 0 || address_family == 2) &&*/
10886d7f5d3SJohn Marino if ( ldns_rr_get_type(rr) == LDNS_RR_TYPE_AAAA) {
10986d7f5d3SJohn Marino ldns_rr_list_push_rr(addresses, ldns_rr_clone(rr));
11086d7f5d3SJohn Marino }
11186d7f5d3SJohn Marino }
11286d7f5d3SJohn Marino ldns_zone_deep_free(z);
11386d7f5d3SJohn Marino return addresses;
11486d7f5d3SJohn Marino }
11586d7f5d3SJohn Marino }
11686d7f5d3SJohn Marino
11786d7f5d3SJohn Marino
11886d7f5d3SJohn Marino void
clear_root(void)11986d7f5d3SJohn Marino clear_root(void)
12086d7f5d3SJohn Marino {
12186d7f5d3SJohn Marino ldns_rr_list_deep_free(global_dns_root);
12286d7f5d3SJohn Marino }
123