named-checkconf.c revision a26ad011f382d12058478704cb5e90e6f4366d01
bf8267aa453e5d2a735ed732a043b77a0b355b20Mark Andrews/*
bf8267aa453e5d2a735ed732a043b77a0b355b20Mark Andrews * Copyright (C) 1999-2001 Internet Software Consortium.
bf8267aa453e5d2a735ed732a043b77a0b355b20Mark Andrews *
bf8267aa453e5d2a735ed732a043b77a0b355b20Mark Andrews * Permission to use, copy, modify, and distribute this software for any
bf8267aa453e5d2a735ed732a043b77a0b355b20Mark Andrews * purpose with or without fee is hereby granted, provided that the above
bf8267aa453e5d2a735ed732a043b77a0b355b20Mark Andrews * copyright notice and this permission notice appear in all copies.
bf8267aa453e5d2a735ed732a043b77a0b355b20Mark Andrews *
bf8267aa453e5d2a735ed732a043b77a0b355b20Mark Andrews * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
bf8267aa453e5d2a735ed732a043b77a0b355b20Mark Andrews * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
bf8267aa453e5d2a735ed732a043b77a0b355b20Mark Andrews * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
bf8267aa453e5d2a735ed732a043b77a0b355b20Mark Andrews * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
bf8267aa453e5d2a735ed732a043b77a0b355b20Mark Andrews * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
bf8267aa453e5d2a735ed732a043b77a0b355b20Mark Andrews * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
bf8267aa453e5d2a735ed732a043b77a0b355b20Mark Andrews * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
12178c86525332bb0ab66155feb61fbf32eca6acEvan Hunt */
9c3531d72aeaad6c5f01efe6a1c82023e1379e4dDavid Lawrence
fccb930434fc0c61658be2289dab263535109803William King/* $Id: named-checkconf.c,v 1.9 2001/06/29 01:04:55 gson Exp $ */
fccb930434fc0c61658be2289dab263535109803William King
fccb930434fc0c61658be2289dab263535109803William King#include <config.h>
fccb930434fc0c61658be2289dab263535109803William King
c2bc56dc65b4b103a5600565680eb5f33fa4c90bMark Andrews#include <errno.h>
51917258dbb23cfe6069ae1cf2b7fc5aefc1e0c2Bob Halley#include <stdlib.h>
da49cb62e02793a1b31ec877dcbfddc8911dbcb8David Lawrence#include <stdio.h>
fccb930434fc0c61658be2289dab263535109803William King
12178c86525332bb0ab66155feb61fbf32eca6acEvan Hunt#include <isc/commandline.h>
fccb930434fc0c61658be2289dab263535109803William King#include <isc/dir.h>
fccb930434fc0c61658be2289dab263535109803William King#include <isc/log.h>
08a768e82ad64ede97f640c88e02984b59122753Michael Graff#include <isc/mem.h>
08a768e82ad64ede97f640c88e02984b59122753Michael Graff#include <isc/result.h>
ced719e92b11dc797da3a1b32f6140d81eca83faAndreas Gustafsson#include <isc/string.h>
08a768e82ad64ede97f640c88e02984b59122753Michael Graff#include <isc/util.h>
08a768e82ad64ede97f640c88e02984b59122753Michael Graff
08a768e82ad64ede97f640c88e02984b59122753Michael Graff#include <isccfg/cfg.h>
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence#include <isccfg/check.h>
08a768e82ad64ede97f640c88e02984b59122753Michael Graff
da49cb62e02793a1b31ec877dcbfddc8911dbcb8David Lawrence#include "check-tool.h"
fccb930434fc0c61658be2289dab263535109803William King
f4cbe536b11da614fe05aeaeff41e324854cda7bMark Andrewsisc_log_t *log = NULL;
fccb930434fc0c61658be2289dab263535109803William King
8a0ba20b16177d40bd557b491f56003c7d38a4a2David Lawrencestatic void
8a0ba20b16177d40bd557b491f56003c7d38a4a2David Lawrenceusage(void) {
fccb930434fc0c61658be2289dab263535109803William King fprintf(stderr, "usage: named-checkconf [-v] [-t directory] [named.conf]\n");
fccb930434fc0c61658be2289dab263535109803William King exit(1);
f4cbe536b11da614fe05aeaeff41e324854cda7bMark Andrews}
9f7d51ee3290e2a064d71016a6bd555b47134a7cMark Andrews
fccb930434fc0c61658be2289dab263535109803William Kingstatic isc_result_t
f4cbe536b11da614fe05aeaeff41e324854cda7bMark Andrewsdirectory_callback(const char *clausename, cfg_obj_t *obj, void *arg) {
94271b0d993bfe4d4495208288e856e048a2d158Mark Andrews isc_result_t result;
fccb930434fc0c61658be2289dab263535109803William King char *directory;
fccb930434fc0c61658be2289dab263535109803William King
f4cbe536b11da614fe05aeaeff41e324854cda7bMark Andrews REQUIRE(strcasecmp("directory", clausename) == 0);
fccb930434fc0c61658be2289dab263535109803William King
fccb930434fc0c61658be2289dab263535109803William King UNUSED(arg);
fccb930434fc0c61658be2289dab263535109803William King UNUSED(clausename);
/*
* Change directory.
*/
directory = cfg_obj_asstring(obj);
result = isc_dir_chdir(directory);
if (result != ISC_R_SUCCESS) {
cfg_obj_log(obj, log, ISC_LOG_ERROR,
"change directory to '%s' failed: %s",
directory, isc_result_totext(result));
return (result);
}
return (ISC_R_SUCCESS);
}
int
main(int argc, char **argv) {
int c;
cfg_parser_t *parser = NULL;
cfg_obj_t *config = NULL;
const char *conffile = NULL;
isc_mem_t *mctx = NULL;
isc_result_t result;
while ((c = isc_commandline_parse(argc, argv, "t:v")) != EOF) {
switch (c) {
case 't':
result = isc_dir_chroot(isc_commandline_argument);
if (result != ISC_R_SUCCESS) {
fprintf(stderr, "isc_dir_chroot: %s\n",
isc_result_totext(result));
exit(1);
}
result = isc_dir_chdir("/");
if (result != ISC_R_SUCCESS) {
fprintf(stderr, "isc_dir_chdir: %s\n",
isc_result_totext(result));
exit(1);
}
break;
case 'v':
printf(VERSION "\n");
exit(0);
default:
usage();
}
}
if (argv[isc_commandline_index] != NULL)
conffile = argv[isc_commandline_index];
if (conffile == NULL || conffile[0] == '\0')
conffile = NS_SYSCONFDIR "/named.conf";
RUNTIME_CHECK(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS);
RUNTIME_CHECK(setup_logging(mctx, &log) == ISC_R_SUCCESS);
RUNTIME_CHECK(cfg_parser_create(mctx, log, &parser) == ISC_R_SUCCESS);
cfg_parser_setcallback(parser, directory_callback, NULL);
if (cfg_parse_file(parser, conffile, &cfg_type_namedconf, &config) !=
ISC_R_SUCCESS)
exit(1);
RUNTIME_CHECK(cfg_check_namedconf(config, log, mctx) == ISC_R_SUCCESS);
cfg_obj_destroy(parser, &config);
cfg_parser_destroy(&parser);
isc_log_destroy(&log);
isc_mem_destroy(&mctx);
return (0);
}