nsd-checkzone.c revision 1.1
1/*
2 * nsd-checkzone.c -- nsd-checkzone(8) checks zones for syntax errors
3 *
4 * Copyright (c) 2013, NLnet Labs. All rights reserved.
5 *
6 * See LICENSE for the license.
7 *
8 */
9
10#include "config.h"
11
12#include <assert.h>
13#include <stdio.h>
14#include <stdlib.h>
15#include <string.h>
16#include <time.h>
17#include <unistd.h>
18#include <errno.h>
19
20#include "nsd.h"
21#include "options.h"
22#include "util.h"
23#include "zonec.h"
24
25static void error(const char *format, ...) ATTR_FORMAT(printf, 1, 2);
26struct nsd nsd;
27
28/*
29 * Print the help text.
30 *
31 */
32static void
33usage (void)
34{
35	fprintf(stderr, "Usage: nsd-checkzone <zone name> <zone file>\n");
36	fprintf(stderr, "Version %s. Report bugs to <%s>.\n",
37		PACKAGE_VERSION, PACKAGE_BUGREPORT);
38}
39
40/*
41 * Something went wrong, give error messages and exit.
42 *
43 */
44static void
45error(const char *format, ...)
46{
47	va_list args;
48	va_start(args, format);
49	log_vmsg(LOG_ERR, format, args);
50	va_end(args);
51	exit(1);
52}
53
54static void
55check_zone(struct nsd* nsd, const char* name, const char* fname)
56{
57	const dname_type* dname;
58	zone_options_t* zo;
59	zone_type* zone;
60	unsigned errors;
61
62	/* init*/
63	nsd->db = namedb_open("", nsd->options);
64	dname = dname_parse(nsd->options->region, name);
65	if(!dname) {
66		/* parse failure */
67		error("cannot parse zone name '%s'", name);
68	}
69	zo = zone_options_create(nsd->options->region);
70	memset(zo, 0, sizeof(*zo));
71	zo->node.key = dname;
72	zo->name = name;
73	zone = namedb_zone_create(nsd->db, dname, zo);
74
75	/* read the zone */
76	errors = zonec_read(name, fname, zone);
77	if(errors > 0) {
78		printf("zone %s file %s has %u errors\n", name, fname, errors);
79		exit(1);
80	}
81	printf("zone %s is ok\n", name);
82	namedb_close(nsd->db);
83}
84
85/* dummy functions to link */
86int writepid(struct nsd * ATTR_UNUSED(nsd))
87{
88	        return 0;
89}
90void unlinkpid(const char * ATTR_UNUSED(file))
91{
92}
93void bind8_stats(struct nsd * ATTR_UNUSED(nsd))
94{
95}
96
97void sig_handler(int ATTR_UNUSED(sig))
98{
99}
100
101extern char *optarg;
102extern int optind;
103
104int
105main(int argc, char *argv[])
106{
107	/* Scratch variables... */
108	int c;
109	struct nsd nsd;
110	memset(&nsd, 0, sizeof(nsd));
111
112	log_init("nsd-checkzone");
113
114	/* Parse the command line... */
115	while ((c = getopt(argc, argv, "h")) != -1) {
116		switch (c) {
117		case 'h':
118			usage();
119			exit(0);
120		case '?':
121		default:
122			usage();
123			exit(1);
124		}
125	}
126	argc -= optind;
127	argv += optind;
128
129	/* Commandline parse error */
130	if (argc != 2) {
131		fprintf(stderr, "wrong number of arguments.\n");
132		usage();
133		exit(1);
134	}
135
136	nsd.options = nsd_options_create(region_create_custom(xalloc, free,
137		DEFAULT_CHUNK_SIZE, DEFAULT_LARGE_OBJECT_SIZE,
138		DEFAULT_INITIAL_CLEANUP_SIZE, 1));
139	if (verbosity == 0)
140		verbosity = nsd.options->verbosity;
141
142	check_zone(&nsd, argv[0], argv[1]);
143	region_destroy(nsd.options->region);
144	/* yylex_destroy(); but, not available in all versions of flex */
145
146	exit(0);
147}
148