summaryrefslogtreecommitdiffstats
path: root/bin
diff options
context:
space:
mode:
authorMartin Nagy <mnagy@redhat.com>2008-12-09 19:43:46 +0100
committerMartin Nagy <mnagy@redhat.com>2009-02-11 20:40:41 +0100
commitaad64960a5681975b032c1e4fcd133e8f806c9cb (patch)
treee3099ae4b413a16558c8834d2d4b8f7f003f5b8b /bin
parentf50ae72ec3417cae55dd4e085991c01af9fdc5f1 (diff)
downloadbind_dynamic-aad64960a5681975b032c1e4fcd133e8f806c9cb.tar.gz
bind_dynamic-aad64960a5681975b032c1e4fcd133e8f806c9cb.tar.xz
bind_dynamic-aad64960a5681975b032c1e4fcd133e8f806c9cb.zip
Add support for runtime loading of database backends.
Diffstat (limited to 'bin')
-rw-r--r--bin/named/server.c79
1 files changed, 79 insertions, 0 deletions
diff --git a/bin/named/server.c b/bin/named/server.c
index 31b2761..12ac597 100644
--- a/bin/named/server.c
+++ b/bin/named/server.c
@@ -56,6 +56,7 @@
#ifdef DLZ
#include <dns/dlz.h>
#endif
+#include <dns/dynamic_db.h>
#include <dns/forward.h>
#include <dns/journal.h>
#include <dns/keytable.h>
@@ -849,6 +850,67 @@ configure_peer(const cfg_obj_t *cpeer, isc_mem_t *mctx, dns_peer_t **peerp) {
}
static isc_result_t
+configure_dynamic_db(const cfg_obj_t *dynamic_db, isc_mem_t *mctx,
+ dns_view_t *view)
+{
+ isc_result_t result;
+ const cfg_obj_t *obj;
+ const cfg_obj_t *options;
+ const cfg_listelt_t *element;
+ const char *name;
+ const char *libname;
+ const char **argv = NULL;
+ unsigned int i;
+ unsigned int len;
+
+ /* Get the name of the database. */
+ obj = cfg_tuple_get(dynamic_db, "name");
+ name = cfg_obj_asstring(obj);
+
+ /* Get options. */
+ options = cfg_tuple_get(dynamic_db, "options");
+
+ /* Get library name. */
+ obj = NULL;
+ CHECK(cfg_map_get(options, "library", &obj));
+ libname = cfg_obj_asstring(obj);
+
+ /* Create a list of arguments. */
+ obj = NULL;
+ CHECK(cfg_map_get(options, "arg", &obj));
+
+ len = cfg_list_length(obj, isc_boolean_false);
+ if (len == 0) {
+ argv = NULL;
+ } else {
+ len++;
+ argv = isc_mem_allocate(mctx, len * sizeof(const char *));
+ if (argv == NULL)
+ CHECK(ISC_R_NOMEMORY);
+ }
+ for (element = cfg_list_first(obj), i = 0;
+ element != NULL;
+ element = cfg_list_next(element), i++)
+ {
+ REQUIRE(i < len);
+
+ obj = cfg_listelt_value(element);
+ argv[i] = cfg_obj_asstring(obj);
+ }
+ REQUIRE(i < len);
+ argv[i] = NULL;
+
+ CHECK(dns_dynamic_db_load(libname, name, mctx, argv, view));
+
+cleanup:
+ if (argv != NULL)
+ isc_mem_free(mctx, argv);
+
+ return result;
+}
+
+
+static isc_result_t
disable_algorithms(const cfg_obj_t *disabled, dns_resolver_t *resolver) {
isc_result_t result;
const cfg_obj_t *algorithms;
@@ -999,6 +1061,7 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
unsigned int dlzargc;
char **dlzargv;
#endif
+ const cfg_obj_t *dynamic_db_list;
const cfg_obj_t *disabled;
const cfg_obj_t *obj;
const cfg_listelt_t *element;
@@ -1171,6 +1234,22 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
#endif
/*
+ * Configure dynamic databases.
+ */
+ dynamic_db_list = NULL;
+ if (voptions != NULL)
+ (void)cfg_map_get(voptions, "dynamic-db", &dynamic_db_list);
+ else
+ (void)cfg_map_get(config, "dynamic-db", &dynamic_db_list);
+ for (element = cfg_list_first(dynamic_db_list);
+ element != NULL;
+ element = cfg_list_next(element))
+ {
+ obj = cfg_listelt_value(element);
+ CHECK(configure_dynamic_db(obj, mctx, view));
+ }
+
+ /*
* Configure the view's cache. Try to reuse an existing
* cache if possible, otherwise create a new cache.
* Note that the ADB is not preserved in either case.