Home | History | Annotate | Line # | Download | only in dist
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