named-checkzone.c 4.23 KB
Newer Older
Mark Andrews's avatar
Mark Andrews committed
1
/*
Brian Wellington's avatar
Brian Wellington committed
2
 * Copyright (C) 1999-2001  Internet Software Consortium.
Mark Andrews's avatar
Mark Andrews committed
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
 * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
 * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
 * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

18
/* $Id: named-checkzone.c,v 1.12 2001/03/03 23:11:36 bwelling Exp $ */
Mark Andrews's avatar
Mark Andrews committed
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

#include <config.h>

#include <stdlib.h>

#include <isc/app.h>
#include <isc/commandline.h>
#include <isc/log.h>
#include <isc/mem.h>
#include <isc/socket.h>
#include <isc/string.h>
#include <isc/task.h>
#include <isc/timer.h>
#include <isc/util.h>

#include <dns/db.h>
#include <dns/fixedname.h>
#include <dns/log.h>
#include <dns/rdataclass.h>
#include <dns/rdataset.h>
#include <dns/result.h>
#include <dns/zone.h>

Mark Andrews's avatar
cleanup    
Mark Andrews committed
42
43
#include "check-tool.h"

Mark Andrews's avatar
Mark Andrews committed
44
45
46
47
48
49
50
51
52
53
static int debug = 0;
static int quiet = 0;
static isc_mem_t *mctx = NULL;
dns_zone_t *zone = NULL;
dns_zonetype_t zonetype = dns_zone_master;
static const char *dbtype[] = { "rbt" };

#define ERRRET(result, function) \
	do { \
		if (result != ISC_R_SUCCESS) { \
Mark Andrews's avatar
Mark Andrews committed
54
55
56
			if (!quiet) \
				fprintf(stderr, "%s() returned %s\n", \
					function, dns_result_totext(result)); \
Mark Andrews's avatar
Mark Andrews committed
57
58
59
60
61
			return (result); \
		} \
	} while (0)

static void
Brian Wellington's avatar
Brian Wellington committed
62
usage(void) {
Mark Andrews's avatar
Mark Andrews committed
63
	fprintf(stderr,
64
		"usage: named-checkzone [-dq] [-c class] zonename filename\n");
Mark Andrews's avatar
Mark Andrews committed
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
	exit(1);
}

static isc_result_t
setup(char *zonename, char *filename, char *classname) {
	isc_result_t result;
	dns_rdataclass_t rdclass;
	isc_textregion_t region;
	isc_buffer_t buffer;
	dns_fixedname_t fixorigin;
	dns_name_t *origin;

	if (debug)
		fprintf(stderr, "loading \"%s\" from \"%s\" class \"%s\"\n",
			zonename, filename, classname);
	result = dns_zone_create(&zone, mctx);
	ERRRET(result, "dns_zone_new");

	dns_zone_settype(zone, zonetype);

	isc_buffer_init(&buffer, zonename, strlen(zonename));
	isc_buffer_add(&buffer, strlen(zonename));
	dns_fixedname_init(&fixorigin);
	result = dns_name_fromtext(dns_fixedname_name(&fixorigin),
			  	   &buffer, dns_rootname, ISC_FALSE, NULL);
	ERRRET(result, "dns_name_fromtext");
	origin = dns_fixedname_name(&fixorigin);

	result = dns_zone_setorigin(zone, origin);
	ERRRET(result, "dns_zone_setorigin");

	result = dns_zone_setdbtype(zone, 1, (const char * const *) dbtype);
	ERRRET(result, "dns_zone_setdatabase");

	result = dns_zone_setfile(zone, filename);
	ERRRET(result, "dns_zone_setdatabase");

	region.base = classname;
	region.length = strlen(classname);
	result = dns_rdataclass_fromtext(&rdclass, &region);
	ERRRET(result, "dns_rdataclass_fromtext");

	dns_zone_setclass(zone, rdclass);
108
	dns_zone_setoption(zone, DNS_ZONEOPT_MANYERRORS, ISC_TRUE);
Mark Andrews's avatar
Mark Andrews committed
109
110
111
112
113
114
115
116

	result = dns_zone_load(zone);

	return (result);
}

static void
destroy(void) {
Mark Andrews's avatar
Mark Andrews committed
117
118
	if (zone != NULL)
		dns_zone_detach(&zone);
Mark Andrews's avatar
Mark Andrews committed
119
120
121
122
123
}

int
main(int argc, char **argv) {
	int c;
Mark Andrews's avatar
Mark Andrews committed
124
	char *origin = NULL;
Mark Andrews's avatar
Mark Andrews committed
125
126
127
	char *filename = NULL;
	isc_log_t *lctx = NULL;
	isc_result_t result;
128
	char classname_in[] = "IN";
129
	char *classname = classname_in;
Mark Andrews's avatar
Mark Andrews committed
130

Mark Andrews's avatar
Mark Andrews committed
131
	while ((c = isc_commandline_parse(argc, argv, "c:dqs")) != EOF) {
Mark Andrews's avatar
Mark Andrews committed
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
		switch (c) {
		case 'c':
			classname = isc_commandline_argument;
			break;
		case 'd':
			debug++;
			break;
		case 'q':
			quiet++;
			break;
		default:
			usage();
		}
	}

147
	if (isc_commandline_index + 2 > argc)
Mark Andrews's avatar
Mark Andrews committed
148
149
150
		usage();

	RUNTIME_CHECK(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS);
151
	if (!quiet) {
Mark Andrews's avatar
cleanup    
Mark Andrews committed
152
		RUNTIME_CHECK(setup_logging(mctx, &lctx) == ISC_R_SUCCESS);
153
154
155
		dns_log_init(lctx);
		dns_log_setcontext(lctx);
	}
Mark Andrews's avatar
Mark Andrews committed
156

157
158
159
	origin = argv[isc_commandline_index++];
	filename = argv[isc_commandline_index++];
	result = setup(origin, filename, classname);
Mark Andrews's avatar
Mark Andrews committed
160
	if (!quiet && result == ISC_R_SUCCESS)
161
		fprintf(stdout, "OK\n");
Mark Andrews's avatar
Mark Andrews committed
162
	destroy();
Mark Andrews's avatar
Mark Andrews committed
163
164
	if (lctx != NULL)
		isc_log_destroy(&lctx);
Mark Andrews's avatar
Mark Andrews committed
165
	isc_mem_destroy(&mctx);
Mark Andrews's avatar
Mark Andrews committed
166
	return ((result == ISC_R_SUCCESS) ? 0 : 1);
Mark Andrews's avatar
Mark Andrews committed
167
}