From fa2687cc7a1d49b209065a1a310c02117f4a5f65a7e019f425940d6591ab3967 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20M=C3=BCller?= Date: Fri, 8 May 2015 14:24:45 +0000 Subject: [PATCH] Accepting request 305950 from home:guohouzuo:freeipa - Enable export libraries to support plugin development. Install DNSSEC root key. Expose new interface for developing dynamic zone database. + dns_dynamic_db.patch OBS-URL: https://build.opensuse.org/request/show/305950 OBS-URL: https://build.opensuse.org/package/show/network/bind?expand=0&rev=165 --- bind.changes | 8 + bind.spec | 12 +- dns_dynamic_db.patch | 743 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 762 insertions(+), 1 deletion(-) create mode 100644 dns_dynamic_db.patch diff --git a/bind.changes b/bind.changes index 0a55c3b..4e6eb83 100644 --- a/bind.changes +++ b/bind.changes @@ -1,3 +1,11 @@ +------------------------------------------------------------------- +Fri May 8 11:48:03 UTC 2015 - hguo@suse.com + +- Enable export libraries to support plugin development. + Install DNSSEC root key. + Expose new interface for developing dynamic zone database. + + dns_dynamic_db.patch + ------------------------------------------------------------------- Tue Feb 10 22:24:26 UTC 2015 - dvaleev@suse.com diff --git a/bind.spec b/bind.spec index 677c2b2..a78af30 100644 --- a/bind.spec +++ b/bind.spec @@ -38,6 +38,7 @@ Source40: http://www.venaas.no/ldap/bind-sdb/dnszone-schema.txt Patch: configure.in.diff Patch1: Makefile.in.diff Patch4: perl-path.diff +Patch5: dns_dynamic_db.patch Patch51: pie_compile.diff Patch52: named-bootconf.diff Patch53: bind-sdb-ldap.patch @@ -364,6 +365,7 @@ Name Domain (BIND) DNS server is found in the package named bind. %patch -p1 %patch1 -p1 %patch4 -p0 +%patch5 -p1 #%patch50 %patch51 %patch52 @@ -420,6 +422,9 @@ CONFIGURE_OPTIONS="\ --sysconfdir=%{_sysconfdir} \ --localstatedir=%{_var} \ --libdir=%{_libdir} \ + --enable-exportlib \ + --with-export-libdir=%{_libdir} \ + --with-export-includedir=%{_includedir} \ --includedir=%{_includedir}/bind \ --mandir=%{_mandir} \ --infodir=%{_infodir} \ @@ -478,11 +483,14 @@ mkdir -p \ ${RPM_BUILD_ROOT}%{_mandir}/{man1,man3,man5,man8} \ ${RPM_BUILD_ROOT}/var/adm/fillup-templates \ ${RPM_BUILD_ROOT}/%{_rundir} \ - ${RPM_BUILD_ROOT}/%{_sysconfdir}/sysconfig/SuSEfirewall2.d/services + ${RPM_BUILD_ROOT}/%{_sysconfdir}/sysconfig/SuSEfirewall2.d/services \ + ${RPM_BUILD_ROOT}%{_includedir}/bind/dns %{__make} DESTDIR=${RPM_BUILD_ROOT} install pushd contrib/idn/idnkit-1.0-src %{__make} DESTDIR=${RPM_BUILD_ROOT} install popd +# install header file for developing Dynamic DB plugin +install -m 0644 ./lib/dns/include/dns/dynamic_db.h ${RPM_BUILD_ROOT}%{_includedir}/bind/dns/ # remove useless .la files rm -f ${RPM_BUILD_ROOT}/%{_lib}/libidnkit.la rm -f ${RPM_BUILD_ROOT}/%{_lib}/libidnkitlite.la @@ -541,6 +549,7 @@ pushd ${RPM_BUILD_ROOT}%{_defaultdocdir}/bind/contrib/idn/idnkit-1.0-src rm -rf include lib man map patch tools win wsock Makefile.in acconfig.h aclocal.m4 config.* configure* install-sh ltconfig make.wnt mkinstalldirs popd # --------------------------------------------------------------------------- +install -m 0644 bind.keys ${RPM_BUILD_ROOT}/var/lib/named/named.root.key %pre # Are we updating from a package named bind9? @@ -799,6 +808,7 @@ fi %config %{_var}/lib/named/root.hint %config %{_var}/lib/named/127.0.0.zone %config %{_var}/lib/named/localhost.zone +%config %{_var}/lib/named/named.root.key %ghost %{_var}/lib/named/etc/localtime %attr(0644,root,named) %ghost %{_var}/lib/named/etc/named.conf.include %attr(-,named,named) %dir %{_var}/lib/named/var/run/named diff --git a/dns_dynamic_db.patch b/dns_dynamic_db.patch new file mode 100644 index 0000000..6135609 --- /dev/null +++ b/dns_dynamic_db.patch @@ -0,0 +1,743 @@ +# The patch content was originally written by Tomas Hozza: +# From 9b40e9166ee28f2d00424248fe303045e42b1c93 Mon Sep 17 00:00:00 2001 +# From: Tomas Hozza +# Date: Tue, 29 Jul 2014 15:16:10 +0200 +# Subject: [PATCH] Dynamic DB database for BIND 9.10 +# Signed-off-by: Tomas Hozza +# +# Based on the original patch, some minor adjustments to line numbers are made by Howard Guo . + +diff -rupN bind-9.10.1-P1-orig/bin/named/main.c bind-9.10.1-P1-patched/bin/named/main.c +--- bind-9.10.1-P1-orig/bin/named/main.c 2014-11-21 00:56:37.000000000 +0100 ++++ bind-9.10.1-P1-patched/bin/named/main.c 2015-04-27 11:33:20.619196452 +0200 +@@ -43,6 +43,7 @@ + #include + + #include ++#include + #include + #include + #include +diff -rupN bind-9.10.1-P1-orig/bin/named/server.c bind-9.10.1-P1-patched/bin/named/server.c +--- bind-9.10.1-P1-orig/bin/named/server.c 2014-11-21 00:56:37.000000000 +0100 ++++ bind-9.10.1-P1-patched/bin/named/server.c 2015-04-27 11:33:20.620196464 +0200 +@@ -68,6 +68,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -1304,6 +1305,72 @@ configure_peer(const cfg_obj_t *cpeer, i + } + + static isc_result_t ++configure_dynamic_db(const cfg_obj_t *dynamic_db, isc_mem_t *mctx, ++ const dns_dyndb_arguments_t *dyndb_args) ++{ ++ 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; ++ result = cfg_map_get(options, "arg", &obj); ++ if (result == ISC_R_NOTFOUND) ++ len = 0; ++ else if (result == ISC_R_SUCCESS) ++ len = cfg_list_length(obj, isc_boolean_false); ++ else ++ goto cleanup; ++ ++ /* Account for the last terminating NULL. */ ++ len++; ++ ++ argv = isc_mem_allocate(mctx, len * sizeof(const char *)); ++ if (argv == NULL) { ++ result = ISC_R_NOMEMORY; ++ goto cleanup; ++ } ++ 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, dyndb_args)); ++ ++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; +@@ -2323,6 +2390,7 @@ configure_view(dns_view_t *view, dns_vie + const cfg_obj_t *dlz; + unsigned int dlzargc; + char **dlzargv; ++ const cfg_obj_t *dynamic_db_list; + const cfg_obj_t *disabled; + const cfg_obj_t *obj; + const cfg_listelt_t *element; +@@ -2599,6 +2667,8 @@ configure_view(dns_view_t *view, dns_vie + } + } + ++ ++ + /* + * Obtain configuration parameters that affect the decision of whether + * we can reuse/share an existing cache. +@@ -3615,6 +3685,37 @@ configure_view(dns_view_t *view, dns_vie + dns_view_setrootdelonly(view, ISC_FALSE); + + /* ++ * 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); ++ element = cfg_list_first(dynamic_db_list); ++ if (element != NULL) { ++ dns_dyndb_arguments_t *args; ++ ++ args = dns_dyndb_arguments_create(mctx); ++ if (args == NULL) { ++ result = ISC_R_NOMEMORY; ++ goto cleanup; ++ } ++ dns_dyndb_set_view(args, view); ++ dns_dyndb_set_zonemgr(args, ns_g_server->zonemgr); ++ dns_dyndb_set_task(args, ns_g_server->task); ++ dns_dyndb_set_timermgr(args, ns_g_timermgr); ++ while (element != NULL) { ++ obj = cfg_listelt_value(element); ++ CHECK(configure_dynamic_db(obj, mctx, args)); ++ ++ element = cfg_list_next(element); ++ } ++ ++ dns_dyndb_arguments_destroy(mctx, args); ++ } ++ ++ /* + * Setup automatic empty zones. If recursion is off then + * they are disabled by default. + */ +@@ -5376,6 +5477,7 @@ load_configuration(const char *filename, + cfg_aclconfctx_detach(&ns_g_aclconfctx); + CHECK(cfg_aclconfctx_create(ns_g_mctx, &ns_g_aclconfctx)); + ++ dns_dynamic_db_cleanup(ISC_FALSE); + /* + * Parse the global default pseudo-config file. + */ +@@ -6582,6 +6684,8 @@ shutdown_server(isc_task_t *task, isc_ev + dns_view_detach(&view); + } + ++ dns_dynamic_db_cleanup(ISC_TRUE); ++ + while ((nsc = ISC_LIST_HEAD(server->cachelist)) != NULL) { + ISC_LIST_UNLINK(server->cachelist, nsc, link); + dns_cache_detach(&nsc->cache); +diff -rupN bind-9.10.1-P1-orig/lib/dns/dynamic_db.c bind-9.10.1-P1-patched/lib/dns/dynamic_db.c +--- bind-9.10.1-P1-orig/lib/dns/dynamic_db.c 1970-01-01 01:00:00.000000000 +0100 ++++ bind-9.10.1-P1-patched/lib/dns/dynamic_db.c 2015-04-27 11:33:20.620196464 +0200 +@@ -0,0 +1,366 @@ ++/* ++ * Copyright (C) 2008-2011 Red Hat, Inc. ++ * ++ * Permission to use, copy, modify, and/or distribute this software for any ++ * purpose with or without fee is hereby granted, provided that the above ++ * copyright notice and this permission notice appear in all copies. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS" AND Red Hat DISCLAIMS ALL WARRANTIES WITH ++ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ++ * AND FITNESS. IN NO EVENT SHALL Red Hat BE LIABLE FOR ANY SPECIAL, DIRECT, ++ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ++ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ++ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ++ * PERFORMANCE OF THIS SOFTWARE. ++ */ ++ ++ ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#if HAVE_DLFCN_H ++#include ++#endif ++ ++#ifndef DYNDB_LIBDIR ++#define DYNDB_LIBDIR "" ++#endif ++ ++#define CHECK(op) \ ++ do { result = (op); \ ++ if (result != ISC_R_SUCCESS) goto cleanup; \ ++ } while (0) ++ ++ ++typedef isc_result_t (*register_func_t)(isc_mem_t *mctx, const char *name, ++ const char * const *argv, ++ const dns_dyndb_arguments_t *dyndb_args); ++typedef void (*destroy_func_t)(void); ++ ++typedef struct dyndb_implementation dyndb_implementation_t; ++ ++struct dyndb_implementation { ++ isc_mem_t *mctx; ++ void *handle; ++ register_func_t register_function; ++ destroy_func_t destroy_function; ++ LINK(dyndb_implementation_t) link; ++}; ++ ++struct dns_dyndb_arguments { ++ dns_view_t *view; ++ dns_zonemgr_t *zmgr; ++ isc_task_t *task; ++ isc_timermgr_t *timermgr; ++}; ++ ++/* List of implementations. Locked by dyndb_lock. */ ++static LIST(dyndb_implementation_t) dyndb_implementations; ++/* Locks dyndb_implementations. */ ++static isc_mutex_t dyndb_lock; ++static isc_once_t once = ISC_ONCE_INIT; ++ ++static void ++dyndb_initialize(void) { ++ RUNTIME_CHECK(isc_mutex_init(&dyndb_lock) == ISC_R_SUCCESS); ++ INIT_LIST(dyndb_implementations); ++} ++ ++ ++#if HAVE_DLFCN_H ++static isc_result_t ++load_symbol(void *handle, const char *symbol_name, void **symbolp) ++{ ++ const char *errmsg; ++ void *symbol; ++ ++ REQUIRE(handle != NULL); ++ REQUIRE(symbolp != NULL && *symbolp == NULL); ++ ++ symbol = dlsym(handle, symbol_name); ++ if (symbol == NULL) { ++ errmsg = dlerror(); ++ if (errmsg == NULL) ++ errmsg = "returned function pointer is NULL"; ++ isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, ++ DNS_LOGMODULE_DYNDB, ISC_LOG_ERROR, ++ "failed to lookup symbol %s: %s", ++ symbol_name, errmsg); ++ return ISC_R_FAILURE; ++ } ++ dlerror(); ++ ++ *symbolp = symbol; ++ ++ return ISC_R_SUCCESS; ++} ++ ++static isc_result_t ++load_library(isc_mem_t *mctx, const char *filename, dyndb_implementation_t **impp) ++{ ++ isc_result_t result; ++ size_t module_size; ++ isc_buffer_t *module_buf = NULL; ++ isc_region_t module_region; ++ void *handle = NULL; ++ dyndb_implementation_t *imp; ++ register_func_t register_function = NULL; ++ destroy_func_t destroy_function = NULL; ++ ++ REQUIRE(impp != NULL && *impp == NULL); ++ ++ /* Build up the full path. */ ++ module_size = strlen(DYNDB_LIBDIR) + strlen(filename) + 1; ++ CHECK(isc_buffer_allocate(mctx, &module_buf, module_size)); ++ isc_buffer_putstr(module_buf, DYNDB_LIBDIR); ++ isc_buffer_putstr(module_buf, filename); ++ isc_buffer_putuint8(module_buf, 0); ++ isc_buffer_region(module_buf, &module_region); ++ ++ handle = dlopen((char *)module_region.base, RTLD_LAZY); ++ if (handle == NULL) { ++ isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, ++ DNS_LOGMODULE_DYNDB, ISC_LOG_ERROR, ++ "failed to dynamically load driver '%s': %s", ++ filename, dlerror()); ++ result = ISC_R_FAILURE; ++ goto cleanup; ++ } ++ dlerror(); ++ ++ CHECK(load_symbol(handle, "dynamic_driver_init", ++ (void **)®ister_function)); ++ CHECK(load_symbol(handle, "dynamic_driver_destroy", ++ (void **)&destroy_function)); ++ ++ imp = isc_mem_get(mctx, sizeof(dyndb_implementation_t)); ++ if (imp == NULL) { ++ result = ISC_R_NOMEMORY; ++ goto cleanup; ++ } ++ ++ imp->mctx = NULL; ++ isc_mem_attach(mctx, &imp->mctx); ++ imp->handle = handle; ++ imp->register_function = register_function; ++ imp->destroy_function = destroy_function; ++ INIT_LINK(imp, link); ++ ++ *impp = imp; ++ ++cleanup: ++ if (result != ISC_R_SUCCESS && handle != NULL) ++ dlclose(handle); ++ if (module_buf != NULL) ++ isc_buffer_free(&module_buf); ++ ++ return result; ++} ++ ++static void ++unload_library(dyndb_implementation_t **impp) ++{ ++ dyndb_implementation_t *imp; ++ ++ REQUIRE(impp != NULL && *impp != NULL); ++ ++ imp = *impp; ++ ++ isc_mem_putanddetach(&imp->mctx, imp, sizeof(dyndb_implementation_t)); ++ ++ *impp = NULL; ++} ++ ++#else /* HAVE_DLFCN_H */ ++static isc_result_t ++load_library(isc_mem_t *mctx, const char *filename, dyndb_implementation_t **impp) ++{ ++ UNUSED(mctx); ++ UNUSED(filename); ++ UNUSED(impp); ++ ++ isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DYNDB, ++ ISC_LOG_ERROR, ++ "dynamic database support is not implemented") ++ ++ return ISC_R_NOTIMPLEMENTED; ++} ++ ++static void ++unload_library(dyndb_implementation_t **impp) ++{ ++ dyndb_implementation_t *imp; ++ ++ REQUIRE(impp != NULL && *impp != NULL); ++ ++ imp = *impp; ++ ++ isc_mem_putanddetach(&imp->mctx, imp, sizeof(dyndb_implementation_t)); ++ ++ *impp = NULL; ++} ++#endif /* HAVE_DLFCN_H */ ++ ++isc_result_t ++dns_dynamic_db_load(const char *libname, const char *name, isc_mem_t *mctx, ++ const char * const *argv, ++ const dns_dyndb_arguments_t *dyndb_args) ++{ ++ isc_result_t result; ++ dyndb_implementation_t *implementation = NULL; ++ ++ RUNTIME_CHECK(isc_once_do(&once, dyndb_initialize) == ISC_R_SUCCESS); ++ ++ CHECK(load_library(mctx, libname, &implementation)); ++ CHECK(implementation->register_function(mctx, name, argv, dyndb_args)); ++ ++ LOCK(&dyndb_lock); ++ APPEND(dyndb_implementations, implementation, link); ++ UNLOCK(&dyndb_lock); ++ ++ return ISC_R_SUCCESS; ++ ++cleanup: ++ if (implementation != NULL) ++ unload_library(&implementation); ++ ++ return result; ++} ++ ++void ++dns_dynamic_db_cleanup(isc_boolean_t exiting) ++{ ++ dyndb_implementation_t *elem; ++ dyndb_implementation_t *prev; ++ ++ RUNTIME_CHECK(isc_once_do(&once, dyndb_initialize) == ISC_R_SUCCESS); ++ ++ LOCK(&dyndb_lock); ++ elem = TAIL(dyndb_implementations); ++ while (elem != NULL) { ++ prev = PREV(elem, link); ++ UNLINK(dyndb_implementations, elem, link); ++ elem->destroy_function(); ++ unload_library(&elem); ++ elem = prev; ++ } ++ UNLOCK(&dyndb_lock); ++ ++ if (exiting == ISC_TRUE) ++ isc_mutex_destroy(&dyndb_lock); ++} ++ ++dns_dyndb_arguments_t * ++dns_dyndb_arguments_create(isc_mem_t *mctx) ++{ ++ dns_dyndb_arguments_t *args; ++ ++ args = isc_mem_get(mctx, sizeof(*args)); ++ if (args != NULL) ++ memset(args, 0, sizeof(*args)); ++ ++ return args; ++} ++ ++void ++dns_dyndb_arguments_destroy(isc_mem_t *mctx, dns_dyndb_arguments_t *args) ++{ ++ REQUIRE(args != NULL); ++ ++ dns_dyndb_set_view(args, NULL); ++ dns_dyndb_set_zonemgr(args, NULL); ++ dns_dyndb_set_task(args, NULL); ++ dns_dyndb_set_timermgr(args, NULL); ++ ++ isc_mem_put(mctx, args, sizeof(*args)); ++} ++ ++void ++dns_dyndb_set_view(dns_dyndb_arguments_t *args, dns_view_t *view) ++{ ++ REQUIRE(args != NULL); ++ ++ if (args->view != NULL) ++ dns_view_detach(&args->view); ++ if (view != NULL) ++ dns_view_attach(view, &args->view); ++} ++ ++dns_view_t * ++dns_dyndb_get_view(dns_dyndb_arguments_t *args) ++{ ++ REQUIRE(args != NULL); ++ ++ return args->view; ++} ++ ++void ++dns_dyndb_set_zonemgr(dns_dyndb_arguments_t *args, dns_zonemgr_t *zmgr) ++{ ++ REQUIRE(args != NULL); ++ ++ if (args->zmgr != NULL) ++ dns_zonemgr_detach(&args->zmgr); ++ if (zmgr != NULL) ++ dns_zonemgr_attach(zmgr, &args->zmgr); ++} ++ ++dns_zonemgr_t * ++dns_dyndb_get_zonemgr(dns_dyndb_arguments_t *args) ++{ ++ REQUIRE(args != NULL); ++ ++ return args->zmgr; ++} ++ ++void ++dns_dyndb_set_task(dns_dyndb_arguments_t *args, isc_task_t *task) ++{ ++ REQUIRE(args != NULL); ++ ++ if (args->task != NULL) ++ isc_task_detach(&args->task); ++ if (task != NULL) ++ isc_task_attach(task, &args->task); ++} ++ ++isc_task_t * ++dns_dyndb_get_task(dns_dyndb_arguments_t *args) ++{ ++ REQUIRE(args != NULL); ++ ++ return args->task; ++} ++ ++void ++dns_dyndb_set_timermgr(dns_dyndb_arguments_t *args, isc_timermgr_t *timermgr) ++{ ++ REQUIRE(args != NULL); ++ ++ args->timermgr = timermgr; ++} ++ ++isc_timermgr_t * ++dns_dyndb_get_timermgr(dns_dyndb_arguments_t *args) ++{ ++ REQUIRE(args != NULL); ++ ++ return args->timermgr; ++} +diff -rupN bind-9.10.1-P1-orig/lib/dns/include/dns/dynamic_db.h bind-9.10.1-P1-patched/lib/dns/include/dns/dynamic_db.h +--- bind-9.10.1-P1-orig/lib/dns/include/dns/dynamic_db.h 1970-01-01 01:00:00.000000000 +0100 ++++ bind-9.10.1-P1-patched/lib/dns/include/dns/dynamic_db.h 2015-04-27 11:33:20.620196464 +0200 +@@ -0,0 +1,50 @@ ++/* ++ * Copyright (C) 2008-2011 Red Hat, Inc. ++ * ++ * Permission to use, copy, modify, and/or distribute this software for any ++ * purpose with or without fee is hereby granted, provided that the above ++ * copyright notice and this permission notice appear in all copies. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS" AND Red Hat DISCLAIMS ALL WARRANTIES WITH ++ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ++ * AND FITNESS. IN NO EVENT SHALL Red Hat BE LIABLE FOR ANY SPECIAL, DIRECT, ++ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ++ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ++ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ++ * PERFORMANCE OF THIS SOFTWARE. ++ */ ++ ++ ++#ifndef DYNAMIC_DB_H ++#define DYNAMIC_DB_H ++ ++#include ++ ++#include ++ ++/* ++ * TODO: ++ * Reformat the prototypes. ++ * Add annotated comments. ++ */ ++ ++isc_result_t dns_dynamic_db_load(const char *libname, const char *name, ++ isc_mem_t *mctx, const char * const *argv, ++ const dns_dyndb_arguments_t *dyndb_args); ++ ++void dns_dynamic_db_cleanup(isc_boolean_t exiting); ++ ++dns_dyndb_arguments_t *dns_dyndb_arguments_create(isc_mem_t *mctx); ++void dns_dyndb_arguments_destroy(isc_mem_t *mctx, dns_dyndb_arguments_t *args); ++ ++void dns_dyndb_set_view(dns_dyndb_arguments_t *args, dns_view_t *view); ++dns_view_t *dns_dyndb_get_view(dns_dyndb_arguments_t *args); ++void dns_dyndb_set_zonemgr(dns_dyndb_arguments_t *args, dns_zonemgr_t *zmgr); ++dns_zonemgr_t *dns_dyndb_get_zonemgr(dns_dyndb_arguments_t *args); ++void dns_dyndb_set_task(dns_dyndb_arguments_t *args, isc_task_t *task); ++isc_task_t *dns_dyndb_get_task(dns_dyndb_arguments_t *args); ++void dns_dyndb_set_timermgr(dns_dyndb_arguments_t *args, ++ isc_timermgr_t *timermgr); ++isc_timermgr_t *dns_dyndb_get_timermgr(dns_dyndb_arguments_t *args); ++ ++#endif +diff -rupN bind-9.10.1-P1-orig/lib/dns/include/dns/log.h bind-9.10.1-P1-patched/lib/dns/include/dns/log.h +--- bind-9.10.1-P1-orig/lib/dns/include/dns/log.h 2014-11-21 00:56:37.000000000 +0100 ++++ bind-9.10.1-P1-patched/lib/dns/include/dns/log.h 2015-04-27 11:33:20.621196475 +0200 +@@ -78,6 +78,7 @@ LIBDNS_EXTERNAL_DATA extern isc_logmodul + #define DNS_LOGMODULE_DNSSEC (&dns_modules[27]) + #define DNS_LOGMODULE_CRYPTO (&dns_modules[28]) + #define DNS_LOGMODULE_PACKETS (&dns_modules[29]) ++#define DNS_LOGMODULE_DYNDB (&dns_modules[30]) + + ISC_LANG_BEGINDECLS + +diff -rupN bind-9.10.1-P1-orig/lib/dns/include/dns/Makefile.in bind-9.10.1-P1-patched/lib/dns/include/dns/Makefile.in +--- bind-9.10.1-P1-orig/lib/dns/include/dns/Makefile.in 2014-11-21 00:56:37.000000000 +0100 ++++ bind-9.10.1-P1-patched/lib/dns/include/dns/Makefile.in 2015-04-27 11:33:20.621196475 +0200 +@@ -23,7 +23,7 @@ top_srcdir = @top_srcdir@ + + HEADERS = acache.h acl.h adb.h bit.h byaddr.h cache.h callbacks.h cert.h \ + client.h clientinfo.h compress.h \ +- db.h dbiterator.h dbtable.h diff.h dispatch.h \ ++ db.h dbiterator.h dbtable.h diff.h dispatch.h dynamic_db.h \ + dlz.h dlz_dlopen.h dns64.h dnssec.h ds.h dsdigest.h \ + ecdb.h events.h fixedname.h forward.h geoip.h iptable.h \ + journal.h keydata.h keyflags.h keytable.h keyvalues.h \ +diff -rupN bind-9.10.1-P1-orig/lib/dns/include/dns/types.h bind-9.10.1-P1-patched/lib/dns/include/dns/types.h +--- bind-9.10.1-P1-orig/lib/dns/include/dns/types.h 2014-11-21 00:56:37.000000000 +0100 ++++ bind-9.10.1-P1-patched/lib/dns/include/dns/types.h 2015-04-27 11:33:20.621196475 +0200 +@@ -139,6 +139,7 @@ typedef struct dns_zone dns_zone_t; + typedef ISC_LIST(dns_zone_t) dns_zonelist_t; + typedef struct dns_zonemgr dns_zonemgr_t; + typedef struct dns_zt dns_zt_t; ++typedef struct dns_dyndb_arguments dns_dyndb_arguments_t; + + /* + * If we are not using GSSAPI, define the types we use as opaque types here. +diff -rupN bind-9.10.1-P1-orig/lib/dns/log.c bind-9.10.1-P1-patched/lib/dns/log.c +--- bind-9.10.1-P1-orig/lib/dns/log.c 2014-11-21 00:56:37.000000000 +0100 ++++ bind-9.10.1-P1-patched/lib/dns/log.c 2015-04-27 11:33:20.621196475 +0200 +@@ -84,6 +84,7 @@ LIBDNS_EXTERNAL_DATA isc_logmodule_t dns + { "dns/dnssec", 0 }, + { "dns/crypto", 0 }, + { "dns/packets", 0 }, ++ { "dns/dynamic_db", 0 }, + { NULL, 0 } + }; + +diff -rupN bind-9.10.1-P1-orig/lib/dns/Makefile.in bind-9.10.1-P1-patched/lib/dns/Makefile.in +--- bind-9.10.1-P1-orig/lib/dns/Makefile.in 2014-11-21 00:56:37.000000000 +0100 ++++ bind-9.10.1-P1-patched/lib/dns/Makefile.in 2015-04-27 11:36:30.228342475 +0200 +@@ -65,7 +65,7 @@ GEOIPLINKOBJS = geoip.@O@ + DNSOBJS = acache.@O@ acl.@O@ adb.@O@ byaddr.@O@ \ + cache.@O@ callbacks.@O@ clientinfo.@O@ compress.@O@ \ + db.@O@ dbiterator.@O@ dbtable.@O@ diff.@O@ dispatch.@O@ \ +- dlz.@O@ dns64.@O@ dnssec.@O@ ds.@O@ forward.@O@ \ ++ dlz.@O@ dns64.@O@ dnssec.@O@ ds.@O@ dynamic_db.@O@ forward.@O@ \ + iptable.@O@ journal.@O@ keydata.@O@ keytable.@O@ \ + lib.@O@ log.@O@ lookup.@O@ \ + master.@O@ masterdump.@O@ message.@O@ \ +@@ -103,7 +103,7 @@ GEOIOLINKSRCS = geoip.c + DNSSRCS = acache.c acl.c adb.c byaddr.c \ + cache.c callbacks.c clientinfo.c compress.c \ + db.c dbiterator.c dbtable.c diff.c dispatch.c \ +- dlz.c dns64.c dnssec.c ds.c forward.c geoip.c \ ++ dlz.c dns64.c dnssec.c ds.c dynamic_db.c forward.c geoip.c \ + iptable.c journal.c keydata.c keytable.c lib.c log.c \ + lookup.c master.c masterdump.c message.c \ + name.c ncache.c nsec.c nsec3.c order.c peer.c portlist.c \ +@@ -138,6 +138,11 @@ version.@O@: version.c + -DLIBAGE=${LIBAGE} \ + -c ${srcdir}/version.c + ++dynamic_db.@O@: dynamic_db.c ++ ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} \ ++ -DDYNDB_LIBDIR=\"/var/lib/named/\" \ ++ -c ${srcdir}/dynamic_db.c ++ + libdns.@SA@: ${OBJS} + ${AR} ${ARFLAGS} $@ ${OBJS} + ${RANLIB} $@ +diff -rupN bind-9.10.1-P1-orig/lib/isccfg/namedconf.c bind-9.10.1-P1-patched/lib/isccfg/namedconf.c +--- bind-9.10.1-P1-orig/lib/isccfg/namedconf.c 2014-11-21 00:56:37.000000000 +0100 ++++ bind-9.10.1-P1-patched/lib/isccfg/namedconf.c 2015-04-27 11:33:20.621196475 +0200 +@@ -660,6 +660,40 @@ static cfg_type_t cfg_type_transferforma + &transferformat_enums + }; + ++/* ++ * Dynamic database clauses. ++ */ ++ ++static cfg_clausedef_t ++dynamic_db_clauses[] = { ++ { "library", &cfg_type_qstring, 0 }, ++ { "arg", &cfg_type_qstring, CFG_CLAUSEFLAG_MULTI }, ++ { NULL, NULL, 0 } ++}; ++ ++static cfg_clausedef_t * ++dynamic_db_clausesets[] = { ++ dynamic_db_clauses, ++ NULL ++}; ++ ++static cfg_type_t cfg_type_dynamic_db_opts = { ++ "dynamically_loadable_zones_opts", cfg_parse_map, ++ cfg_print_map, cfg_doc_map, &cfg_rep_map, ++ dynamic_db_clausesets ++}; ++ ++static cfg_tuplefielddef_t dynamic_db_fields[] = { ++ { "name", &cfg_type_astring, 0 }, ++ { "options", &cfg_type_dynamic_db_opts, 0 }, ++ { NULL, NULL, 0 } ++}; ++ ++static cfg_type_t cfg_type_dynamic_db = { ++ "dynamic_db", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple, ++ &cfg_rep_tuple, dynamic_db_fields ++}; ++ + /*% + * The special keyword "none", as used in the pid-file option. + */ +@@ -906,6 +940,7 @@ namedconf_or_view_clauses[] = { + { "key", &cfg_type_key, CFG_CLAUSEFLAG_MULTI }, + { "zone", &cfg_type_zone, CFG_CLAUSEFLAG_MULTI }, + { "dlz", &cfg_type_dlz, CFG_CLAUSEFLAG_MULTI }, ++ { "dynamic-db", &cfg_type_dynamic_db, CFG_CLAUSEFLAG_MULTI }, + { "server", &cfg_type_server, CFG_CLAUSEFLAG_MULTI }, + { "trusted-keys", &cfg_type_dnsseckeys, CFG_CLAUSEFLAG_MULTI }, + { "managed-keys", &cfg_type_managedkeys, CFG_CLAUSEFLAG_MULTI }, +@@ -2131,6 +2166,7 @@ static cfg_type_t cfg_type_dialuptype = + &cfg_rep_string, dialup_enums + }; + ++ + static const char *notify_enums[] = { "explicit", "master-only", NULL }; + static isc_result_t + parse_notify_type(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) { +@@ -3199,3 +3235,4 @@ static cfg_type_t cfg_type_maxttl = { + "maxttl_no_default", parse_maxttl, cfg_print_ustring, cfg_doc_terminal, + &cfg_rep_string, maxttl_enums + }; ++