1----------------------------------------------------------------
2-- IRONSIDES - DNS SERVER
3--
4-- By: Martin C. Carlisle and Barry S. Fagin
5--     Department of Computer Science
6--     United States Air Force Academy
7--
8-- This is free software; you can redistribute it and/or
9-- modify without restriction.  We do ask that you please keep
10-- the original author information, and clearly indicate if the
11-- software has been modified.
12--
13-- This software is distributed in the hope that it will be useful,
14-- but WITHOUT ANY WARRANTY; without even the implied warranty
15-- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
16----------------------------------------------------------------
17
18with unsigned_types, rr_type, rr_type.a_record_type, rr_type.aaaa_record_type,
19   Rr_Type.Cname_Record_Type, Rr_Type.Dnskey_Record_Type, Rr_Type.Mx_Record_Type,
20   Rr_Type.Ns_Record_Type, Rr_Type.Nsec_Record_Type, Rr_Type.Ptr_Record_Type,
21   Rr_Type.rrsig_record_type, Rr_Type.Soa_Record_Type, Rr_Type.srv_record_type;
22
23USE TYPE Unsigned_Types.Unsigned32;
24
25--need these for equality operator in package body
26use type Rr_Type.a_Record_Type.ARecordType;
27use type rr_type.aaaa_record_type.AAAARecordType;
28USE TYPE Rr_Type.Cname_Record_Type.CNAMERecordType;
29USE TYPE Rr_Type.Dnskey_Record_Type.DNSKEYRecordType;
30USE TYPE Rr_Type.Mx_Record_Type.MXRecordType;
31USE TYPE Rr_Type.srv_record_type.SRVRecordType;
32use type Rr_Type.Ns_Record_Type.NSRecordType;
33USE TYPE Rr_Type.NSEC_Record_Type.NSECRecordType;
34use type Rr_Type.Ptr_Record_Type.PTRRecordType;
35use type Rr_Type.rrsig_record_type.RRSIGRecordType;
36use type rr_type.soa_record_type.SOARecordType;
37
38--in case debugging IO needed
39--WITH Ada.Text_IO, Ada.Integer_Text_Io;
40
41--# inherit System, Ada.Characters.Handling, unsigned_types, dns_types, rr_type, rr_type.a_record_type, rr_type.aaaa_record_type,
42--#    rr_type.cname_record_type, rr_type.dnskey_record_type, rr_type.mx_record_type, rr_type.srv_record_type,
43--#    rr_type.ns_record_type, rr_type.nsec_record_type, rr_type.ptr_record_type,
44--#    rr_type.rrsig_record_type, rr_type.soa_record_type;
45
46
47package dns_table_pkg
48--# own protected DNS_Table : DNS_Table_Type (priority => 0);
49is
50
51protected type Dns_Table_Type is
52
53   pragma priority(0);
54
55   procedure insertARecord(Key : in Rr_Type.WireStringType;
56                           theRecord : in rr_type.a_record_type.ARecordType;
57                           success : out boolean);
58   --# global in out DNS_Table_Type;
59   --# derives DNS_Table_Type from *, theRecord, Key &
60   --#         success from DNS_Table_Type, key;
61
62   procedure insertAAAARecord(Key : in Rr_Type.WireStringType;
63                           theRecord : in rr_type.aaaa_record_type.AAAARecordType;
64                           success : out boolean);
65   --# global in out DNS_Table_Type;
66   --# derives DNS_Table_Type from *, theRecord, Key &
67   --#         success from DNS_Table_Type, key;
68
69   procedure insertCNAMERecord(Key : in Rr_Type.WireStringType;
70                           theRecord : in rr_type.cname_record_type.CNAMERecordType;
71                           success : out boolean);
72   --# global in out DNS_Table_Type;
73   --# derives DNS_Table_Type from *, theRecord, Key &
74   --#         success from DNS_Table_Type, key;
75
76   procedure InsertDNSKEYRecord(Key : in Rr_Type.WireStringType;
77                          theRecord : in rr_type.DNSKEY_record_type.DNSKEYRecordType;
78                          success : out boolean);
79   --# global in out DNS_Table_Type;
80   --# derives DNS_Table_Type from *, theRecord, Key &
81   --#         success from DNS_Table_Type, key;
82
83   procedure insertMXRecord(Key : in Rr_Type.WireStringType;
84                           theRecord : in rr_type.mx_record_type.MXRecordType;
85                           success : out boolean);
86   --# global in out DNS_Table_Type;
87   --# derives DNS_Table_Type from *, theRecord, Key &
88   --#         success from DNS_Table_Type, key;
89
90procedure insertSRVRecord(Key : in Rr_Type.WireStringType;
91                           theRecord : in rr_type.srv_record_type.SRVRecordType;
92                           success : out boolean);
93   --# global in out DNS_Table_Type;
94   --# derives DNS_Table_Type from *, theRecord, Key &
95   --#         success from DNS_Table_Type, key;
96
97   procedure insertNSRecord(Key : in Rr_Type.WireStringType;
98                           theRecord : in rr_type.ns_record_type.NSRecordType;
99                           success : out boolean);
100   --# global in out DNS_Table_Type;
101   --# derives DNS_Table_Type from *, theRecord, Key &
102   --#         success from DNS_Table_Type, key;
103
104   procedure insertNSECRecord(Key : in Rr_Type.WireStringType;
105                           theRecord : in rr_type.nsec_record_type.NSECRecordType;
106                           success : out boolean);
107   --# global in out DNS_Table_Type;
108   --# derives DNS_Table_Type from *, theRecord, Key &
109   --#         success from DNS_Table_Type, key;
110
111   procedure insertPTRRecord(Key : in Rr_Type.WireStringType;
112                           theRecord : in rr_type.ptr_record_type.PTRRecordType;
113                           success : out boolean);
114   --# global in out DNS_Table_Type;
115   --# derives DNS_Table_Type from *, theRecord, Key &
116   --#         success from DNS_Table_Type, key;
117
118   procedure InsertRRSIGRecord(Key : in Rr_Type.WireStringType;
119                          theRecord : in rr_type.RRSIG_record_type.RRSIGRecordType;
120                          success : out boolean);
121   --# global in out DNS_Table_Type;
122   --# derives DNS_Table_Type from *, theRecord, Key &
123   --#         success from DNS_Table_Type, key;
124
125   procedure InsertSOARecord(Key : in Rr_Type.WireStringType;
126                           theRecord : in rr_type.soa_record_type.SOARecordType;
127                           success : out boolean);
128   --# global in out DNS_Table_Type;
129   --# derives DNS_Table_Type from *, theRecord, Key &
130   --#         success from DNS_Table_Type, key;
131
132   procedure queryARecords(
133   	domainName : in rr_type.WireStringType;
134        returnedRecords : out rr_type.a_record_type.ARecordBucketType;
135        howMany : out rr_type.NumberOfRecordsType);
136   --# global in DNS_Table_Type;
137   --# derives returnedRecords from DNS_Table_Type, domainName &
138   --#         howMany from DNS_Table_Type, domainName;
139
140   -- to support RFC 4074
141   procedure countARecords(
142   	domainName : in rr_type.WireStringType;
143      howMany : out rr_type.NumberOfRecordsType);
144   --# global in DNS_Table_Type;
145   --# derives howMany from DNS_Table_Type, domainName;
146   procedure countAAAARecords(
147   	domainName : in rr_type.WireStringType;
148      howMany : out rr_type.NumberOfRecordsType);
149   --# global in DNS_Table_Type;
150   --# derives howMany from DNS_Table_Type, domainName;
151
152   procedure queryAAAARecords(
153   	domainName : in rr_type.WireStringType;
154        returnedRecords : out rr_type.aaaa_record_type.AAAARecordBucketType;
155        howMany : out rr_type.NumberOfRecordsType);
156   --# global in DNS_Table_Type;
157   --# derives returnedRecords from DNS_Table_Type, domainName &
158   --#         howMany from DNS_Table_Type, domainName;
159
160   procedure queryCNAMERecords(
161      domainName : in rr_type.WireStringType;
162      returnedRecords : out rr_type.cname_record_type.CNAMERecordBucketType;
163      howMany : out rr_type.NumberOfRecordsType);
164   --# global in DNS_Table_Type;
165   --# derives returnedRecords from DNS_Table_Type, domainName &
166   --#         howMany from DNS_Table_Type, domainName;
167
168   procedure queryDNSKEYRecords(
169      domainName : in rr_type.WireStringType;
170      returnedRecords : out rr_type.DNSKEY_record_type.DNSKEYRecordBucketType;
171      HowMany : out Rr_Type.NumberOfRecordsType);
172   --# global in DNS_Table_Type;
173   --# derives  returnedRecords, howMany from DNS_Table_Type, domainName;
174
175   procedure queryMXRecords(
176      domainName : in rr_type.WireStringType;
177      returnedRecords : out rr_type.mx_record_type.mxRecordBucketType;
178      howMany : out rr_type.NumberOfRecordsType);
179   --# global in DNS_Table_Type;
180   --# derives returnedRecords from DNS_Table_Type, domainName &
181   --#         howMany from DNS_Table_Type, domainName;
182
183procedure querySRVRecords(
184      domainName : in rr_type.WireStringType;
185      returnedRecords : out rr_type.srv_record_type.srvRecordBucketType;
186      howMany : out rr_type.NumberOfRecordsType);
187   --# global in DNS_Table_Type;
188   --# derives returnedRecords from DNS_Table_Type, domainName &
189   --#         howMany from DNS_Table_Type, domainName;
190
191   procedure queryNSRecords(
192      domainName : in rr_type.WireStringType;
193      returnedRecords : out rr_type.ns_record_type.NSRecordBucketType;
194      howMany : out rr_type.NumberOfRecordsType);
195   --# global in DNS_Table_Type;
196   --# derives returnedRecords from DNS_Table_Type, domainName &
197   --#         howMany from DNS_Table_Type, domainName;
198
199   procedure queryNSECRecords(
200      domainName : in rr_type.WireStringType;
201      returnedRecords : out rr_type.nsec_record_type.NSECRecordBucketType;
202      howMany : out rr_type.NumberOfRecordsType);
203   --# global in DNS_Table_Type;
204   --# derives returnedRecords from DNS_Table_Type, domainName &
205   --#         howMany from DNS_Table_Type, domainName;
206
207   procedure queryPTRRecords(
208      domainName : in rr_type.WireStringType;
209      returnedRecords : out rr_type.ptr_record_type.PTRRecordBucketType;
210      howMany : out rr_type.NumberOfRecordsType);
211   --# global in DNS_Table_Type;
212   --# derives returnedRecords from DNS_Table_Type, domainName &
213   --#         howMany from DNS_Table_Type, domainName;
214
215   procedure queryRRSIGRecords(
216      domainName : in rr_type.WireStringType;
217      returnedRecords : out rr_type.RRSIG_record_type.RRSIGRecordBucketType;
218      HowMany : out Rr_Type.NumberOfRecordsType);
219   --# global in DNS_Table_Type;
220   --# derives  returnedRecords, howMany from DNS_Table_Type, domainName;
221
222   procedure querySOARecords(
223      domainName : in rr_type.WireStringType;
224      returnedRecords : out rr_type.soa_record_type.SOARecordBucketType;
225      howMany : out rr_type.NumberOfRecordsType);
226   --# global in DNS_Table_Type;
227   --# derives returnedRecords from DNS_Table_Type, domainName &
228   --#         howMany from DNS_Table_Type, domainName;
229
230
231   private
232      ARecordKeys : RR_Type.OwnerHashTableType := RR_Type.OwnerHashTableType'(
233         others => RR_Type.OwnerRecordBucketType'(
234            others => RR_Type.BlankOwner));
235      ARecordTable : Rr_Type.A_Record_Type.ARecordHashTableType := rr_type.a_record_type.ARecordHashTableType'(
236         others => rr_type.a_record_type.ARecordBucketType'(
237         others => rr_type.a_record_type.blankARecord));
238      AAAARecordKeys : RR_Type.OwnerHashTableType := RR_Type.OwnerHashTableType'(
239         others => RR_Type.OwnerRecordBucketType'(
240            others => RR_Type.BlankOwner));
241      AAAARecordTable : Rr_Type.AAAA_Record_Type.AAAARecordHashTableType := rr_type.aaaa_record_type.AAAARecordHashTableType'(
242         others => rr_type.aaaa_record_type.AAAARecordBucketType'(
243         others => rr_type.aaaa_record_type.blankAAAARecord));
244      CNAMERecordKeys : RR_Type.OwnerHashTableType := RR_Type.OwnerHashTableType'(
245         others => RR_Type.OwnerRecordBucketType'(
246            others => RR_Type.BlankOwner));
247      CNAMERecordTable : Rr_Type.Cname_Record_Type.CNAMERecordHashTableType := rr_type.cname_record_type.CNAMERecordHashTableType'(
248         others => rr_type.cname_record_type.CNAMERecordBucketType'(
249         others => Rr_Type.Cname_Record_Type.BlankCNAMERecord));
250      DNSKEYRecordKeys : RR_Type.OwnerHashTableType := RR_Type.OwnerHashTableType'(
251         others => RR_Type.OwnerRecordBucketType'(
252            others => RR_Type.BlankOwner));
253      DNSKEYRecordTable : Rr_Type.dnskey_Record_Type.DNSKEYRecordHashTableType := rr_type.dnskey_record_type.DNSKEYRecordHashTableType'(
254         others => rr_type.dnskey_record_type.DNSKEYRecordBucketType'(
255         others => rr_type.dnskey_record_type.blankDNSKEYRecord));
256      MXRecordKeys : RR_Type.OwnerHashTableType := RR_Type.OwnerHashTableType'(
257         others => RR_Type.OwnerRecordBucketType'(
258            others => RR_Type.BlankOwner));
259      MXRecordTable : Rr_Type.Mx_Record_Type.MXRecordHashTableType := rr_type.mx_record_type.MXRecordHashTableType'(
260         others => rr_type.mx_record_type.MXRecordBucketType'(
261         others => rr_type.mx_record_type.blankMXRecord));
262      SRVRecordKeys : RR_Type.OwnerHashTableType := RR_Type.OwnerHashTableType'(
263         others => RR_Type.OwnerRecordBucketType'(
264            others => RR_Type.BlankOwner));
265      SRVRecordTable : Rr_Type.SRV_Record_Type.SRVRecordHashTableType := rr_type.srv_record_type.SRVRecordHashTableType'(
266         others => rr_type.srv_record_type.SRVRecordBucketType'(
267         others => rr_type.srv_record_type.blankSRVRecord));
268      NSRecordKeys : RR_Type.OwnerHashTableType := RR_Type.OwnerHashTableType'(
269         others => RR_Type.OwnerRecordBucketType'(
270            others => RR_Type.BlankOwner));
271      NSRecordTable : rr_type.ns_record_type.NSRecordHashTableType := rr_type.ns_record_type.NSRecordHashTableType'(
272         others => rr_type.ns_record_type.NSRecordBucketType'(
273         others => Rr_Type.Ns_Record_Type.BlankNSRecord));
274      NSECRecordKeys : RR_Type.OwnerHashTableType := RR_Type.OwnerHashTableType'(
275         others => RR_Type.OwnerRecordBucketType'(
276         others => RR_Type.BlankOwner));
277      NSECRecordTable : rr_type.nsec_record_type.NSECRecordHashTableType := rr_type.nsec_record_type.NSECRecordHashTableType'(
278         others => rr_type.nsec_record_type.NSECRecordBucketType'(
279         others => Rr_Type.Nsec_Record_Type.BlankNSECRecord));
280      PTRRecordKeys : RR_Type.OwnerHashTableType := RR_Type.OwnerHashTableType'(
281         others => RR_Type.OwnerRecordBucketType'(
282            others => RR_Type.BlankOwner));
283      PTRRecordTable : rr_type.ptr_record_type.PTRRecordHashTableType := rr_type.ptr_record_type.PTRRecordHashTableType'(
284         others => rr_type.ptr_record_type.PTRRecordBucketType'(
285         others => Rr_Type.Ptr_Record_Type.BlankPTRRecord));
286      RRSIGRecordKeys : RR_Type.OwnerHashTableType := RR_Type.OwnerHashTableType'(
287         others => RR_Type.OwnerRecordBucketType'(
288            others => RR_Type.BlankOwner));
289      RRSIGRecordTable : Rr_Type.rrsig_Record_Type.rrsigRecordHashTableType := rr_type.rrsig_record_type.rrsigRecordHashTableType'(
290         others => rr_type.rrsig_record_type.rrsigRecordBucketType'(
291         others => rr_type.rrsig_record_type.blankrrsigRecord));
292      SOARecordKeys : RR_Type.OwnerHashTableType := RR_Type.OwnerHashTableType'(
293         others => RR_Type.OwnerRecordBucketType'(
294            others => RR_Type.BlankOwner));
295      SOARecordTable : rr_type.SOA_record_type.SOARecordHashTableType := rr_type.SOA_record_type.SOARecordHashTableType'(
296         others => rr_type.SOA_record_type.SOARecordBucketType'(
297         others => rr_type.SOA_record_type.blankSOARecord));
298   end Dns_Table_Type;
299
300--THIS IS THE NAME SERVER HASH TABLE
301DNS_Table: Dns_Table_Type;
302
303end dns_table_pkg;
304