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