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