|
@@ -75,23 +75,28 @@ masterLoad(const char* const filename, const Name& origin,
|
|
|
isc_throw(MasterLoadError, "Failed to open master file: " <<
|
|
|
filename << ": " << strerror(errno));
|
|
|
}
|
|
|
- masterLoad(ifs, origin, zone_class, callback);
|
|
|
+ masterLoad(ifs, origin, zone_class, callback, filename);
|
|
|
ifs.close();
|
|
|
}
|
|
|
|
|
|
void
|
|
|
masterLoad(istream& input, const Name& origin, const RRClass& zone_class,
|
|
|
- MasterLoadCallback callback)
|
|
|
+ MasterLoadCallback callback, const char* source)
|
|
|
{
|
|
|
RRsetPtr rrset;
|
|
|
ConstRdataPtr prev_rdata; // placeholder for special case of RRSIGs
|
|
|
string line;
|
|
|
unsigned int line_count = 1;
|
|
|
|
|
|
+ if (source == NULL) {
|
|
|
+ source = "<unknown>";
|
|
|
+ }
|
|
|
+
|
|
|
do {
|
|
|
getline(input, line);
|
|
|
if (input.bad() || (input.fail() && !input.eof())) {
|
|
|
- isc_throw(MasterLoadError, "Unexpectedly failed to read a line");
|
|
|
+ isc_throw(MasterLoadError, "Unexpectedly failed to read a line in "
|
|
|
+ << source);
|
|
|
}
|
|
|
|
|
|
// blank/comment lines should be simply skipped.
|
|
@@ -102,7 +107,8 @@ masterLoad(istream& input, const Name& origin, const RRClass& zone_class,
|
|
|
// The line shouldn't have leading space (which means omitting the
|
|
|
// owner name).
|
|
|
if (isspace(line[0])) {
|
|
|
- isc_throw(MasterLoadError, "Leading space at line " << line_count);
|
|
|
+ isc_throw(MasterLoadError, "Leading space in " << source
|
|
|
+ << " at line " << line_count);
|
|
|
}
|
|
|
|
|
|
// Parse a single RR
|
|
@@ -111,15 +117,15 @@ masterLoad(istream& input, const Name& origin, const RRClass& zone_class,
|
|
|
stringbuf rdatabuf;
|
|
|
iss >> owner_txt >> ttl_txt >> rrclass_txt >> rrtype_txt >> &rdatabuf;
|
|
|
if (iss.bad() || iss.fail()) {
|
|
|
- isc_throw(MasterLoadError, "Parse failure for a valid RR at line "
|
|
|
- << line_count);
|
|
|
+ isc_throw(MasterLoadError, "Parse failure for a valid RR in "
|
|
|
+ << source << " at line " << line_count);
|
|
|
}
|
|
|
|
|
|
// This simple version doesn't support relative owner names with a
|
|
|
// separate origin.
|
|
|
if (owner_txt.empty() || *(owner_txt.end() - 1) != '.') {
|
|
|
- isc_throw(MasterLoadError, "Owner name is not absolute at line "
|
|
|
- << line_count);
|
|
|
+ isc_throw(MasterLoadError, "Owner name is not absolute in "
|
|
|
+ << source << " at line " << line_count);
|
|
|
}
|
|
|
|
|
|
// XXX: this part is a bit tricky (and less efficient). We are going
|
|
@@ -151,8 +157,9 @@ masterLoad(istream& input, const Name& origin, const RRClass& zone_class,
|
|
|
rdata = createRdata(*rrtype, *rrclass, stripLine(rdtext, ex));
|
|
|
}
|
|
|
} catch (const Exception& ex) {
|
|
|
- isc_throw(MasterLoadError, "Invalid RR text at line " << line_count
|
|
|
- << ": " << ex.what());
|
|
|
+ isc_throw(MasterLoadError, "Invalid RR text in " << source <<
|
|
|
+ " at line " << line_count << ": "
|
|
|
+ << ex.what());
|
|
|
}
|
|
|
|
|
|
// Origin related validation:
|
|
@@ -161,20 +168,22 @@ masterLoad(istream& input, const Name& origin, const RRClass& zone_class,
|
|
|
const NameComparisonResult cmp_result = owner->compare(origin);
|
|
|
if (cmp_result.getRelation() != NameComparisonResult::EQUAL &&
|
|
|
cmp_result.getRelation() != NameComparisonResult::SUBDOMAIN) {
|
|
|
- isc_throw(MasterLoadError, "Out-of-zone data at line "
|
|
|
- << line_count);
|
|
|
+ isc_throw(MasterLoadError, "Out-of-zone data for " << origin
|
|
|
+ << "/" << rrclass_txt << " in "
|
|
|
+ << source << " at line "
|
|
|
+ << line_count);
|
|
|
}
|
|
|
if (*rrtype == RRType::SOA() &&
|
|
|
cmp_result.getRelation() != NameComparisonResult::EQUAL) {
|
|
|
- isc_throw(MasterLoadError, "SOA not at top of zone at line "
|
|
|
- << line_count);
|
|
|
+ isc_throw(MasterLoadError, "SOA not at top of zone in "
|
|
|
+ << source << " at line " << line_count);
|
|
|
}
|
|
|
|
|
|
// Reject RR class mismatching
|
|
|
if (*rrclass != zone_class) {
|
|
|
isc_throw(MasterLoadError, "RR class (" << rrclass_txt
|
|
|
<< ") does not match the zone class (" << zone_class
|
|
|
- << ") at line " << line_count);
|
|
|
+ << ") in " << source << " at line " << line_count);
|
|
|
}
|
|
|
|
|
|
// Everything is okay. Now create/update RRset with the new RR.
|
|
@@ -209,5 +218,6 @@ masterLoad(istream& input, const Name& origin, const RRClass& zone_class,
|
|
|
callback(rrset);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
} // namespace dns
|
|
|
} // namespace isc
|