CHECK(dns_name_fromtext(origin, &buffer, dns_rootname, 0, NULL));
CHECK(dns_zone_setorigin(zone, origin));
dns_zone_setdbtype(zone, 1, (const char *const *)dbtype);
- CHECK(dns_zone_setfile(zone, filename, fileformat,
- &dns_master_style_default));
+ if (strcmp(filename, "-") == 0) {
+ CHECK(dns_zone_setstream(zone, stdin, fileformat,
+ &dns_master_style_default));
+ } else {
+ CHECK(dns_zone_setfile(zone, filename, fileformat,
+ &dns_master_style_default));
+ }
if (journal != NULL) {
CHECK(dns_zone_setjournal(zone, journal));
}
#include <isc/app.h>
#include <isc/commandline.h>
#include <isc/dir.h>
+#include <isc/file.h>
#include <isc/hash.h>
#include <isc/log.h>
#include <isc/mem.h>
"[-i (full|full-sibling|local|local-sibling|none)] "
"[-M (ignore|warn|fail)] [-S (ignore|warn|fail)] "
"[-W (ignore|warn)] "
- "%s zonename filename\n",
+ "%s zonename [ (filename|-) ]\n",
prog_name,
progmode == progmode_check ? "[-o filename]" : "-o filename");
exit(1);
main(int argc, char **argv) {
int c;
char *origin = NULL;
- char *filename = NULL;
+ const char *filename = NULL;
isc_log_t *lctx = NULL;
isc_result_t result;
char classname_in[] = "IN";
logdump = false;
}
- if (isc_commandline_index + 2 != argc) {
+ if (argc - isc_commandline_index < 1 ||
+ argc - isc_commandline_index > 2) {
usage();
}
dns_result_register();
origin = argv[isc_commandline_index++];
- filename = argv[isc_commandline_index++];
+
+ if (isc_commandline_index == argc) {
+ /* "-" will be interpreted as stdin */
+ filename = "-";
+ } else {
+ filename = argv[isc_commandline_index];
+ }
+
+ isc_commandline_index++;
+
result = load_zone(mctx, origin, filename, inputformat, classname,
maxttl, &zone);
#ifdef _WIN32
DestroySockets();
#endif /* ifdef _WIN32 */
+
return ((result == ISC_R_SUCCESS) ? 0 : 1);
}
isc_refcount_t irefs;
dns_name_t origin;
char *masterfile;
+ const FILE *stream; /* loading from a stream? */
ISC_LIST(dns_include_t) includes; /* Include files */
ISC_LIST(dns_include_t) newincludes; /* Loading */
unsigned int nincludes;
zone->strrdclass = NULL;
zone->strviewname = NULL;
zone->masterfile = NULL;
+ zone->stream = NULL;
ISC_LIST_INIT(zone->includes);
ISC_LIST_INIT(zone->newincludes);
zone->nincludes = 0;
isc_result_t result = ISC_R_SUCCESS;
REQUIRE(DNS_ZONE_VALID(zone));
+ REQUIRE(zone->stream == NULL);
LOCK_ZONE(zone);
result = dns_zone_setstring(zone, &zone->masterfile, file);
return (zone->masterfile);
}
+isc_result_t
+dns_zone_setstream(dns_zone_t *zone, const FILE *stream,
+ dns_masterformat_t format, const dns_master_style_t *style) {
+ isc_result_t result = ISC_R_SUCCESS;
+
+ REQUIRE(DNS_ZONE_VALID(zone));
+ REQUIRE(stream != NULL);
+ REQUIRE(zone->masterfile == NULL);
+
+ LOCK_ZONE(zone);
+ zone->stream = stream;
+ zone->masterformat = format;
+ if (format == dns_masterformat_text) {
+ zone->masterstyle = style;
+ }
+ result = default_journal(zone);
+ UNLOCK_ZONE(zone);
+
+ return (result);
+}
+
dns_ttl_t
dns_zone_getmaxttl(dns_zone_t *zone) {
REQUIRE(DNS_ZONE_VALID(zone));
(zone->type == dns_zone_redirect && zone->masters != NULL)) &&
rbt)
{
- if (zone->masterfile == NULL ||
- !isc_file_exists(zone->masterfile)) {
+ if (zone->stream == NULL &&
+ (zone->masterfile == NULL ||
+ !isc_file_exists(zone->masterfile)))
+ {
if (zone->masterfile != NULL) {
dns_zone_logc(zone, DNS_LOGCATEGORY_ZONELOAD,
ISC_LOG_DEBUG(1),
}
if (!dns_db_ispersistent(db)) {
- if (zone->masterfile != NULL) {
+ if (zone->masterfile != NULL || zone->stream != NULL) {
result = zone_startload(db, zone, loadtime);
} else {
result = DNS_R_NOMASTERFILE;
zone_idetach(&callbacks.zone);
return (result);
}
- result = dns_master_loadfile(
- zone->masterfile, &zone->origin, &zone->origin,
- zone->rdclass, options, 0, &callbacks,
- zone_registerinclude, zone, zone->mctx,
- zone->masterformat, zone->maxttl);
+
+ if (zone->stream != NULL) {
+ FILE *stream = NULL;
+ DE_CONST(zone->stream, stream);
+ result = dns_master_loadstream(
+ stream, &zone->origin, &zone->origin,
+ zone->rdclass, options, &callbacks, zone->mctx);
+ } else {
+ result = dns_master_loadfile(
+ zone->masterfile, &zone->origin, &zone->origin,
+ zone->rdclass, options, 0, &callbacks,
+ zone_registerinclude, zone, zone->mctx,
+ zone->masterformat, zone->maxttl);
+ }
+
tresult = dns_db_endload(db, &callbacks);
if (result == ISC_R_SUCCESS) {
result = tresult;