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