Add driver and callback skeletons for configuration parsing.

This commit is contained in:
James Brister
1999-10-13 17:50:21 +00:00
parent 78f12b4789
commit c6e10b826e

View File

@@ -33,6 +33,7 @@
#include <isc/timer.h>
#include <isc/app.h>
#include <dns/confparser.h>
#include <dns/types.h>
#include <dns/result.h>
#include <dns/master.h>
@@ -48,6 +49,7 @@
#include <dns/message.h>
#include <dns/journal.h>
#include <dns/view.h>
#include <dns/zone.h>
#include <named/types.h>
#include <named/globals.h>
@@ -57,6 +59,17 @@
#include "../../isc/util.h" /* XXXRTH */
static isc_result_t server_config_load(const char *conffile, isc_mem_t *mem);
static isc_result_t server_config_reload(const char *conffile, isc_mem_t *mem);
static isc_result_t zoneload(dns_c_ctx_t *ctx, dns_c_zone_t *zone,
dns_c_view_t *view, void *uap);
static isc_result_t zonereload(dns_c_ctx_t *ctx, dns_c_zone_t *zone,
dns_c_view_t *view, void *uap);
static isc_result_t optionsload(dns_c_ctx_t *ctx, void *uap);
static isc_result_t optionsreload(dns_c_ctx_t *ctx, void *uap);
static isc_task_t * server_task;
static dns_db_t * version_db;
static dns_view_t * version_view;
@@ -282,6 +295,14 @@ static void
load_configuration(void) {
isc_result_t result;
result = server_config_load("/etc/named.conf", ns_g_mctx);
if (result != ISC_R_SUCCESS) {
printf("server_config_load(): %s\n",
isc_result_totext(result));
/* XXX How do we make things die here? shutdown_server()?*/
}
#if 0
/*
* XXXRTH loading code below is temporary; it
* will be replaced by proper config file processing.
@@ -292,6 +313,7 @@ load_configuration(void) {
/* XXXRTH */
printf("load_all(): %s\n", isc_result_totext(result));
}
#endif
}
static void
@@ -397,3 +419,169 @@ ns_server_init(void) {
return (result);
}
static isc_result_t
server_config_load(const char *conffile, isc_mem_t *mem)
{
dns_c_cbks_t callbacks;
dns_c_ctx_t *configctx = NULL;
isc_result_t res;
/* Set up callbacks for the parser.
*
* If zonecbk field is non-NULL, then the function it points to
* will be called after each zone statement is completely
* parsed. The zone will be passed in as a paramater, and also
* installed in the config structure, but after the zonecbk
* function returns it will be removed from the config
* structure. The zonecbkuap value will be passed through to the
* zonecbk function as a parameter.
*
* If the optscbk function is non-NULL, then it is called after the
* options statement is completely parsed.
*
* These functions must return ISC_R_SUCCESS, or the parser will
* consider that a failure and will terminate. The functions should
* not modify their parameters.
*/
callbacks.zonecbk = zoneload;
callbacks.optscbk = NULL;
callbacks.zonecbkuap = NULL;
callbacks.optscbkuap = NULL;
/* XXX should log rather than write to stderr */
fprintf(stderr, "named: loading config file %s\n", conffile);
res = dns_c_parse_namedconf(NULL, /* XXX isc_log_t to use??? */
conffile, mem, &configctx,
&callbacks);
if (res != ISC_R_SUCCESS) {
/* XXX should log rather than write to stderr */
fprintf(stderr, "named: failed to load config file %s\n",
conffile);
return (ISC_R_FAILURE);
}
RWLOCK(&ns_g_confctxlock, isc_rwlocktype_write);
if (ns_g_confctx != NULL) {
dns_c_ctx_delete(NULL /* XXX isc_log_t */, &ns_g_confctx);
}
ns_g_confctx = configctx;
RWUNLOCK(&ns_g_confctxlock, isc_rwlocktype_write);
return (ISC_R_SUCCESS);
}
/* Function to be called whenever server must reload the config file,
e.g. on a SIGHUP. */
static isc_result_t
server_config_reload(const char *conffile, isc_mem_t *mem)
{
dns_c_cbks_t callbacks;
dns_c_ctx_t *configctx = NULL;
isc_result_t res;
/* Set up callbacks for the parser. See the comment in
* server_config_load() for usage.
*/
callbacks.zonecbk = zonereload;
callbacks.optscbk = optionsreload;
callbacks.zonecbkuap = NULL;
callbacks.optscbkuap = NULL;
/* XXX should log rather than write to stderr */
fprintf(stderr, "named: reloading config file %s\n", conffile);
res = dns_c_parse_namedconf(NULL, /* XXX isc_log_t to use??? */
conffile, mem, &configctx, &callbacks);
if (res != ISC_R_SUCCESS) {
/* XXX should log rather than write to stderr */
fprintf(stderr, "named: failed to reload config file %s\n",
conffile);
return (ISC_R_FAILURE);
}
RWLOCK(&ns_g_confctxlock, isc_rwlocktype_write);
if (ns_g_confctx != NULL) {
dns_c_ctx_delete(NULL /* XXX isc_log_t */, &ns_g_confctx);
}
ns_g_confctx = configctx;
RWUNLOCK(&ns_g_confctxlock, isc_rwlocktype_write);
return (ISC_R_SUCCESS);
}
/* Called during first time config file is loaded. Called after each zone
* statement is parsed.
*/
static isc_result_t
zoneload(dns_c_ctx_t *ctx, dns_c_zone_t *zone, dns_c_view_t *view, void *uap)
{
/*
* returning anything other than ISC_R_SUCCESS will cause parsing to
* fail.
*/
return (dns_zone_callback(ctx, zone, view, uap));
}
static isc_result_t
zonereload(dns_c_ctx_t *ctx, dns_c_zone_t *zone, dns_c_view_t *view, void *uap)
{
(void) ctx; (void) zone; (void) view; (void) uap; /* lint */
/*
* returning anything other than ISC_R_SUCCESS will cause parsing to
* fail.
*/
return (ISC_R_NOTIMPLEMENTED);
}
/* Called the first time the config file is loaded after the options
* statment is parsed
*/
static isc_result_t
optionsload(dns_c_ctx_t *ctx, void *uap)
{
(void) ctx; (void) uap; /* lint */
/* returning anything other than ISC_R_SUCCESS will cause parsing to
* fail.
*/
return (ISC_R_SUCCESS);
}
/* Called the subsequent times the config file is loaded after the options
* statment is parsed
*/
static isc_result_t
optionsreload(dns_c_ctx_t *ctx, void *uap)
{
(void) ctx; (void) uap; /* lint */
/* returning anything other than ISC_R_SUCCESS will cause parsing to
* fail.
*/
return (ISC_R_SUCCESS);
}