nsd-checkzone.c revision 1.1.1.4 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
25 struct nsd nsd;
26
27 /*
28 * Print the help text.
29 *
30 */
31 static void
32 usage (void)
33 {
34 fprintf(stderr, "Usage: nsd-checkzone <zone name> <zone file>\n");
35 fprintf(stderr, "Version %s. Report bugs to <%s>.\n",
36 PACKAGE_VERSION, PACKAGE_BUGREPORT);
37 }
38
39 static void
40 check_zone(struct nsd* nsd, const char* name, const char* fname)
41 {
42 const dname_type* dname;
43 zone_options_type* zo;
44 zone_type* zone;
45 unsigned errors;
46
47 /* init*/
48 nsd->db = namedb_open("", nsd->options);
49 dname = dname_parse(nsd->options->region, name);
50 if(!dname) {
51 /* parse failure */
52 error("cannot parse zone name '%s'", name);
53 }
54 zo = zone_options_create(nsd->options->region);
55 memset(zo, 0, sizeof(*zo));
56 zo->node.key = dname;
57 zo->name = name;
58 zone = namedb_zone_create(nsd->db, dname, zo);
59
60 /* read the zone */
61 errors = zonec_read(name, fname, zone);
62 if(errors > 0) {
63 printf("zone %s file %s has %u errors\n", name, fname, errors);
64 #ifdef MEMCLEAN /* otherwise, the OS collects memory pages */
65 namedb_close(nsd->db);
66 region_destroy(nsd->options->region);
67 #endif
68 exit(1);
69 }
70 printf("zone %s is ok\n", name);
71 namedb_close(nsd->db);
72 }
73
74 /* dummy functions to link */
75 int writepid(struct nsd * ATTR_UNUSED(nsd))
76 {
77 return 0;
78 }
79 void unlinkpid(const char * ATTR_UNUSED(file))
80 {
81 }
82 void bind8_stats(struct nsd * ATTR_UNUSED(nsd))
83 {
84 }
85
86 void sig_handler(int ATTR_UNUSED(sig))
87 {
88 }
89
90 extern char *optarg;
91 extern int optind;
92
93 int
94 main(int argc, char *argv[])
95 {
96 /* Scratch variables... */
97 int c;
98 struct nsd nsd;
99 memset(&nsd, 0, sizeof(nsd));
100
101 log_init("nsd-checkzone");
102
103 /* Parse the command line... */
104 while ((c = getopt(argc, argv, "h")) != -1) {
105 switch (c) {
106 case 'h':
107 usage();
108 exit(0);
109 case '?':
110 default:
111 usage();
112 exit(1);
113 }
114 }
115 argc -= optind;
116 argv += optind;
117
118 /* Commandline parse error */
119 if (argc != 2) {
120 fprintf(stderr, "wrong number of arguments.\n");
121 usage();
122 exit(1);
123 }
124
125 nsd.options = nsd_options_create(region_create_custom(xalloc, free,
126 DEFAULT_CHUNK_SIZE, DEFAULT_LARGE_OBJECT_SIZE,
127 DEFAULT_INITIAL_CLEANUP_SIZE, 1));
128 if (verbosity == 0)
129 verbosity = nsd.options->verbosity;
130
131 check_zone(&nsd, argv[0], argv[1]);
132 region_destroy(nsd.options->region);
133 /* yylex_destroy(); but, not available in all versions of flex */
134
135 exit(0);
136 }
137