From e0f84e22edcc9d7fce88a9355cf1598f3168c6b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Mon, 20 Sep 2021 12:40:07 +0200 Subject: [PATCH 1/7] Remove old-style DLZ drivers linked into named at compile time The old-style DLZ drivers were already marked as no longer actively maintained and expected to be removed eventually. With the new automake build system, the old-style DLZ drivers were not updated, and instead of putting an effort into something that's not being maintained, let's rather remove the unmaintained code. Closes: #2814 --- bin/tests/system/Makefile.am | 1 - bin/tests/system/dlz/.gitignore | 1 - bin/tests/system/dlz/clean.sh | 17 - .../com/broken/dns.d/@/DNAME=10=example.net.= | 6 - .../com/broken/dns.d/@/NS=10=example.com.= | 6 - ...oot.example.com.=None=None=None=None=None= | 6 - .../example/dns.d/@/DNAME=10=example.net.= | 6 - .../com/example/dns.d/@/NS=10=example.com.= | 6 - ...om.=root.example.com.=2010062900=0=0=0=10= | 6 - .../ns1/dns-root/com/example/xfr.d/10.53.0.1 | 6 - bin/tests/system/dlz/ns1/named.conf.in | 25 - bin/tests/system/dlz/prereq.sh | 18 - bin/tests/system/dlz/setup.sh | 15 - bin/tests/system/dlz/tests.sh | 74 - configure.ac | 70 - contrib/README | 6 - contrib/dlz/bin/.gitignore | 1 - contrib/dlz/bin/dlzbdb/dlzbdb.c | 1295 --------------- contrib/dlz/config.dlz.in | 508 ------ contrib/dlz/drivers/.gitignore | 1 - contrib/dlz/drivers/dlz_bdb_driver.c | 800 --------- contrib/dlz/drivers/dlz_bdbhpt_driver.c | 869 ---------- contrib/dlz/drivers/dlz_dlopen_driver.c | 0 contrib/dlz/drivers/dlz_drivers.c | 158 -- contrib/dlz/drivers/dlz_filesystem_driver.c | 1014 ------------ contrib/dlz/drivers/dlz_ldap_driver.c | 1233 -------------- contrib/dlz/drivers/dlz_mysql_driver.c | 1055 ------------ contrib/dlz/drivers/dlz_odbc_driver.c | 1423 ----------------- contrib/dlz/drivers/dlz_postgres_driver.c | 1258 --------------- contrib/dlz/drivers/dlz_stub_driver.c | 316 ---- contrib/dlz/drivers/include/.clang-format | 1 - .../dlz/drivers/include/dlz/dlz_bdb_driver.h | 45 - .../drivers/include/dlz/dlz_bdbhpt_driver.h | 45 - .../drivers/include/dlz/dlz_dlopen_driver.h | 0 contrib/dlz/drivers/include/dlz/dlz_drivers.h | 28 - .../include/dlz/dlz_filesystem_driver.h | 45 - .../dlz/drivers/include/dlz/dlz_ldap_driver.h | 45 - .../drivers/include/dlz/dlz_mysql_driver.h | 45 - .../dlz/drivers/include/dlz/dlz_odbc_driver.h | 45 - .../drivers/include/dlz/dlz_postgres_driver.h | 45 - .../dlz/drivers/include/dlz/dlz_stub_driver.h | 45 - contrib/dlz/drivers/include/dlz/sdlz_helper.h | 120 -- contrib/dlz/drivers/rules.in | 48 - contrib/dlz/drivers/sdlz_helper.c | 489 ------ util/copyrights | 36 - 45 files changed, 11282 deletions(-) delete mode 100644 bin/tests/system/dlz/.gitignore delete mode 100644 bin/tests/system/dlz/clean.sh delete mode 100644 bin/tests/system/dlz/ns1/dns-root/com/broken/dns.d/@/DNAME=10=example.net.= delete mode 100644 bin/tests/system/dlz/ns1/dns-root/com/broken/dns.d/@/NS=10=example.com.= delete mode 100644 bin/tests/system/dlz/ns1/dns-root/com/broken/dns.d/@/SOA=10=ns.example.com.=root.example.com.=None=None=None=None=None= delete mode 100644 bin/tests/system/dlz/ns1/dns-root/com/example/dns.d/@/DNAME=10=example.net.= delete mode 100644 bin/tests/system/dlz/ns1/dns-root/com/example/dns.d/@/NS=10=example.com.= delete mode 100644 bin/tests/system/dlz/ns1/dns-root/com/example/dns.d/@/SOA=10=ns.example.com.=root.example.com.=2010062900=0=0=0=10= delete mode 100644 bin/tests/system/dlz/ns1/dns-root/com/example/xfr.d/10.53.0.1 delete mode 100644 bin/tests/system/dlz/ns1/named.conf.in delete mode 100644 bin/tests/system/dlz/prereq.sh delete mode 100644 bin/tests/system/dlz/setup.sh delete mode 100644 bin/tests/system/dlz/tests.sh delete mode 100644 contrib/dlz/bin/.gitignore delete mode 100644 contrib/dlz/bin/dlzbdb/dlzbdb.c delete mode 100644 contrib/dlz/config.dlz.in delete mode 100644 contrib/dlz/drivers/.gitignore delete mode 100644 contrib/dlz/drivers/dlz_bdb_driver.c delete mode 100644 contrib/dlz/drivers/dlz_bdbhpt_driver.c delete mode 100644 contrib/dlz/drivers/dlz_dlopen_driver.c delete mode 100644 contrib/dlz/drivers/dlz_drivers.c delete mode 100644 contrib/dlz/drivers/dlz_filesystem_driver.c delete mode 100644 contrib/dlz/drivers/dlz_ldap_driver.c delete mode 100644 contrib/dlz/drivers/dlz_mysql_driver.c delete mode 100644 contrib/dlz/drivers/dlz_odbc_driver.c delete mode 100644 contrib/dlz/drivers/dlz_postgres_driver.c delete mode 100644 contrib/dlz/drivers/dlz_stub_driver.c delete mode 120000 contrib/dlz/drivers/include/.clang-format delete mode 100644 contrib/dlz/drivers/include/dlz/dlz_bdb_driver.h delete mode 100644 contrib/dlz/drivers/include/dlz/dlz_bdbhpt_driver.h delete mode 100644 contrib/dlz/drivers/include/dlz/dlz_dlopen_driver.h delete mode 100644 contrib/dlz/drivers/include/dlz/dlz_drivers.h delete mode 100644 contrib/dlz/drivers/include/dlz/dlz_filesystem_driver.h delete mode 100644 contrib/dlz/drivers/include/dlz/dlz_ldap_driver.h delete mode 100644 contrib/dlz/drivers/include/dlz/dlz_mysql_driver.h delete mode 100644 contrib/dlz/drivers/include/dlz/dlz_odbc_driver.h delete mode 100644 contrib/dlz/drivers/include/dlz/dlz_postgres_driver.h delete mode 100644 contrib/dlz/drivers/include/dlz/dlz_stub_driver.h delete mode 100644 contrib/dlz/drivers/include/dlz/sdlz_helper.h delete mode 100644 contrib/dlz/drivers/rules.in delete mode 100644 contrib/dlz/drivers/sdlz_helper.c diff --git a/bin/tests/system/Makefile.am b/bin/tests/system/Makefile.am index 9a88662e0c..f47678ba59 100644 --- a/bin/tests/system/Makefile.am +++ b/bin/tests/system/Makefile.am @@ -105,7 +105,6 @@ TESTS += \ checknames \ checkzone \ database \ - dlz \ dlzexternal \ dns64 \ dscp \ diff --git a/bin/tests/system/dlz/.gitignore b/bin/tests/system/dlz/.gitignore deleted file mode 100644 index eee491d3c6..0000000000 --- a/bin/tests/system/dlz/.gitignore +++ /dev/null @@ -1 +0,0 @@ -prereq.sh diff --git a/bin/tests/system/dlz/clean.sh b/bin/tests/system/dlz/clean.sh deleted file mode 100644 index 9e70fbb004..0000000000 --- a/bin/tests/system/dlz/clean.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh -# -# Copyright (C) Internet Systems Consortium, Inc. ("ISC") -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, you can obtain one at https://mozilla.org/MPL/2.0/. -# -# See the COPYRIGHT file distributed with this work for additional -# information regarding copyright ownership. - -rm -f ns*/named.conf -rm -f dig.out.* -rm -f */named.memstats -rm -f */named.run -rm -f ns*/named.lock -rm -f ns*/managed-keys.bind* diff --git a/bin/tests/system/dlz/ns1/dns-root/com/broken/dns.d/@/DNAME=10=example.net.= b/bin/tests/system/dlz/ns1/dns-root/com/broken/dns.d/@/DNAME=10=example.net.= deleted file mode 100644 index 50d2ad0c40..0000000000 --- a/bin/tests/system/dlz/ns1/dns-root/com/broken/dns.d/@/DNAME=10=example.net.= +++ /dev/null @@ -1,6 +0,0 @@ -Copyright (C) Internet Systems Consortium, Inc. ("ISC") - -See COPYRIGHT in the source root or https://isc.org/copyright.html for terms. - -The contents of this file is not read by the filesystem driver. -This is the file for "DNAME 10 example.net.". diff --git a/bin/tests/system/dlz/ns1/dns-root/com/broken/dns.d/@/NS=10=example.com.= b/bin/tests/system/dlz/ns1/dns-root/com/broken/dns.d/@/NS=10=example.com.= deleted file mode 100644 index 5faa45cefc..0000000000 --- a/bin/tests/system/dlz/ns1/dns-root/com/broken/dns.d/@/NS=10=example.com.= +++ /dev/null @@ -1,6 +0,0 @@ -Copyright (C) Internet Systems Consortium, Inc. ("ISC") - -See COPYRIGHT in the source root or https://isc.org/copyright.html for terms. - -The contents of this file is not read by the filesystem driver. -This is the file for "NS 10 example.com.". diff --git a/bin/tests/system/dlz/ns1/dns-root/com/broken/dns.d/@/SOA=10=ns.example.com.=root.example.com.=None=None=None=None=None= b/bin/tests/system/dlz/ns1/dns-root/com/broken/dns.d/@/SOA=10=ns.example.com.=root.example.com.=None=None=None=None=None= deleted file mode 100644 index ee74e03ede..0000000000 --- a/bin/tests/system/dlz/ns1/dns-root/com/broken/dns.d/@/SOA=10=ns.example.com.=root.example.com.=None=None=None=None=None= +++ /dev/null @@ -1,6 +0,0 @@ -Copyright (C) Internet Systems Consortium, Inc. ("ISC") - -See COPYRIGHT in the source root or https://isc.org/copyright.html for terms. - -The contents of this file is not read by the filesystem driver. -This is the file for "SOA 10 ns.example.com. root.example.com. 2010062900 None None None None" which is a malformed SOA record. diff --git a/bin/tests/system/dlz/ns1/dns-root/com/example/dns.d/@/DNAME=10=example.net.= b/bin/tests/system/dlz/ns1/dns-root/com/example/dns.d/@/DNAME=10=example.net.= deleted file mode 100644 index 50d2ad0c40..0000000000 --- a/bin/tests/system/dlz/ns1/dns-root/com/example/dns.d/@/DNAME=10=example.net.= +++ /dev/null @@ -1,6 +0,0 @@ -Copyright (C) Internet Systems Consortium, Inc. ("ISC") - -See COPYRIGHT in the source root or https://isc.org/copyright.html for terms. - -The contents of this file is not read by the filesystem driver. -This is the file for "DNAME 10 example.net.". diff --git a/bin/tests/system/dlz/ns1/dns-root/com/example/dns.d/@/NS=10=example.com.= b/bin/tests/system/dlz/ns1/dns-root/com/example/dns.d/@/NS=10=example.com.= deleted file mode 100644 index 5faa45cefc..0000000000 --- a/bin/tests/system/dlz/ns1/dns-root/com/example/dns.d/@/NS=10=example.com.= +++ /dev/null @@ -1,6 +0,0 @@ -Copyright (C) Internet Systems Consortium, Inc. ("ISC") - -See COPYRIGHT in the source root or https://isc.org/copyright.html for terms. - -The contents of this file is not read by the filesystem driver. -This is the file for "NS 10 example.com.". diff --git a/bin/tests/system/dlz/ns1/dns-root/com/example/dns.d/@/SOA=10=ns.example.com.=root.example.com.=2010062900=0=0=0=10= b/bin/tests/system/dlz/ns1/dns-root/com/example/dns.d/@/SOA=10=ns.example.com.=root.example.com.=2010062900=0=0=0=10= deleted file mode 100644 index 2f63999a56..0000000000 --- a/bin/tests/system/dlz/ns1/dns-root/com/example/dns.d/@/SOA=10=ns.example.com.=root.example.com.=2010062900=0=0=0=10= +++ /dev/null @@ -1,6 +0,0 @@ -Copyright (C) Internet Systems Consortium, Inc. ("ISC") - -See COPYRIGHT in the source root or https://isc.org/copyright.html for terms. - -The contents of this file is not read by the filesystem driver. -This is the file for "SOA 10 ns.example.com. root.example.com. 2010062900 0 0 0 10". diff --git a/bin/tests/system/dlz/ns1/dns-root/com/example/xfr.d/10.53.0.1 b/bin/tests/system/dlz/ns1/dns-root/com/example/xfr.d/10.53.0.1 deleted file mode 100644 index 8a07d4faee..0000000000 --- a/bin/tests/system/dlz/ns1/dns-root/com/example/xfr.d/10.53.0.1 +++ /dev/null @@ -1,6 +0,0 @@ -Copyright (C) Internet Systems Consortium, Inc. ("ISC") - -See COPYRIGHT in the source root or https://isc.org/copyright.html for terms. - -The contents of this file are not read by the filesystem driver. -The presence of this file allows 10.53.0.1 to transfer this zone. diff --git a/bin/tests/system/dlz/ns1/named.conf.in b/bin/tests/system/dlz/ns1/named.conf.in deleted file mode 100644 index 273ff02c79..0000000000 --- a/bin/tests/system/dlz/ns1/named.conf.in +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (C) Internet Systems Consortium, Inc. ("ISC") - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * See the COPYRIGHT file distributed with this work for additional - * information regarding copyright ownership. - */ - -options { - query-source address 10.53.0.1; - notify-source 10.53.0.1; - transfer-source 10.53.0.1; - port @PORT@; - pid-file "named.pid"; - listen-on { 10.53.0.1; }; - listen-on-v6 { none; }; - recursion no; -}; - -dlz fszone { - database "filesystem dns-root/ dns.d xfr.d 0 ="; -}; diff --git a/bin/tests/system/dlz/prereq.sh b/bin/tests/system/dlz/prereq.sh deleted file mode 100644 index 7d8a3463df..0000000000 --- a/bin/tests/system/dlz/prereq.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh -# -# Copyright (C) Internet Systems Consortium, Inc. ("ISC") -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, you can obtain one at https://mozilla.org/MPL/2.0/. -# -# See the COPYRIGHT file distributed with this work for additional -# information regarding copyright ownership. - -. ../conf.sh - -if ! $FEATURETEST --with-dlz-filesystem; then - echo_i "DLZ filesystem driver not supported" - exit 255 -fi -exit 0 diff --git a/bin/tests/system/dlz/setup.sh b/bin/tests/system/dlz/setup.sh deleted file mode 100644 index 7e31a69049..0000000000 --- a/bin/tests/system/dlz/setup.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh -# -# Copyright (C) Internet Systems Consortium, Inc. ("ISC") -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, you can obtain one at https://mozilla.org/MPL/2.0/. -# -# See the COPYRIGHT file distributed with this work for additional -# information regarding copyright ownership. - -. ../conf.sh - -$SHELL clean.sh -copy_setports ns1/named.conf.in ns1/named.conf diff --git a/bin/tests/system/dlz/tests.sh b/bin/tests/system/dlz/tests.sh deleted file mode 100644 index 4e75b0dba8..0000000000 --- a/bin/tests/system/dlz/tests.sh +++ /dev/null @@ -1,74 +0,0 @@ -#!/bin/sh -# -# Copyright (C) Internet Systems Consortium, Inc. ("ISC") -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, you can obtain one at https://mozilla.org/MPL/2.0/. -# -# See the COPYRIGHT file distributed with this work for additional -# information regarding copyright ownership. - -. ../conf.sh - -status=0 -n=0 - -rm -f dig.out.* - -DIGOPTS="+tcp +noadd +nosea +nostat +nocmd +dnssec -p ${PORT}" - -# Check the example.com. domain - -echo_i "checking DNAME at apex works ($n)" -ret=0 -$DIG $DIGOPTS +norec foo.example.com. \ - @10.53.0.1 a > dig.out.ns1.test$n || ret=1 -grep "status: NOERROR" dig.out.ns1.test$n > /dev/null || ret=1 -grep "example.com..*DNAME.*example.net." dig.out.ns1.test$n > /dev/null || ret=1 -grep "foo.example.com..*CNAME.*foo.example.net." dig.out.ns1.test$n > /dev/null || ret=1 -grep "flags:[^;]* aa[ ;]" dig.out.ns1.test$n > /dev/null || ret=1 -n=`expr $n + 1` -if [ $ret != 0 ]; then echo_i "failed"; fi -status=`expr $status + $ret` - -echo_i "checking DLZ IXFR=2010062899 (less than serial) ($n)" -ret=0 -$DIG $DIGOPTS ixfr=2010062899 example.com @10.53.0.1 +all > dig.out.ns1.test$n -grep "example.com..*IN.IXFR" dig.out.ns1.test$n > /dev/null || ret=1 -grep "example.com..*10.IN.DNAME.example.net." dig.out.ns1.test$n > /dev/null || ret=1 -grep "example.com..*10.IN.NS.example.com." dig.out.ns1.test$n > /dev/null || ret=1 -n=`expr $n + 1` -if [ $ret != 0 ]; then echo_i "failed"; fi -status=`expr $status + $ret` - -echo_i "checking DLZ IXFR=2010062900 (equal serial) ($n)" -ret=0 -$DIG $DIGOPTS ixfr=2010062900 example.com @10.53.0.1 +all > dig.out.ns1.test$n -grep "example.com..*IN.IXFR" dig.out.ns1.test$n > /dev/null || ret=1 -grep "example.com..*10.IN.DNAME.example.net." dig.out.ns1.test$n > /dev/null && ret=1 -grep "example.com..*10.IN.NS.example.com." dig.out.ns1.test$n > /dev/null && ret=1 -n=`expr $n + 1` -if [ $ret != 0 ]; then echo_i "failed"; fi -status=`expr $status + $ret` - -echo_i "checking DLZ IXFR=2010062901 (greater than serial) ($n)" -ret=0 -$DIG $DIGOPTS ixfr=2010062901 example.com @10.53.0.1 +all > dig.out.ns1.test$n -grep "example.com..*IN.IXFR" dig.out.ns1.test$n > /dev/null || ret=1 -grep "example.com..*10.IN.DNAME.example.net." dig.out.ns1.test$n > /dev/null && ret=1 -grep "example.com..*10.IN.NS.example.com." dig.out.ns1.test$n > /dev/null && ret=1 -n=`expr $n + 1` -if [ $ret != 0 ]; then echo_i "failed"; fi -status=`expr $status + $ret` - -echo_i "checking DLZ with a malformed SOA record" -ret=0 -$DIG $DIGOPTS broken.com type600 @10.53.0.1 > dig.out.ns1.test$n -grep status: dig.out.ns1.test$n > /dev/null || ret=1 -n=`expr $n + 1` -if [ $ret != 0 ]; then echo_i "failed"; fi -status=`expr $status + $ret` - -echo_i "exit status: $status" -[ $status -eq 0 ] || exit 1 diff --git a/configure.ac b/configure.ac index 57ab96bc84..e6435b96b5 100644 --- a/configure.ac +++ b/configure.ac @@ -150,7 +150,6 @@ AS_IF([test "$enable_developer" = "yes"], test "${enable_fixed_rrset+set}" = set || enable_fixed_rrset=yes test "${enable_querytrace+set}" = set || enable_querytrace=yes test "${with_cmocka+set}" = set || with_cmocka=yes - test "${with_dlz_filesystem+set}" = set || with_dlz_filesystem=yes test "${with_zlib+set}" = set || with_zlib=yes test "${enable_warn_error+set}" = set || enable_warn_error=yes ]) @@ -1416,24 +1415,6 @@ AC_ARG_ENABLE(auto-validation, AS_IF([test "$enable_auto_validation" = "no"],[validation_default=yes]) AC_DEFINE_UNQUOTED([VALIDATION_DEFAULT], ["$validation_default"], [the default value of dnssec-validation option]) -# -# Configure any DLZ drivers. -# -# If config.dlz.in selects one or more DLZ drivers, it will set -# CONTRIB_DLZ to a non-empty value, which will be our clue to -# build DLZ drivers in contrib. -# -# This section has to come after the libtool stuff because it needs to -# know how to name the driver object files. -# - -CONTRIB_DLZ="" -DLZ_DRIVER_INCLUDES="" -DLZ_DRIVER_LIBS="" -DLZ_DRIVER_SRCS="" -DLZ_DRIVER_OBJS="" -DLZ_SYSTEM_TEST="" - # # # Response policy rewriting using DNS Response Policy Service (DNSRPS) @@ -1513,39 +1494,6 @@ AS_IF([test "$enable_dnsrps" != "no"],[ AC_DEFINE([USE_DNSRPS], [1], [Enable DNS Response Policy Service API]) ]) -# FIXME BEGIN -#sinclude(contrib/dlz/config.dlz.in) -# AC_MSG_CHECKING(contributed DLZ drivers) -# -# if test -n "$CONTRIB_DLZ" -# then -# AC_MSG_RESULT(yes) -# DLZ_DRIVER_RULES=contrib/dlz/drivers/rules -# AC_CONFIG_FILES([$DLZ_DRIVER_RULES -# contrib/dlz/modules/mysql/Makefile -# contrib/dlz/modules/mysqldyn/Makefile]) -# else -# AC_MSG_RESULT(no) -# DLZ_DRIVER_RULES=/dev/null -# fi -# -# AC_SUBST(CONTRIB_DLZ) -# AC_SUBST(DLZ_DRIVER_INCLUDES) -# AC_SUBST(DLZ_DRIVER_LIBS) -# AC_SUBST(DLZ_DRIVER_SRCS) -# AC_SUBST(DLZ_DRIVER_OBJS) -# AC_SUBST(DLZ_SYSTEM_TEST) -# AC_SUBST_FILE(DLZ_DRIVER_RULES) -# this ensures the configure summary report comes out right -test -z "$with_dlz_bdb" && with_dlz_bdb=no -test -z "$with_dlz_ldap" && with_dlz_ldap=no -test -z "$with_dlz_mysql" && with_dlz_mysql=no -test -z "$with_dlz_odbc" && with_dlz_odbc=no -test -z "$with_dlz_postgres" && with_dlz_postgres=no -test -z "$with_dlz_filesystem" && with_dlz_filesystem=no -test -z "$with_dlz_stub" && with_dlz_stub=no -# FIXME END - AC_CHECK_HEADERS([glob.h]) # @@ -1682,24 +1630,6 @@ report() { test "auto" = "$validation_default" && echo " DNSSEC validation active by default (--enable-auto-validation)" - echo " Dynamically loadable zone (DLZ) drivers:" - test "no" = "$with_dlz_bdb" || \ - echo " Berkeley DB (--with-dlz-bdb)" - test "no" = "$with_dlz_ldap" || \ - echo " LDAP (--with-dlz-ldap)" - test "no" = "$with_dlz_mysql" || \ - echo " MySQL (--with-dlz-mysql)" - test "no" = "$with_dlz_odbc" || \ - echo " ODBC (--with-dlz-odbc)" - test "no" = "$with_dlz_postgres" || \ - echo " Postgres (--with-dlz-postgres)" - test "no" = "$with_dlz_filesystem" || \ - echo " Filesystem (--with-dlz-filesystem)" - test "no" = "$with_dlz_stub" || \ - echo " Stub (--with-dlz-stub)" - test "$with_dlz_bdb $with_dlz_ldap $with_dlz_mysql $with_dlz_odbc $with_dlz_postgres $with_dlz_filesystem $with_dlz_stub" = "no no no no no no no" && \ - echo " None" - echo "-------------------------------------------------------------------------------" echo "Features disabled or unavailable on this platform:" diff --git a/contrib/README b/contrib/README index 466e11d1c7..115b05b7db 100644 --- a/contrib/README +++ b/contrib/README @@ -29,11 +29,5 @@ be fixed as time permits. named at runtime, enabling access to external data sources including LDAP, MySQL, Berkeley DB, perl scripts, etc. - - dlz/drivers - - Old-style DLZ drivers that can be linked into named at compile - time. (These are no longer actively maintained and are expected - to be removed eventually.) - Some links to useful software and other resources related to BIND 9 and DNS can be found at https://www.isc.org/dns-tools-and-resources. diff --git a/contrib/dlz/bin/.gitignore b/contrib/dlz/bin/.gitignore deleted file mode 100644 index f3c7a7c5da..0000000000 --- a/contrib/dlz/bin/.gitignore +++ /dev/null @@ -1 +0,0 @@ -Makefile diff --git a/contrib/dlz/bin/dlzbdb/dlzbdb.c b/contrib/dlz/bin/dlzbdb/dlzbdb.c deleted file mode 100644 index f77ebb1505..0000000000 --- a/contrib/dlz/bin/dlzbdb/dlzbdb.c +++ /dev/null @@ -1,1295 +0,0 @@ -/* - * Copyright (C) 2002 Stichting NLnet, Netherlands, stichting@nlnet.nl. - * - * Permission to use, copy, modify, and 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 STICHTING NLNET - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * STICHTING NLNET 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. - * - * The development of Dynamically Loadable Zones (DLZ) for Bind 9 was - * conceived and contributed by Rob Butler. - * - * Permission to use, copy, modify, and 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 ROB BUTLER - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * ROB BUTLER 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. - */ - -/* - * Copyright (C) 1999-2001, 2016 Internet Systems Consortium, Inc. ("ISC") - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -#ifdef DLZ_BDB - -/* - * exit codes - * 0 everything ok - * 1 error parsing command line - * 2 Missing, too many or invalid combination of command line parameters - * 3 Unable to open BDB database. - * 4 Unable to allocate memory for, or create lexer. - * 5 unable to perform BDB cursor operation - */ -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -/* shut up compiler warnings about no previous prototype */ - -static void -show_usage(void); - -int -getzone(DB *dbp, const DBT *pkey, const DBT *pdata, DBT *skey); - -int -gethost(DB *dbp, const DBT *pkey, const DBT *pdata, DBT *skey); - -void -bdb_cleanup(void); - -isc_result_t -bdb_opendb(DBTYPE db_type, DB **db_out, const char *db_name, int flags); - -void -put_data(bool dns_data, char *input_key, char *input_data); - -void -insert_data(void); - -isc_result_t -openBDB(void); - -isc_result_t -open_lexer(void); - -void -close_lexer(void); - -isc_result_t -bulk_write(char type, DB *database, DBC *dbcursor, DBT *bdbkey, DBT *bdbdata); - -void -operation_add(void); - -void -operation_bulk(void); - -void -operation_listOrDelete(bool dlt); - -/*% - * Maximum length of a single data line that - * may be inserted into database by this program. - * If you need to insert a line of data that is more - * than 10,000 characters change this definition. - */ - -#define max_data_len 10000 - -/*% - * BDB database names. If you want to use different - * database names change them here. - */ - -#define dlz_data "dns_data" -#define dlz_zone "dns_zone" -#define dlz_host "dns_host" -#define dlz_client "dns_client" - -/*% - * Error code returned by BDB secondary index callback functions. - * This error is returned if the callback function could not create - * the secondary index for any reason. - */ - -#define BDBparseErr 1 - -/* A struct to hold all the relevant info about the database */ - -typedef struct bdb_instance { - DB_ENV *dbenv; /* BDB environment */ - DB *data; /* dns_data database handle */ - DBC *cursor; /* database cursor */ - DBC *cursor2; /* second cursor used during list operation. */ - DBC *cursor3; /* third cursor used during list operation */ - DBC *cursor4; /* fourth cursor used during list operation */ - DB *zone; /* zone database handle */ - DB *host; /* host database handle */ - DB *client; /* client database handle */ -} bdb_instance_t; - -/* Possible operations */ - -#define list 1 /* list data */ -#define dele 2 /* delete data */ -#define add 3 /* add a single piece of data */ -#define bulk 4 /* bulk load data */ - -/*% - * quit macro is used instead of exit. quit always tries to close the lexer - * and the BDB database before exiting. - */ - -#define quit(i) \ - close_lexer(); \ - bdb_cleanup(); \ - exit(i); - -/*% - * checkOp is used to verify that only one operation (list, del, add, - * bulk from file, bulk from stdin) is specified on the command line. - * This prevents a user from specifying two operations on the command - * line, which would make no sense anyway. - */ - -#define checkOp(x) \ - if (x != 0) { \ - fprintf(stderr, "\nonly one operation " \ - "(l e d a f s) may be specified\n"); \ - quit(2); \ - } - -/*% - * checkParam is used to only allow a parameter to be specified once. - * I.E. the parameter key can only be used on the command line once. - * any attempt to use it twice causes an error. - */ - -#define checkParam(x, y) \ - if (x != NULL) { \ - fprintf(stderr, \ - "\n%s may only " \ - "be specified once\n", \ - y); \ - quit(2); \ - } - -/*% - * checkInvalidParam is used to only allow parameters which make sense for - * the operation selected. I.E. passing the key parameter makes no sense - * for the add operation, and thus it isn't allowed. - */ - -#define checkInvalidParam(x, y, z) \ - if (x != NULL) { \ - fprintf(stderr, \ - "\n%s " \ - "may not be specified %s\n", \ - y, z); \ - quit(2); \ - } - -/*% - * checkInvalidOption is used to only allow parameters which make sense for - * the operation selected - but checks boolean options. - * I.E. passing the "b" bare_list parameter makes no sense for the add - * operation, and thus it isn't allowed. - * if w == x then output error message "flag", "message" - */ - -#define checkInvalidOption(w, x, y, z) \ - if (w == x) { \ - fprintf(stderr, \ - "\n%s " \ - "may not be specified %s\n", \ - y, z); \ - quit(2); \ - } - -/* Global Variables */ - -int operation = 0; /*%< operation to perform. */ -/*% allow new lock files or DB to be created. */ -bool create_allowed = false; -char *key = NULL; /*%< key to use in list & del operations */ - -/*% dump DB in DLZBDB bulk format */ -bool list_everything = false; -unsigned int key_val; /*%< key as unsigned int used in list & del operations */ -char *zone = NULL; /*%< zone to use in list operations */ -char *host = NULL; /*%< host to use in list operations */ -char *c_zone = NULL; /*%< client zone to use in list operations */ -char *c_ip = NULL; /*%< client IP to use in list operations */ -char *a_data = NULL; /*%< data in add operation */ -char *bulk_file = NULL; /*%< bulk data file to load */ -char *db_envdir = NULL; /*%< BDB environment location */ -char *db_file = NULL; /*%< BDB database file location. */ -bdb_instance_t db; /* BDB instance we are operating on */ -isc_lex_t *lexer = NULL; /*%< lexer for use to use in parsing input */ -isc_mem_t *lex_mctx = NULL; /*%< memory context for lexer */ -char lex_data_buf[max_data_len]; /*%< data array to use for lex_buffer below */ -isc_buffer_t lex_buffer; /*%< buffer for lexer during add operation */ - -/*% - * Displays usage message - */ - -static void -show_usage(void) { - fprintf(stderr, "\n\n\ ----Usage:---------------------------------------------------------------------\ -\n\n\ - List data:\n\ - dlzbdb -l [-k key] [-z zone] [-h host] [-c client_zone] [-i client_ip]\n\ - BDB_environment BDB_database\n\n\ - Delete data:\n\ - dlzbdb -d [-k key] [-c client_zone] [-i client_ip]\n\ - BDB_environment BDB_database\n\n\ - Bulk load data from file:\n\ - dlzbdb -f file_to_load BDB_environment BDB_database\n\n\ - Bulk load data from stdin\n\ - dlzbdb -s BDB_environment BDB_database\n\n\ - Add data:\n\ - dlzbdb -a \"dns data to be added\" BDB_environment BDB_database\n\n\ - Export data:\n\ - dlzbdb -e BDB_environment BDB_database\n\n\ - Normally operations can only be performed on an existing database files.\n\ - Use the -n flag with any operation to allow files to be created.\n\ - Existing files will NOT be truncated by using the -n flag.\n\ - The -n flag will allow a new database to be created, or allow new\n\ - environment files to be created for an existing database.\n\n\ ----Format for -f & -a options:------------------------------------------------\ -\n\n\ -db_type zone host dns_type ttl ip\n\ -db_type zone host dns_type ttl mx_priority mail_host\n\ -db_type zone host dns_type ttl nm_svr resp_psn serial refresh retry expire min\ -\n\ -db_type zone client_ip\n\n\ ----Examples:------------------------------------------------------------------\ -\n\n\ -d mynm.com www A 10 127.0.0.1\n\ -d mynm.com @ MX 10 5 mail\n\ -d mynm.com @ SOA 10 ns1.mynm.com. root.mynm.com. 2 28800 7200 604800 86400\n\ -c mynm.com 127.0.0.1\n\ -c mynm.com 192.168.0.10\n\ -"); - quit(1); -} - -/*% BDB callback to create zone secondary index */ - -int -getzone(DB *dbp, const DBT *pkey, const DBT *pdata, DBT *skey) { - char *token, *last; - - UNUSED(dbp); - UNUSED(pkey); - - if ((token = strtok_r(pdata->data, " ", &last)) == NULL) { - return (BDBparseErr); - } - - /* copy string for "zone" secondary index */ - if ((skey->data = strdup(token)) == NULL) { - return (BDBparseErr); - } - /* set required values for BDB */ - skey->size = strlen(skey->data); - skey->flags = DB_DBT_APPMALLOC; - - return (0); -} - -/*% - * BDB callback to create host secondary index - */ - -int -gethost(DB *dbp, const DBT *pkey, const DBT *pdata, DBT *skey) { - char *token, *last; - - UNUSED(dbp); - UNUSED(pkey); - - /* we don't care about first token. */ - if ((token = strtok_r(right, " ", &last)) == NULL) { - return (BDBparseErr); - } - - /* get "host" from data string */ - if ((token = strtok_r(NULL, " ", &last)) == NULL) { - return (BDBparseErr); - } - - /* copy string for "host" secondary index */ - if ((skey->data = strdup(token)) == NULL) { - return (BDBparseErr); - } - /* set required values for BDB */ - skey->size = strlen(skey->data); - skey->flags = DB_DBT_APPMALLOC; - - return (0); -} - -/*% - * Performs BDB cleanup. Close each database that we opened. - * Close environment. Set each var to NULL so we know they - * were closed and don't accidentally try to close them twice. - */ - -void -bdb_cleanup(void) { - /* close cursors */ - if (db.cursor4 != NULL) { - db.cursor4->c_close(db.cursor4); - db.cursor4 = NULL; - } - - if (db.cursor3 != NULL) { - db.cursor3->c_close(db.cursor3); - db.cursor3 = NULL; - } - - if (db.cursor2 != NULL) { - db.cursor2->c_close(db.cursor2); - db.cursor2 = NULL; - } - - if (db.cursor != NULL) { - db.cursor->c_close(db.cursor); - db.cursor = NULL; - } - - /* close databases */ - if (db.data != NULL) { - db.data->close(db.data, 0); - db.data = NULL; - } - if (db.host != NULL) { - db.host->close(db.host, 0); - db.host = NULL; - } - if (db.zone != NULL) { - db.zone->close(db.zone, 0); - db.zone = NULL; - } - if (db.client != NULL) { - db.client->close(db.client, 0); - db.client = NULL; - } - - /* close environment */ - if (db.dbenv != NULL) { - db.dbenv->close(db.dbenv, 0); - db.dbenv = NULL; - } -} - -/*% Initializes, sets flags and then opens Berkeley databases. */ - -isc_result_t -bdb_opendb(DBTYPE db_type, DB **db_out, const char *db_name, int flags) { - int result; - int createFlag = 0; - - /* Initialize the database. */ - if ((result = db_create(db_out, db.dbenv, 0)) != 0) { - fprintf(stderr, - "BDB could not initialize %s database. BDB error: %s", - db_name, db_strerror(result)); - return (ISC_R_FAILURE); - } - - /* set database flags. */ - if ((result = (*db_out)->set_flags(*db_out, flags)) != 0) { - fprintf(stderr, - "BDB could not set flags for %s database. BDB error: " - "%s", - db_name, db_strerror(result)); - return (ISC_R_FAILURE); - } - - if (create_allowed) { - createFlag = DB_CREATE; - } - /* open the database. */ - if ((result = (*db_out)->open(*db_out, NULL, db_file, db_name, db_type, - createFlag, 0)) != 0) - { - fprintf(stderr, - "BDB could not open %s database in %s. BDB error: %s", - db_name, db_file, db_strerror(result)); - return (ISC_R_FAILURE); - } - - return (ISC_R_SUCCESS); -} - -/*% - * parses input and adds it to the BDB database - * Lexer should be instantiated, and either a file or buffer opened for it. - * The insert_data function is used by both the add, and bulk insert - * operations - */ - -void -put_data(bool dns_data, char *input_key, char *input_data) { - int bdbres; - DBT key, data; - - /* make sure key & data are completely empty */ - memset(&key, 0, sizeof(key)); - memset(&data, 0, sizeof(data)); - - /* if client data, setup key for insertion */ - if (!dns_data && input_key != NULL) { - key.data = input_key; - key.size = strlen(input_key); - key.flags = 0; - } - /* always setup data for insertion */ - data.data = input_data; - data.size = strlen(input_data); - data.flags = 0; - - /* execute insert against appropriate database. */ - if (dns_data) { - bdbres = db.data->put(db.data, NULL, &key, &data, DB_APPEND); - } else { - bdbres = db.client->put(db.client, NULL, &key, &data, 0); - } - - /* if something went wrong, log error and quit */ - if (bdbres != 0) { - fprintf(stderr, "BDB could not insert data. Error: %s", - db_strerror(bdbres)); - quit(5); - } -} - -void -insert_data(void) { - unsigned int opt = ISC_LEXOPT_EOL | /* Want end-of-line token. */ - ISC_LEXOPT_EOF | /* Want end-of-file token. */ - ISC_LEXOPT_QSTRING | /* Recognize qstrings. */ - ISC_LEXOPT_QSTRINGMULTILINE; /* Allow multiline "" - * strings */ - - isc_result_t result; - isc_token_t token; /* token from lexer */ - bool loop = true; - bool have_czone = false; - char data_arr[max_data_len]; - isc_buffer_t buf; - char data_arr2[max_data_len]; - isc_buffer_t buf2; - char data_type = 'u'; /* u =unknown, b =bad token, d/D =DNS, c/C =client - * IP */ - - /* Initialize buffers */ - isc_buffer_init(&buf, &data_arr, max_data_len); - isc_buffer_init(&buf2, &data_arr2, max_data_len); - - while (loop) { - result = isc_lex_gettoken(lexer, opt, &token); - if (result != ISC_R_SUCCESS) { - goto data_cleanup; - } - - switch (token.type) { - case isc_tokentype_string: - if (data_type == 'u') { - /* store data_type */ - strncpy(&data_type, token.value.as_pointer, 1); - /* verify data_type was specified correctly on - * input */ - if (strlen(token.value.as_pointer) > 1 || - (data_type != 'd' && data_type != 'D' && - data_type != 'c' && data_type != 'C')) - { - /* if not, set to 'b' so this line is - * ignored. */ - data_type = 'b'; - } - } else if (data_type == 'c' || data_type == 'C') { - if (have_czone) { - isc_buffer_putstr( - &buf2, token.value.as_pointer); - /* add string terminator to buffer */ - isc_buffer_putmem(&buf2, "\0", 1); - } else { - isc_buffer_putstr( - &buf, token.value.as_pointer); - /* add string terminator to buffer */ - isc_buffer_putmem(&buf, "\0", 1); - have_czone = true; - } - } else { - isc_buffer_putstr(&buf, token.value.as_pointer); - isc_buffer_putstr(&buf, " "); - } - break; - case isc_tokentype_qstring: - isc_buffer_putstr(&buf, "\""); - isc_buffer_putstr(&buf, token.value.as_pointer); - isc_buffer_putstr(&buf, "\" "); - break; - case isc_tokentype_eol: - case isc_tokentype_eof: - - if ((data_type != 'u' && - isc_buffer_usedlength(&buf) > 0) || - data_type == 'b') { - /* perform insert operation */ - if (data_type == 'd' || data_type == 'D') { - /* add string terminator to buffer */ - isc_buffer_putmem(&buf, "\0", 1); - put_data(true, NULL, (char *)&data_arr); - } else if (data_type == 'c' || data_type == 'C') - { - put_data(false, (char *)&data_arr, - (char *)&data_arr2); - } else if (data_type == 'b') { - fprintf(stderr, - "Bad / unknown token " - "encountered on line %lu." - " Skipping line.", - isc_lex_getsourceline(lexer) - - 1); - } else { - fprintf(stderr, - "Bad / unknown db data type " - "encountered on " - "line %lu. Skipping line\n", - isc_lex_getsourceline(lexer) - - 1); - } - } - - if (token.type == isc_tokentype_eof) { - loop = false; - } - - /* reset buffer for next insert */ - isc_buffer_clear(&buf); - isc_buffer_clear(&buf2); - have_czone = false; - data_type = 'u'; - break; - default: - data_type = 'b'; - break; - } - } - - return; - -data_cleanup: - /* let user know we had problems */ - fprintf(stderr, - "Unknown error processing tokens during \"add\" or " - "\"bulk\" operation.\nStoped processing on line %lu.", - isc_lex_getsourceline(lexer)); -} - -isc_result_t -openBDB(void) { - int bdbres; - isc_result_t result; - - /* create BDB environment */ - /* Basically BDB allocates and assigns memory to db->dbenv */ - bdbres = db_env_create(&db.dbenv, 0); - if (bdbres != 0) { - fprintf(stderr, - "BDB environment could not be created. BDB error: %s", - db_strerror(bdbres)); - result = ISC_R_FAILURE; - goto openBDB_cleanup; - } - - /* open BDB environment */ - if (create_allowed) { - /* allowed to create new files */ - bdbres = db.dbenv->open(db.dbenv, db_envdir, - DB_INIT_CDB | DB_INIT_MPOOL | DB_CREATE, - 0); - } else { /* not allowed to create new files. */ - bdbres = db.dbenv->open(db.dbenv, db_envdir, - DB_INIT_CDB | DB_INIT_MPOOL, 0); - } - if (bdbres != 0) { - fprintf(stderr, - "BDB environment at '%s' could not be opened. BDB " - "error: %s", - db_envdir, db_strerror(bdbres)); - result = ISC_R_FAILURE; - goto openBDB_cleanup; - } - - /* open dlz_data database. */ - - result = bdb_opendb(DB_RECNO, &db.data, dlz_data, 0); - if (result != ISC_R_SUCCESS) { - goto openBDB_cleanup; - } - - /* open dlz_host database */ - result = bdb_opendb(DB_BTREE, &db.host, dlz_host, DB_DUP | DB_DUPSORT); - if (result != ISC_R_SUCCESS) { - goto openBDB_cleanup; - } - - /* open dlz_zone database. */ - result = bdb_opendb(DB_BTREE, &db.zone, dlz_zone, DB_DUP | DB_DUPSORT); - if (result != ISC_R_SUCCESS) { - goto openBDB_cleanup; - } - - /* open dlz_client database. */ - result = bdb_opendb(DB_BTREE, &db.client, dlz_client, - DB_DUP | DB_DUPSORT); - if (result != ISC_R_SUCCESS) { - goto openBDB_cleanup; - } - - /* associate the host secondary database with the primary database */ - bdbres = db.data->associate(db.data, NULL, db.host, gethost, 0); - if (bdbres != 0) { - fprintf(stderr, - "BDB could not associate %s database with %s. BDB " - "error: %s", - dlz_host, dlz_data, db_strerror(bdbres)); - result = ISC_R_FAILURE; - goto openBDB_cleanup; - } - - /* associate the zone secondary database with the primary database */ - bdbres = db.data->associate(db.data, NULL, db.zone, getzone, 0); - if (bdbres != 0) { - fprintf(stderr, - "BDB could not associate %s database with %s. BDB " - "error: %s", - dlz_zone, dlz_data, db_strerror(bdbres)); - result = ISC_R_FAILURE; - goto openBDB_cleanup; - } - - return (result); - -openBDB_cleanup: - - bdb_cleanup(); - return (result); -} - -/*% Create & open lexer to parse input data */ - -isc_result_t -open_lexer(void) { - isc_result_t result; - - /* check if we already opened the lexer, if we did, return success */ - if (lexer != NULL) { - return (ISC_R_SUCCESS); - } - - /* allocate memory for lexer, and verify it was allocated */ - isc_mem_create(&lex_mctx); - - /* create lexer */ - result = isc_lex_create(lex_mctx, 1500, &lexer); - if (result != ISC_R_SUCCESS) { - fprintf(stderr, "unexpected error creating lexer\n"); - } - - /* set allowed commenting style */ - isc_lex_setcomments(lexer, - ISC_LEXCOMMENT_C | /* Allow C comments */ - ISC_LEXCOMMENT_CPLUSPLUS | /* Allow - * C++ - * comments - */ - ISC_LEXCOMMENT_SHELL); /* Allow - * shellcomments - */ - - isc_buffer_init(&lex_buffer, &lex_data_buf, max_data_len); - - return (result); -} - -/*% Close the lexer, and cleanup memory */ - -void -close_lexer(void) { - /* If lexer is still open, close it & destroy it. */ - if (lexer != NULL) { - isc_lex_close(lexer); - isc_lex_destroy(&lexer); - } - - /* if lexer memory is still allocated, destroy it. */ - if (lex_mctx != NULL) { - isc_mem_destroy(&lex_mctx); - } -} - -/*% Perform add operation */ - -void -operation_add(void) { - /* check for any parameters that are not allowed during add */ - checkInvalidParam(key, "k", "for add operation"); - checkInvalidParam(zone, "z", "for add operation"); - checkInvalidParam(host, "h", "for add operation"); - checkInvalidParam(c_zone, "c", "for add operation"); - checkInvalidParam(c_ip, "i", "for add operation"); - checkInvalidOption(list_everything, true, "e", "for add operation"); - - /* if open lexer fails it already prints error messages. */ - if (open_lexer() != ISC_R_SUCCESS) { - quit(4); - } - - /* copy input data to buffer */ - isc_buffer_putstr(&lex_buffer, a_data); - - /* tell lexer to use buffer as input */ - if (isc_lex_openbuffer(lexer, &lex_buffer) != ISC_R_SUCCESS) { - fprintf(stderr, "unexpected error opening lexer buffer"); - quit(4); - } - - /*common logic for "add" & "bulk" operations are handled by insert_data - */ - insert_data(); -} - -/*% Perform bulk insert operation */ - -void -operation_bulk(void) { - /* check for any parameters that are not allowed during bulk */ - checkInvalidParam(key, "k", "for bulk load operation"); - checkInvalidParam(zone, "z", "for bulk load operation"); - checkInvalidParam(host, "h", "for bulk load operation"); - checkInvalidParam(c_zone, "c", "for bulk load operation"); - checkInvalidParam(c_ip, "i", "for bulk load operation"); - checkInvalidOption(list_everything, true, "e", - "for bulk load operation"); - - /* if open lexer fails it already prints error messages. */ - if (open_lexer() != ISC_R_SUCCESS) { - quit(4); - } - - if (bulk_file == NULL) { - if (isc_lex_openstream(lexer, stdin) != ISC_R_SUCCESS) { - fprintf(stderr, "unexpected error opening stdin by " - "lexer."); - quit(4); - } - } else if (isc_lex_openfile(lexer, bulk_file) != ISC_R_SUCCESS) { - fprintf(stderr, "unexpected error opening %s by lexer.", - bulk_file); - quit(4); - } - - /* common logic for "add" & "bulk" operations are handled by insert_data - */ - insert_data(); -} - -isc_result_t -bulk_write(char type, DB *database, DBC *dbcursor, DBT *bdbkey, DBT *bdbdata) { - int bdbres; - db_recno_t recNum; - char *retkey = NULL, *retdata; - size_t retklen = 0, retdlen; - void *p; - - /* use a 5MB buffer for the bulk dump */ - int buffer_size = 5 * 1024 * 1024; - - /* try to allocate a 5 MB buffer, if we fail write err msg, die. */ - bdbdata->data = malloc(buffer_size); - if (bdbdata->data == NULL) { - fprintf(stderr, "Unable to allocate 5 MB buffer for bulk " - "database dump\n"); - return (ISC_R_FAILURE); - } - bdbdata->ulen = buffer_size; - bdbdata->flags = DB_DBT_USERMEM; - - /* get a cursor, make sure it worked. */ - bdbres = database->cursor(database, NULL, &dbcursor, 0); - if (bdbres != 0) { - fprintf(stderr, "Unexpected error. BDB Error: %s\n", - db_strerror(bdbres)); - free(bdbdata->data); - return (ISC_R_FAILURE); - } - - /* loop and dump all data */ - for (;;) { - /* loop through data until DB_NOTFOUND is returned */ - bdbres = dbcursor->c_get(dbcursor, bdbkey, bdbdata, - DB_MULTIPLE_KEY | DB_NEXT); - /* if not successful did we encounter DB_NOTFOUND, or */ - /* have a different problem. */ - if (bdbres != 0) { - if (bdbres != DB_NOTFOUND) { - fprintf(stderr, - "Unexpected error. BDB Error: %s\n", - db_strerror(bdbres)); - free(bdbdata->data); - return (ISC_R_FAILURE); - } - /* Hit DB_NOTFOUND which means end of data. */ - break; - } /* end of if (bdbres !=0) */ - - for (DB_MULTIPLE_INIT(p, bdbdata);;) { - if (type == 'c') { - DB_MULTIPLE_KEY_NEXT(p, bdbdata, retkey, - retklen, retdata, retdlen); - } else { - DB_MULTIPLE_RECNO_NEXT(p, bdbdata, recNum, - retdata, retdlen); - } - - if (p == NULL) { - break; - } - if (type == 'c') { - printf("c %.*s %.*s\n", (int)retklen, retkey, - (int)retdlen, retdata); - } else { - printf("d %.*s\n", (int)retdlen, retdata); - } - } /* end of for (DB_MULTIPLE_INIT....) */ - } /* end of for (;;) */ - - /* free the buffer we created earlier */ - free(bdbdata->data); - - return (ISC_R_SUCCESS); -} - -/*% - * Perform listOrDelete operation - * if dlt == true, delete data - * else list data - */ - -void -operation_listOrDelete(bool dlt) { - int bdbres = 0; - DBC *curList[3]; - DBT bdbkey, bdbdata; - db_recno_t recno; - int curIndex = 0; - - /* verify that only allowed parameters were passed. */ - if (dlt) { - checkInvalidParam(zone, "z", "for delete operation"); - checkInvalidParam(host, "h", "for delete operation"); - checkInvalidOption(list_everything, true, "e", - "for delete operation"); - checkInvalidOption(create_allowed, true, "n", - "for delete operation"); - } else if (key != NULL || zone != NULL || host != NULL) { - checkInvalidParam(c_zone, "c", - "for list when k, z or h are specified"); - checkInvalidParam(c_ip, "i", - "for list when k, z, or h are specified"); - checkInvalidOption(list_everything, true, "e", - "for list when k, z, or h are specified"); - checkInvalidOption(create_allowed, true, "n", - "for list operation"); - } else if (c_ip != NULL || c_zone != NULL) { - checkInvalidOption(list_everything, true, "e", - "for list when c or i are specified"); - checkInvalidOption(create_allowed, true, "n", - "for list operation"); - } - - memset(&bdbkey, 0, sizeof(bdbkey)); - memset(&bdbdata, 0, sizeof(bdbdata)); - - /* Dump database in "dlzbdb" bulk format */ - if (list_everything) { - if (bulk_write('c', db.client, db.cursor, &bdbkey, &bdbdata) != - ISC_R_SUCCESS) { - return; - } - memset(&bdbkey, 0, sizeof(bdbkey)); - memset(&bdbdata, 0, sizeof(bdbdata)); - bulk_write('d', db.data, db.cursor2, &bdbkey, &bdbdata); - return; - } /* end if (list_everything) */ - - /* set NULL the 2nd and 3rd positions in curList. */ - /* that way later when add cursors to the join list */ - /* it is already null terminated. */ - curList[1] = curList[2] = NULL; - - if (key != NULL) { - /* make sure other parameters weren't */ - checkInvalidParam(zone, "z", "when k is specified"); - checkInvalidParam(host, "h", "when k is specified"); - - recno = key_val; - bdbkey.data = &recno; - bdbkey.size = sizeof(recno); - - if (dlt) { - bdbres = db.data->del(db.data, NULL, &bdbkey, 0); - } else { - bdbdata.flags = DB_DBT_REALLOC; - bdbres = db.data->get(db.data, NULL, &bdbkey, &bdbdata, - 0); - - if (bdbres == 0) { - printf("KEY | DATA\n"); - printf("%lu | %.*s\n", *(u_long *)bdbkey.data, - (int)bdbdata.size, (char *)bdbdata.data); - } - } /* closes else of if (dlt == true) */ - if (bdbres == DB_NOTFOUND) { - printf("Key not found in database"); - } - } /* closes if (key != NULL) */ - - /* if zone is passed */ - if (zone != NULL) { - /* create a cursor and make sure it worked */ - bdbres = db.zone->cursor(db.zone, NULL, &db.cursor2, 0); - if (bdbres != 0) { - fprintf(stderr, "Unexpected error. BDB Error: %s\n", - db_strerror(bdbres)); - return; - } - - bdbkey.data = zone; - bdbkey.size = strlen(zone); - bdbres = db.cursor2->c_get(db.cursor2, &bdbkey, &bdbdata, - DB_SET); - if (bdbres != 0) { - if (bdbres != DB_NOTFOUND) { - fprintf(stderr, - "Unexpected error. BDB Error: %s\n", - db_strerror(bdbres)); - } else { - printf("Zone not found in database"); - } - return; - } - - /* add cursor to cursor list for later use in join */ - curList[curIndex++] = db.cursor2; - } - - /* if host is passed */ - if (host != NULL) { - /* create a cursor and make sure it worked. */ - bdbres = db.host->cursor(db.host, NULL, &db.cursor3, 0); - if (bdbres != 0) { - fprintf(stderr, "Unexpected error. BDB Error: %s\n", - db_strerror(bdbres)); - return; - } - bdbkey.data = host; - bdbkey.size = strlen(host); - bdbres = db.cursor3->c_get(db.cursor3, &bdbkey, &bdbdata, - DB_SET); - if (bdbres != 0) { - if (bdbres != DB_NOTFOUND) { - fprintf(stderr, - "Unexpected error. BDB Error: %s\n", - db_strerror(bdbres)); - } else { - printf("Host not found in database"); - } - return; - } - - /* add cursor to cursor list for later use in join */ - curList[curIndex++] = db.cursor3; - } - - if (zone != NULL || host != NULL) { - /* join any cursors */ - bdbres = db.data->join(db.data, curList, &db.cursor4, 0); - if (bdbres != 0) { - fprintf(stderr, "Unexpected error. BDB Error: %s\n", - db_strerror(bdbres)); - return; - } - - memset(&bdbkey, 0, sizeof(bdbkey)); - bdbkey.flags = DB_DBT_REALLOC; - memset(&bdbdata, 0, sizeof(bdbdata)); - bdbdata.flags = DB_DBT_REALLOC; - - /* print a header to explain the output */ - printf("KEY | DATA\n"); - /* loop and list all results. */ - while (bdbres == 0) { - /* get data */ - bdbres = db.cursor4->c_get(db.cursor4, &bdbkey, - &bdbdata, 0); - /* verify call had no errors */ - if (bdbres != 0) { - break; - } - printf("%lu | %.*s\n", *(u_long *)bdbkey.data, - (int)bdbdata.size, (char *)bdbdata.data); - } /* closes while loop */ - } - - if (c_ip != NULL && c_zone == NULL) { - fprintf(stderr, "i may only be specified when c is also " - "specified\n"); - quit(2); - } - /* if client_zone was passed */ - if (c_zone != NULL) { - /* create a cursor and make sure it worked. */ - if (dlt) { - /* open read-write cursor */ - bdbres = db.client->cursor(db.client, NULL, &db.cursor, - DB_WRITECURSOR); - } else { - /* open read only cursor */ - bdbres = db.client->cursor(db.client, NULL, &db.cursor, - 0); - /* print a header to explain the output */ - printf("CLIENT_ZONE | CLIENT_IP\n"); - } - - bdbkey.data = c_zone; - bdbkey.size = strlen(c_zone); - - if (c_ip != NULL) { - bdbdata.data = c_ip; - bdbdata.size = strlen(c_ip); - bdbres = db.cursor->c_get(db.cursor, &bdbkey, &bdbdata, - DB_GET_BOTH); - if (bdbres == DB_NOTFOUND) { - printf("Client zone & IP not found in " - "database"); - } - } else { - bdbdata.flags = DB_DBT_REALLOC; - bdbres = db.cursor->c_get(db.cursor, &bdbkey, &bdbdata, - DB_SET); - if (bdbres == DB_NOTFOUND) { - printf("Client zone not found in database"); - } - } - - while (bdbres == 0) { - if (!dlt) { - printf("%.*s | %.*s\n", (int)bdbkey.size, - (char *)bdbkey.data, (int)bdbdata.size, - (char *)bdbdata.data); - } else { - /* delete record. */ - bdbres = db.cursor->c_del(db.cursor, 0); - if (bdbres != 0) { - fprintf(stderr, - "Unexpected error. BDB Error: " - "%s\n", - db_strerror(bdbres)); - break; - } - } - if (c_ip != NULL) { - break; - } - bdbres = db.cursor->c_get(db.cursor, &bdbkey, &bdbdata, - DB_NEXT_DUP); - if (bdbres != 0) { - break; - } - } /* end while loop */ - } - - if (bdbres != 0 && bdbres != DB_NOTFOUND) { - fprintf(stderr, - "Unexpected error during list operation " - "BDB error: %s", - db_strerror(bdbres)); - } - - if (bdbkey.flags == DB_DBT_REALLOC && bdbkey.data != NULL) { - free(bdbkey.data); - } - if (bdbdata.flags == DB_DBT_REALLOC && bdbdata.data != NULL) { - free(bdbdata.data); - } -} - -int -main(int argc, char **argv) { - int ch; - char *endp; - - /* there has to be at least 2 args, some operations require more */ - if (argc < 2) { - show_usage(); - } - - /* use the ISC commandline parser to get all the program arguments */ - while ((ch = isc_commandline_parse(argc, argv, - "ldesna:f:k:z:h:c:i:")) != -1) { - switch (ch) { - case 'n': - create_allowed = true; - break; - case 'l': - checkOp(operation); - operation = list; - break; - case 'd': - checkOp(operation); - operation = dele; - break; - case 'a': - checkOp(operation); - operation = add; - a_data = isc_commandline_argument; - break; - case 'f': - checkOp(operation); - operation = bulk; - bulk_file = isc_commandline_argument; - break; - case 's': - checkOp(operation); - operation = bulk; - break; - case 'k': - checkParam(key, "k"); - key = isc_commandline_argument; - key_val = strtoul(key, &endp, 10); - if (*endp != '\0' || key_val < 1) { - fprintf(stderr, "Error converting key to " - "integer"); - } - break; - case 'z': - checkParam(zone, "z"); - zone = isc_commandline_argument; - break; - case 'h': - checkParam(host, "h"); - host = isc_commandline_argument; - break; - case 'c': - checkParam(c_zone, "c"); - c_zone = isc_commandline_argument; - break; - case 'i': - checkParam(c_ip, "i"); - c_ip = isc_commandline_argument; - break; - case 'e': - checkOp(operation); - operation = list; - list_everything = true; - break; - case '?': - show_usage(); - break; - default: - /* should never reach this point */ - fprintf(stderr, "unexpected error parsing command " - "arguments\n"); - quit(1); - break; - } - } - - argc -= isc_commandline_index; - argv += isc_commandline_index; - - /* argc & argv have been modified, so now only "extra" parameters are */ - /* left in argc & argv. "Extra" parameters are any parameters that were - */ - /* not passed using a command line flag. Exactly 2 args should be left. - */ - /* The first should be the BDB environment path, the second should be - * the */ - /* BDB database. The BDB database path can be either relative to the */ - /* BDB environment path, or absolute. */ - if (argc < 2) { - fprintf(stderr, "Both a Berkeley DB environment and file " - "must be specified"); - quit(2); - } else if (argc > 2) { - fprintf(stderr, "Too many parameters. Check command line for " - "errors."); - quit(2); - } - - /* get db_file to operate on */ - db_envdir = argv[0]; - db_file = argv[1]; - - if (openBDB() != ISC_R_SUCCESS) { - /* openBDB already prints error messages, don't do it here. */ - bdb_cleanup(); - quit(3); - } - - switch (operation) { - case list: - operation_listOrDelete(false); - break; - case dele: - operation_listOrDelete(true); - break; - case add: - operation_add(); - break; - case bulk: - operation_bulk(); - break; - default: - fprintf(stderr, "\nNo operation was selected. " - "Select an operation (l d a f)"); - quit(2); - break; - } - - quit(0); -} -#endif /* ifdef DLZ_BDB */ diff --git a/contrib/dlz/config.dlz.in b/contrib/dlz/config.dlz.in deleted file mode 100644 index f769cf1f70..0000000000 --- a/contrib/dlz/config.dlz.in +++ /dev/null @@ -1,508 +0,0 @@ -# Copyright (C) 2005 Internet Systems Consortium, Inc. ("ISC") -# -# Permission to use, copy, modify, and 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 ISC DISCLAIMS ALL WARRANTIES WITH -# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -# AND FITNESS. IN NO EVENT SHALL ISC 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. - -# -# Shorthand. Note quoting: DLZ_DRIVER_DIR expanded in Makefile, not here. -# -dlzdir='${DLZ_DRIVER_DIR}' - -# -# Private autoconf macro to simplify configuring drivers: -# -# DLZ_ADD_DRIVER(DEFINE, DRIVER, INCLUDES, LIBS) -# -# where: -# DEFINE is FOO (to define -DDLZ_FOO) -# DRIVER is dlz_foo_driver (sources without the .c) -# INCLUDES is any necessary include definitions -# LIBS is any necessary library definitions -# -AC_DEFUN([DLZ_ADD_DRIVER], [ - CONTRIB_DLZ="$CONTRIB_DLZ -DDLZ_$1" - for i in $2 - do - DLZ_DRIVER_SRCS="$DLZ_DRIVER_SRCS $dlzdir/$i.c" - DLZ_DRIVER_OBJS="$DLZ_DRIVER_OBJS $i.$O" - done - if test -n "$3" - then - DLZ_DRIVER_INCLUDES="$DLZ_DRIVER_INCLUDES $3" - DLZ_DRIVER_$1_INCLUDES="$3" - fi - if test -n "$4" - then - DLZ_DRIVER_LIBS="$DLZ_DRIVER_LIBS $4" - DLZ_DRIVER_$1_LIBS="$4" - fi -]) - -# -# Check for the various DLZ drivers -# - -# -# Was --with-dlz-postgres specified? -# - -AC_MSG_CHECKING(for Postgres DLZ driver) -AC_ARG_WITH(dlz_postgres, - AS_HELP_STRING([--with-dlz-postgres[=PATH]], - [Build with Postgres DLZ driver [yes|no|path]. - (Required to use Postgres with DLZ)]), - use_dlz_postgres="$withval", use_dlz_postgres="no") - -if test "$use_dlz_postgres" != "no" -then - if test "$use_dlz_postgres" != "yes" - then - AC_PATH_PROGS(PG_CONFIG, pg_config, [not found], $use_dlz_postgres/bin) - else - AC_PATH_PROGS(PG_CONFIG, pg_config, [not found]) - fi - - if test "$PG_CONFIG" != "not found" - then - use_dlz_postgres=`$PG_CONFIG --includedir` - use_dlz_postgres_lib=`$PG_CONFIG --libdir` - else - pgprefix="$use_dlz_postgres" - use_dlz_postgres="$pgprefix/include" - use_dlz_postgres_lib="$pgprefix/lib" - fi -fi - -if test "$use_dlz_postgres" = "yes/include" -then - # User did not specify path and Postgres didn't say - guess it - pgdirs="/usr /usr/local /usr/local/pgsql /usr/pkg" - for d in $pgdirs - do - if test -f $d/include/libpq-fe.h - then - use_dlz_postgres=$d/include - use_dlz_postgres_lib=$d/lib - break - fi - done -fi - -if test "$use_dlz_postgres" = "yes/include" -then - # Still no joy, give up - - AC_MSG_RESULT(not found) - AC_MSG_ERROR( -[No pg_config and PostgreSQL was not found in any of $pgdirs; use --with-dlz-postgres=/path or put pg_config in your path]) -fi - -case "$use_dlz_postgres" in - no) - AC_MSG_RESULT(no) - ;; - *) - DLZ_ADD_DRIVER(POSTGRES, dlz_postgres_driver, - [-I$use_dlz_postgres], - [-L$use_dlz_postgres_lib -lpq]) - - AC_MSG_RESULT( -[using PostgreSQL from $use_dlz_postgres_lib and $use_dlz_postgres]) - ;; -esac - - -# -# Was --with-dlz-mysql specified? -# - -AC_MSG_CHECKING(for MySQL DLZ driver) -AC_ARG_WITH(dlz_mysql, - AS_HELP_STRING([--with-dlz-mysql[=PATH]], - [Build with MySQL DLZ driver [yes|no|path]. - (Required to use MySQL with DLZ)]), - use_dlz_mysql="$withval", use_dlz_mysql="no") - -mysql_include="" -mysql_lib="" -if test "$use_dlz_mysql" = "yes" -then - AC_CHECK_PROGS(MYSQL_CONFIG, mysql_config) - if test -n "$MYSQL_CONFIG" - then - mysql_include=`${MYSQL_CONFIG} --include` - mysql_lib=`${MYSQL_CONFIG} --libs` - use_dlz_mysql="config" - - else - # User did not specify a path - guess it - mysqldirs="/usr /usr/local /usr/local/mysql /usr/pkg" - for d in $mysqldirs - do - if test -f $d/include/mysql/mysql.h - then - use_dlz_mysql=$d - mysql_include=$d/include/mysql - break - elif test -f $d/include/mysql.h - then - use_dlz_mysql=$d - mysql_include=$d/include - break - fi - done - fi -elif test "$use_dlz_mysql" != "no" -then - d=$use_dlz_mysql - if test -f $d/include/mysql/mysql.h - then - mysql_include=$d/include/mysql - elif test -f $d/include/mysql.h - then - mysql_include=$d/include - fi -fi - -if test "$use_dlz_mysql" = "yes" -then - AC_MSG_RESULT(not found) - AC_MSG_ERROR( -[MySQL was not found in any of $mysqldirs; use --with-dlz-mysql=/path]) -fi - -case "$use_dlz_mysql" in - no) - AC_MSG_RESULT(no) - ;; - config) - DLZ_ADD_DRIVER(MYSQL, dlz_mysql_driver, - [${mysql_include}], - [${mysql_lib}]) - - AC_MSG_RESULT( -[using mysql with libs ${mysql_lib} and includes ${mysql_include}]) - ;; - *) - if test -d "$use_dlz_mysql/lib/mysql" - then - mysql_lib="$use_dlz_mysql/lib/mysql" - else - mysql_lib="$use_dlz_mysql/lib" - fi - DLZ_ADD_DRIVER(MYSQL, dlz_mysql_driver, - [-I${mysql_include}], - [-L${mysql_lib} -lmysqlclient -lz -lcrypt -lm]) - - AC_MSG_RESULT( -[using mysql from ${mysql_lib} and ${mysql_include}]) - ;; -esac - - -# -# Was --with-dlz-bdb specified? -# - -AC_MSG_CHECKING(for Berkeley DB DLZ driver...) -AC_ARG_WITH(dlz_bdb, - AS_HELP_STRING([--with-dlz-bdb[=PATH]], - [Build with Berkeley DB DLZ driver [yes|no|path]. - (Required to use Berkeley DB with DLZ)]), - use_dlz_bdb="$withval", use_dlz_bdb="no") - -case "$use_dlz_bdb" in - no) - AC_MSG_RESULT(no) - ;; - *) - if test "$use_dlz_bdb" = "yes" - then - # User did not specify a path - guess directories - bdbdirs="/usr/local /usr/pkg /usr" - elif test -d "$use_dlz_bdb" - then - # User specified directory and it exists - bdbdirs="$use_dlz_bdb" - else - AC_MSG_RESULT(not found) - AC_MSG_ERROR([path $use_dlz_bdb does not exist]) - bdbdirs="" - fi - - # Use path we were given or guessed. This is insanely - # complicated because we have to search for a bunch of - # platform-specific variations and have to check - # separately for include and library directories. - - # Set both to yes, so we can check them later - dlz_bdb_inc="yes" - dlz_bdb_libs="yes" - - AC_MSG_RESULT( ) - for dd in $bdbdirs - do - # Skip nonexistent directories - if test ! -d "$dd" - then - continue - fi - - # Check other locations for includes. - # Order is important (sigh). - - bdb_incdirs="/db53 /db51 /db48 /db47 /db46 /db45 /db44 /db43 /db42 /db41 /db4 /db" - # include a blank element first - for d in "" $bdb_incdirs - do - if test -f "$dd/include${d}/db.h" - then - dlz_bdb_inc="-I$dd/include${d}" - break - fi - done - - # Give up on this directory if we couldn't - # find the include subdir - - if test "$dlz_bdb_inc" = "yes" - then - continue - fi - - # Look for libname other than libdb.so. - # Order is important (sigh). - - bdb_libnames="db53 db-5.3 db51 db-5.1 db48 db-4.8 db47 db-4.7 db46 db-4.6 db45 db-4.5 db44 db-4.4 db43 db-4.3 db42 db-4.2 db41 db-4.1 db" - for d in $bdb_libnames - do - if test "$dd" = "/usr" - then - AC_CHECK_LIB($d, db_create, dlz_bdb_libs="-l${d}") - if test $dlz_bdb_libs != "yes" - then - break - fi - elif test -f "$dd/lib/lib${d}.so" - then - dlz_bdb_libs="-L${dd}/lib -l${d}" - break - fi - done - - # If we found both incdir and lib, we're done - if test "$dlz_bdb_libs" != "yes" - then - break - fi - - # Otherwise, we're starting over - - dlz_bdb_inc="yes" - dlz_bdb_libs="yes" - done - - # Done searching, now make sure we got everything. - - if test "$dlz_bdb_inc" = "yes" - then - AC_MSG_ERROR([could not find Berkeley DB include directory]) - fi - - if test "$dlz_bdb_libs" = "yes" - then - AC_MSG_RESULT(not found) - AC_MSG_ERROR([could not find Berkeley DB library]) - fi - - DLZ_ADD_DRIVER(BDB, dlz_bdb_driver dlz_bdbhpt_driver, - [$dlz_bdb_inc], [$dlz_bdb_libs]) - - AC_MSG_RESULT([using Berkeley DB: $dlz_bdb_inc $dlz_bdb_libs]) - - AC_CONFIG_FILES([contrib/dlz/bin/dlzbdb/Makefile]) - ;; -esac - - -# -# Was --with-dlz-filesystem specified? -# - -AC_MSG_CHECKING(for file system DLZ driver) -AC_ARG_WITH(dlz_filesystem, - AS_HELP_STRING([--with-dlz-filesystem[=ARG]], - [Build with filesystem DLZ driver [yes|no]. - (Required to use file system driver with DLZ)]), - use_dlz_filesystem="$withval", use_dlz_filesystem="no") - -case "$use_dlz_filesystem" in - no) - AC_MSG_RESULT(no) - ;; - *) - DLZ_ADD_DRIVER(FILESYSTEM, dlz_filesystem_driver) - DLZ_SYSTEM_TEST=filesystem - AC_MSG_RESULT(yes) - ;; -esac - - -# -# Was --with-dlz-ldap specified? -# - -AC_MSG_CHECKING(for LDAP DLZ driver) -AC_ARG_WITH(dlz_ldap, - AS_HELP_STRING([--with-dlz-ldap[=PATH]], - [Build with LDAP DLZ driver [yes|no|path]. - (Required to use LDAP with DLZ)]), - use_dlz_ldap="$withval", use_dlz_ldap="no") - -if test "$use_dlz_ldap" = "yes" -then - # User did not specify a path - guess it - ldapdirs="/usr /usr/local /usr/pkg" - for d in $ldapdirs - do - if test -f $d/include/ldap.h - then - use_dlz_ldap=$d - break - fi - done -fi - -if test "$use_dlz_ldap" = "yes" -then - AC_MSG_RESULT(not found) - AC_MSG_ERROR( -[LDAP headers were not found in any of $ldapdirs; use --with-dlz-ldap=/path]) -fi - -case "$use_dlz_ldap" in - no) - AC_MSG_RESULT(no) - ;; - *) - DLZ_ADD_DRIVER(LDAP, dlz_ldap_driver, - [-I$use_dlz_ldap/include], - [-L$use_dlz_ldap/lib -lldap -llber]) - - AC_MSG_RESULT( -[using LDAP from $use_dlz_ldap/lib and $use_dlz_ldap/include]) - ;; -esac - - -# -# Was --with-dlz-odbc specified? -# - -AC_MSG_CHECKING(for ODBC DLZ driver) -AC_ARG_WITH(dlz_odbc, - AS_HELP_STRING([--with-dlz-odbc[=PATH]], - [Build with ODBC DLZ driver [yes|no|path]. - (Required to use ODBC with DLZ)]), - use_dlz_odbc="$withval", use_dlz_odbc="no") - -if test "$use_dlz_odbc" = "yes" -then - # User did not specify a path - guess it - libodbc_found=no - sql_h_found=no - AC_CHECK_HEADER(sql.h, sql_h_found=yes) - AC_CHECK_LIB(odbc, SQLConnect, libodbc_found=yes) - - if test $libodbc_found = "yes" -o $sql_h_found = "yes" - then - use_dlz_odbc=system - dlz_odbc_include="" - dlz_odbc_libs="-lodbc" - else - odbcdirs="/usr /usr/local /usr/pkg" - for d in $odbcdirs - do - if test -f $d/include/sql.h -a -f $d/lib/libodbc.a - then - use_dlz_odbc=$d - dlz_odbc_include="-I$use_dlz_odbc/include" - dlz_odbc_libs="-L$use_dlz_odbc/lib -lodbc" - break - fi - done - fi -fi - -case "$use_dlz_odbc" in - no) - AC_MSG_RESULT(no) - ;; - yes) - AC_MSG_RESULT(not found) - AC_MSG_ERROR( -[ODBC headers were not found in any of $odbcdirs; use --with-dlz-odbc=/path]) - ;; - *) - DLZ_ADD_DRIVER(ODBC, dlz_odbc_driver, - [$dlz_odbc_include], - [$dlz_odbc_libs]) - - AC_MSG_RESULT([using ODBC from $use_dlz_odbc]) - ;; -esac - - -# -# Was --with-dlz-stub specified? -# - -AC_MSG_CHECKING(for stub DLZ driver) -AC_ARG_WITH(dlz_stub, - AS_HELP_STRING([--with-dlz-stub[=ARG]], - [Build with stub DLZ driver [yes|no]. - (Required to use stub driver with DLZ)]), - use_dlz_stub="$withval", use_dlz_stub="no") - -case "$use_dlz_stub" in - no) - AC_MSG_RESULT(no) - ;; - *) - - DLZ_ADD_DRIVER(STUB, dlz_stub_driver) - - AC_MSG_RESULT(yes) - ;; -esac - -# Add any additional DLZ drivers here. - -# -# Finally, some generic stuff that applies to all drivers, assuming -# we're compiling contrib DLZ drivers at all. -# -if test -n "$CONTRIB_DLZ" -then - CONTRIB_DLZ="-DCONTRIB_DLZ $CONTRIB_DLZ" - - # - # Where to find DLZ driver header files. - # - DLZ_DRIVER_INCLUDES="-I$dlzdir/include $DLZ_DRIVER_INCLUDES" - - # - # Initialization and shutdown wrappers, helper functions. - # - DLZ_DRIVER_SRCS="$dlzdir/dlz_drivers.c $dlzdir/sdlz_helper.c $DLZ_DRIVER_SRCS" - DLZ_DRIVER_OBJS="dlz_drivers.$O sdlz_helper.$O $DLZ_DRIVER_OBJS" -fi diff --git a/contrib/dlz/drivers/.gitignore b/contrib/dlz/drivers/.gitignore deleted file mode 100644 index de7475d888..0000000000 --- a/contrib/dlz/drivers/.gitignore +++ /dev/null @@ -1 +0,0 @@ -rules diff --git a/contrib/dlz/drivers/dlz_bdb_driver.c b/contrib/dlz/drivers/dlz_bdb_driver.c deleted file mode 100644 index 0ae6de250f..0000000000 --- a/contrib/dlz/drivers/dlz_bdb_driver.c +++ /dev/null @@ -1,800 +0,0 @@ -/* - * Copyright (C) 2002 Stichting NLnet, Netherlands, stichting@nlnet.nl. - * - * Permission to use, copy, modify, and 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 STICHTING NLNET - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * STICHTING NLNET 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. - * - * The development of Dynamically Loadable Zones (DLZ) for Bind 9 was - * conceived and contributed by Rob Butler. - * - * Permission to use, copy, modify, and 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 ROB BUTLER - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * ROB BUTLER 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. - */ - -/* - * Copyright (C) 1999-2001, 2016 Internet Systems Consortium, Inc. ("ISC") - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -#ifdef DLZ_BDB -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include - -#include -#include - -static dns_sdlzimplementation_t *dlz_bdb = NULL; - -/* should the bdb driver use threads. */ -#define bdb_threads DB_THREAD - -/* BDB database names */ -#define dlz_data "dns_data" -#define dlz_zone "dns_zone" -#define dlz_host "dns_host" -#define dlz_client "dns_client" - -/*% - * This structure contains all the Berkeley DB handles - * for this instance of the BDB driver. - */ - -typedef struct bdb_instance { - DB_ENV *dbenv; /*%< BDB environment */ - DB *data; /*%< dns_data database handle */ - DB *zone; /*%< zone database handle */ - DB *host; /*%< host database handle */ - DB *client; /*%< client database handle */ - isc_mem_t *mctx; /*%< memory context */ -} bdb_instance_t; - -typedef struct parsed_data { - char *zone; - char *host; - char *type; - int ttl; - char *data; -} parsed_data_t; - -/* forward reference */ - -static isc_result_t -bdb_findzone(void *driverarg, void *dbdata, const char *name, - dns_clientinfomethods_t *methods, dns_clientinfo_t *clientinfo); - -/*% - * Parses the DBT from the Berkeley DB into a parsed_data record - * The parsed_data record should be allocated before and passed into the - * bdb_parse_data function. The char (type & data) fields should not - * be "free"d as that memory is part of the DBT data field. It will be - * "free"d when the DBT is freed. - */ - -static isc_result_t -bdb_parse_data(char *in, parsed_data_t *pd) { - char *endp, *ttlStr; - char *tmp = in; - char *lastchar = (char *)&tmp[strlen(tmp) + 1]; - - /*% - * String should be formatted as: - * zone(a space)host(a space)ttl(a space)type(a space)remaining data - * examples: - * example.com www 10 A 127.0.0.1 - * example.com mail 10 A 127.0.0.2 - * example.com @ 10 MX 20 mail.example.com - */ - - /* save pointer to zone */ - pd->zone = tmp; - - /* find space after zone and change it to a '\0' */ - tmp = strchr(tmp, ' '); - /* verify we found a space */ - if (tmp == NULL) { - return (ISC_R_FAILURE); - } - /* change the space to a null (string terminator) */ - tmp[0] = '\0'; - /* make sure it is safe to increment pointer */ - if (++tmp > lastchar) { - return (ISC_R_FAILURE); - } - - /* save pointer to host */ - pd->host = tmp; - - /* find space after type and change it to a '\0' */ - tmp = strchr(tmp, ' '); - /* verify we found a space */ - if (tmp == NULL) { - return (ISC_R_FAILURE); - } - /* change the space to a null (string terminator) */ - tmp[0] = '\0'; - /* make sure it is safe to increment pointer */ - if (++tmp > lastchar) { - return (ISC_R_FAILURE); - } - - /* save pointer to dns type */ - pd->type = tmp; - - /* find space after type and change it to a '\0' */ - tmp = strchr(tmp, ' '); - /* verify we found a space */ - if (tmp == NULL) { - return (ISC_R_FAILURE); - } - /* change the space to a null (string terminator) */ - tmp[0] = '\0'; - /* make sure it is safe to increment pointer */ - if (++tmp > lastchar) { - return (ISC_R_FAILURE); - } - - /* save pointer to dns ttl */ - ttlStr = tmp; - - /* find space after ttl and change it to a '\0' */ - tmp = strchr(tmp, ' '); - /* verify we found a space */ - if (tmp == NULL) { - return (ISC_R_FAILURE); - } - /* change the space to a null (string terminator) */ - tmp[0] = '\0'; - /* make sure it is safe to increment pointer */ - if (++tmp > lastchar) { - return (ISC_R_FAILURE); - } - - /* save pointer to remainder of DNS data */ - pd->data = tmp; - - /* convert ttl string to integer */ - pd->ttl = strtol(ttlStr, &endp, 10); - if (*endp != '\0' || pd->ttl < 0) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "BDB driver ttl must be a positive number"); - return (ISC_R_FAILURE); - } - - /* if we get this far everything should have worked. */ - return (ISC_R_SUCCESS); -} - -/* - * DLZ methods - */ - -static isc_result_t -bdb_allowzonexfr(void *driverarg, void *dbdata, const char *name, - const char *client) { - isc_result_t result; - bdb_instance_t *db = (bdb_instance_t *)dbdata; - DBC *client_cursor = NULL; - DBT key, data; - - /* check to see if we are authoritative for the zone first. */ - result = bdb_findzone(driverarg, dbdata, name, NULL, NULL); - if (result != ISC_R_SUCCESS) { - return (ISC_R_NOTFOUND); - } - - memset(&key, 0, sizeof(DBT)); - key.flags = DB_DBT_MALLOC; - key.data = strdup(name); - if (key.data == NULL) { - result = ISC_R_NOMEMORY; - goto xfr_cleanup; - } - key.size = strlen(key.data); - - memset(&data, 0, sizeof(DBT)); - data.flags = DB_DBT_MALLOC; - data.data = strdup(client); - if (data.data == NULL) { - result = ISC_R_NOMEMORY; - goto xfr_cleanup; - } - data.size = strlen(data.data); - - /* get a cursor to loop through zone data */ - if (db->client->cursor(db->client, NULL, &client_cursor, 0) != 0) { - result = ISC_R_FAILURE; - goto xfr_cleanup; - } - - switch (client_cursor->c_get(client_cursor, &key, &data, DB_GET_BOTH)) { - case DB_NOTFOUND: - case DB_SECONDARY_BAD: - result = ISC_R_NOTFOUND; - break; - case 0: - result = ISC_R_SUCCESS; - break; - default: - result = ISC_R_FAILURE; - } - -xfr_cleanup: - - /* free any memory duplicate string in the key field */ - if (key.data != NULL) { - free(key.data); - } - - /* free any memory allocated to the data field. */ - if (data.data != NULL) { - free(data.data); - } - - /* get rid of zone_cursor */ - if (client_cursor != NULL) { - client_cursor->c_close(client_cursor); - } - - return (result); -} - -static isc_result_t -bdb_allnodes(const char *zone, void *driverarg, void *dbdata, - dns_sdlzallnodes_t *allnodes) { - isc_result_t result = ISC_R_NOTFOUND; - bdb_instance_t *db = (bdb_instance_t *)dbdata; - DBC *zone_cursor = NULL; - DBT key, data; - int flags; - int bdbres; - parsed_data_t pd; - char *tmp = NULL, *tmp_zone; - - UNUSED(driverarg); - - memset(&key, 0, sizeof(DBT)); - memset(&data, 0, sizeof(DBT)); - - key.data = tmp_zone = strdup(zone); - - if (key.data == NULL) { - return (ISC_R_NOMEMORY); - } - - key.size = strlen(key.data); - - /* get a cursor to loop through zone data */ - if (db->zone->cursor(db->zone, NULL, &zone_cursor, 0) != 0) { - result = ISC_R_FAILURE; - goto allnodes_cleanup; - } - - flags = DB_SET; - - while ((bdbres = zone_cursor->c_get(zone_cursor, &key, &data, flags)) == - 0) { - flags = DB_NEXT_DUP; - - tmp = realloc(tmp, data.size + 1); - if (tmp == NULL) { - goto allnodes_cleanup; - } - - strncpy(tmp, data.data, data.size); - tmp[data.size] = '\0'; - - if (bdb_parse_data(tmp, &pd) != ISC_R_SUCCESS) { - goto allnodes_cleanup; - } - - result = dns_sdlz_putnamedrr(allnodes, pd.host, pd.type, pd.ttl, - pd.data); - if (result != ISC_R_SUCCESS) { - goto allnodes_cleanup; - } - } /* end while loop */ - -allnodes_cleanup: - - if (tmp != NULL) { - free(tmp); - } - - /* free any memory duplicate string in the key field */ - if (tmp_zone != NULL) { - free(tmp_zone); - } - - /* get rid of zone_cursor */ - if (zone_cursor != NULL) { - zone_cursor->c_close(zone_cursor); - } - - return (result); -} - -/*% - * Performs BDB cleanup. - * Used by bdb_create if there is an error starting up. - * Used by bdb_destroy when the driver is shutting down. - */ - -static void -bdb_cleanup(bdb_instance_t *db) { - isc_mem_t *mctx; - - /* close databases */ - if (db->data != NULL) { - db->data->close(db->data, 0); - } - if (db->host != NULL) { - db->host->close(db->host, 0); - } - if (db->zone != NULL) { - db->zone->close(db->zone, 0); - } - if (db->client != NULL) { - db->client->close(db->client, 0); - } - - /* close environment */ - if (db->dbenv != NULL) { - db->dbenv->close(db->dbenv, 0); - } - - /* cleanup memory */ - if (db->mctx != NULL) { - /* save mctx for later */ - mctx = db->mctx; - /* return, and detach the memory */ - isc_mem_putanddetach(&mctx, db, sizeof(bdb_instance_t)); - } -} - -static isc_result_t -bdb_findzone(void *driverarg, void *dbdata, const char *name, - dns_clientinfomethods_t *methods, dns_clientinfo_t *clientinfo) { - isc_result_t result; - bdb_instance_t *db = (bdb_instance_t *)dbdata; - DBC *zone_cursor = NULL; - DBT key, data; - - UNUSED(driverarg); - UNUSED(methods); - UNUSED(clientinfo); - - memset(&key, 0, sizeof(DBT)); - memset(&data, 0, sizeof(DBT)); - data.flags = DB_DBT_MALLOC; - - key.data = strdup(name); - - if (key.data == NULL) { - return (ISC_R_NOMEMORY); - } - - key.size = strlen(key.data); - - /* get a cursor to loop through zone data */ - if (db->zone->cursor(db->zone, NULL, &zone_cursor, 0) != 0) { - result = ISC_R_NOTFOUND; - goto findzone_cleanup; - } - - switch (zone_cursor->c_get(zone_cursor, &key, &data, DB_SET)) { - case DB_NOTFOUND: - case DB_SECONDARY_BAD: - result = ISC_R_NOTFOUND; - break; - case 0: - result = ISC_R_SUCCESS; - break; - default: - result = ISC_R_FAILURE; - } - -findzone_cleanup: - - /* free any memory duplicate string in the key field */ - if (key.data != NULL) { - free(key.data); - } - - /* free any memory allocated to the data field. */ - if (data.data != NULL) { - free(data.data); - } - - /* get rid of zone_cursor */ - if (zone_cursor != NULL) { - zone_cursor->c_close(zone_cursor); - } - - return (result); -} - -static isc_result_t -bdb_lookup(const char *zone, const char *name, void *driverarg, void *dbdata, - dns_sdlzlookup_t *lookup, dns_clientinfomethods_t *methods, - dns_clientinfo_t *clientinfo) { - isc_result_t result = ISC_R_NOTFOUND; - bdb_instance_t *db = (bdb_instance_t *)dbdata; - DBC *zone_cursor = NULL; - DBC *host_cursor = NULL; - DBC *join_cursor = NULL; - DBT key, data; - DBC *cur_arr[3]; - int bdbres; - parsed_data_t pd; - char *tmp_zone, *tmp_host = NULL; - char *tmp = NULL; - - UNUSED(driverarg); - UNUSED(methods); - UNUSED(clientinfo); - - memset(&key, 0, sizeof(DBT)); - memset(&data, 0, sizeof(DBT)); - - /* set zone key */ - key.data = tmp_zone = strdup(zone); - if (key.data == NULL) { - result = ISC_R_NOMEMORY; - goto lookup_cleanup; - } - key.size = strlen(key.data); - - /* get a cursor to loop through zone data */ - if (db->zone->cursor(db->zone, NULL, &zone_cursor, 0) != 0) { - result = ISC_R_FAILURE; - goto lookup_cleanup; - } - - /* initialize zone_cursor with zone_key */ - if (zone_cursor->c_get(zone_cursor, &key, &data, DB_SET) != 0) { - result = ISC_R_NOTFOUND; - goto lookup_cleanup; - } - - /* set host key */ - key.data = tmp_host = strdup(name); - if (key.data == NULL) { - result = ISC_R_NOMEMORY; - goto lookup_cleanup; - } - key.size = strlen(key.data); - - /* get a cursor to loop through host data */ - if (db->host->cursor(db->host, NULL, &host_cursor, 0) != 0) { - result = ISC_R_FAILURE; - goto lookup_cleanup; - } - - /* initialize host_cursor with host_key */ - if (host_cursor->c_get(host_cursor, &key, &data, DB_SET) != 0) { - result = ISC_R_NOTFOUND; - goto lookup_cleanup; - } - - cur_arr[0] = zone_cursor; - cur_arr[1] = host_cursor; - cur_arr[2] = NULL; - - db->data->join(db->data, cur_arr, &join_cursor, 0); - - while ((bdbres = join_cursor->c_get(join_cursor, &key, &data, 0)) == 0) - { - tmp = realloc(tmp, data.size + 1); - if (tmp == NULL) { - goto lookup_cleanup; - } - - strncpy(tmp, data.data, data.size); - tmp[data.size] = '\0'; - - if (bdb_parse_data(tmp, &pd) != ISC_R_SUCCESS) { - goto lookup_cleanup; - } - - result = dns_sdlz_putrr(lookup, pd.type, pd.ttl, pd.data); - - if (result != ISC_R_SUCCESS) { - goto lookup_cleanup; - } - } /* end while loop */ - -lookup_cleanup: - - if (tmp != NULL) { - free(tmp); - } - if (tmp_zone != NULL) { - free(tmp_zone); - } - if (tmp_host != NULL) { - free(tmp_host); - } - - /* get rid of the joined cusor */ - if (join_cursor != NULL) { - join_cursor->c_close(join_cursor); - } - - /* get rid of zone_cursor */ - if (zone_cursor != NULL) { - zone_cursor->c_close(zone_cursor); - } - - /* get rid of host_cursor */ - if (host_cursor != NULL) { - host_cursor->c_close(host_cursor); - } - - return (result); -} - -/*% Initializes, sets flags and then opens Berkeley databases. */ - -static isc_result_t -bdb_opendb(DB_ENV *db_env, DBTYPE db_type, DB **db, const char *db_name, - char *db_file, int flags) { - int result; - - /* Initialize the database. */ - if ((result = db_create(db, db_env, 0)) != 0) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "BDB could not initialize %s database. " - "BDB error: %s", - db_name, db_strerror(result)); - return (ISC_R_FAILURE); - } - - /* set database flags. */ - if ((result = (*db)->set_flags(*db, flags)) != 0) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "BDB could not set flags for %s database. " - "BDB error: %s", - db_name, db_strerror(result)); - return (ISC_R_FAILURE); - } - - /* open the database. */ - if ((result = (*db)->open(*db, NULL, db_file, db_name, db_type, - DB_RDONLY | bdb_threads, 0)) != 0) - { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "BDB could not open %s database in %s. " - "BDB error: %s", - db_name, db_file, db_strerror(result)); - return (ISC_R_FAILURE); - } - - return (ISC_R_SUCCESS); -} - -static isc_result_t -bdb_create(const char *dlzname, unsigned int argc, char *argv[], - void *driverarg, void **dbdata) { - isc_result_t result; - int bdbres; - bdb_instance_t *db = NULL; - - UNUSED(dlzname); - UNUSED(driverarg); - - /* verify we have 3 arg's passed to the driver */ - if (argc != 3) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Berkeley DB driver requires at least " - "2 command line args."); - return (ISC_R_FAILURE); - } - - /* allocate and zero memory for driver structure */ - db = isc_mem_get(named_g_mctx, sizeof(bdb_instance_t)); - memset(db, 0, sizeof(bdb_instance_t)); - - /* attach to the memory context */ - isc_mem_attach(named_g_mctx, &db->mctx); - - /* create BDB environment - * Basically BDB allocates and assigns memory to db->dbenv - */ - bdbres = db_env_create(&db->dbenv, 0); - if (bdbres != 0) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "BDB environment could not be created. " - "BDB error: %s", - db_strerror(bdbres)); - result = ISC_R_FAILURE; - goto init_cleanup; - } - - /* open BDB environment */ - bdbres = db->dbenv->open( - db->dbenv, argv[1], - DB_INIT_CDB | DB_INIT_MPOOL | bdb_threads | DB_CREATE, 0); - if (bdbres != 0) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "BDB environment at '%s' could not be opened. " - "BDB error: %s", - argv[1], db_strerror(bdbres)); - result = ISC_R_FAILURE; - goto init_cleanup; - } - - /* open dlz_data database. */ - result = bdb_opendb(db->dbenv, DB_UNKNOWN, &db->data, dlz_data, argv[2], - 0); - if (result != ISC_R_SUCCESS) { - goto init_cleanup; - } - - /* open dlz_host database. */ - result = bdb_opendb(db->dbenv, DB_UNKNOWN, &db->host, dlz_host, argv[2], - DB_DUP | DB_DUPSORT); - if (result != ISC_R_SUCCESS) { - goto init_cleanup; - } - - /* open dlz_zone database. */ - result = bdb_opendb(db->dbenv, DB_UNKNOWN, &db->zone, dlz_zone, argv[2], - DB_DUP | DB_DUPSORT); - if (result != ISC_R_SUCCESS) { - goto init_cleanup; - } - - /* open dlz_client database. */ - result = bdb_opendb(db->dbenv, DB_UNKNOWN, &db->client, dlz_client, - argv[2], DB_DUP | DB_DUPSORT); - if (result != ISC_R_SUCCESS) { - goto init_cleanup; - } - - /* associate the host secondary database with the primary database */ - bdbres = db->data->associate(db->data, NULL, db->host, NULL, 0); - if (bdbres != 0) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "BDB could not associate %s database with %s. " - "BDB error: %s", - dlz_host, dlz_data, db_strerror(bdbres)); - result = ISC_R_FAILURE; - goto init_cleanup; - } - - /* associate the zone secondary database with the primary database */ - bdbres = db->data->associate(db->data, NULL, db->zone, NULL, 0); - if (bdbres != 0) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "BDB could not associate %s database with %s. " - "BDB error: %s", - dlz_zone, dlz_data, db_strerror(bdbres)); - result = ISC_R_FAILURE; - goto init_cleanup; - } - - *dbdata = db; - - return (ISC_R_SUCCESS); - -init_cleanup: - - bdb_cleanup(db); - return (result); -} - -static void -bdb_destroy(void *driverarg, void *dbdata) { - UNUSED(driverarg); - - bdb_cleanup((bdb_instance_t *)dbdata); -} - -/* bdb_authority not needed as authority data is returned by lookup */ -static dns_sdlzmethods_t dlz_bdb_methods = { - bdb_create, - bdb_destroy, - bdb_findzone, - bdb_lookup, - NULL, - bdb_allnodes, - bdb_allowzonexfr, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, -}; - -/*% - * Wrapper around dns_sdlzregister(). - */ -isc_result_t -dlz_bdb_init(void) { - isc_result_t result; - - /* - * Write debugging message to log - */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_DEBUG(2), "Registering DLZ bdb driver."); - - result = dns_sdlzregister("bdb", &dlz_bdb_methods, NULL, - DNS_SDLZFLAG_RELATIVEOWNER | - DNS_SDLZFLAG_RELATIVERDATA | - DNS_SDLZFLAG_THREADSAFE, - named_g_mctx, &dlz_bdb); - if (result != ISC_R_SUCCESS) { - UNEXPECTED_ERROR(__FILE__, __LINE__, - "dns_sdlzregister() failed: %s", - isc_result_totext(result)); - result = ISC_R_UNEXPECTED; - } - - return (result); -} - -/*% - * Wrapper around dns_sdlzunregister(). - */ -void -dlz_bdb_clear(void) { - /* - * Write debugging message to log - */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_DEBUG(2), "Unregistering DLZ bdb driver."); - - if (dlz_bdb != NULL) { - dns_sdlzunregister(&dlz_bdb); - } -} - -#endif /* ifdef DLZ_BDB */ diff --git a/contrib/dlz/drivers/dlz_bdbhpt_driver.c b/contrib/dlz/drivers/dlz_bdbhpt_driver.c deleted file mode 100644 index 80f4330b67..0000000000 --- a/contrib/dlz/drivers/dlz_bdbhpt_driver.c +++ /dev/null @@ -1,869 +0,0 @@ -/* - * Copyright (C) 2002 Stichting NLnet, Netherlands, stichting@nlnet.nl. - * - * Permission to use, copy, modify, and 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 STICHTING NLNET - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * STICHTING NLNET 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. - * - * The development of Dynamically Loadable Zones (DLZ) for Bind 9 was - * conceived and contributed by Rob Butler. - * - * Permission to use, copy, modify, and 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 ROB BUTLER - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * ROB BUTLER 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. - */ - -/* - * Copyright (C) 1999-2001, 2016 Internet Systems Consortium, Inc. ("ISC") - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -#ifdef DLZ_BDB -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include - -#include -#include - -static dns_sdlzimplementation_t *dlz_bdbhpt = NULL; - -/* should the bdb driver use threads. */ -#define bdbhpt_threads DB_THREAD - -/* bdbhpt database names */ -#define dlz_data "dns_data" -#define dlz_zone "dns_zone" -#define dlz_xfr "dns_xfr" -#define dlz_client "dns_client" - -/* This structure contains all the Berkeley DB handles - * for this instance of the bdbhpt driver. - */ - -typedef struct bdbhpt_instance { - DB_ENV *dbenv; /*%< bdbhpt environment */ - DB *data; /*%< dns_data database handle */ - DB *zone; /*%< zone database handle */ - DB *xfr; /*%< zone xfr database handle */ - DB *client; /*%< client database handle */ - isc_mem_t *mctx; /*%< memory context */ -} bdbhpt_instance_t; - -typedef struct bdbhpt_parsed_data { - char *host; - char *type; - int ttl; - char *data; -} bdbhpt_parsed_data_t; - -/* forward reference */ - -static isc_result_t -bdbhpt_findzone(void *driverarg, void *dbdata, const char *name, - dns_clientinfomethods_t *methods, dns_clientinfo_t *clientinfo); - -/*% - * Reverses a string in place. - */ - -static char * -bdbhpt_strrev(char *str) { - char *p1, *p2; - - if (!str || !*str) { - return (str); - } - for (p1 = str, p2 = str + strlen(str) - 1; p2 > p1; ++p1, --p2) { - *p1 ^= *p2; - *p2 ^= *p1; - *p1 ^= *p2; - } - return (str); -} - -/*% - * Parses the DBT from the Berkeley DB into a parsed_data record - * The parsed_data record should be allocated before and passed into the - * bdbhpt_parse_data function. The char (type & data) fields should not - * be "free"d as that memory is part of the DBT data field. It will be - * "free"d when the DBT is freed. - */ - -static isc_result_t -bdbhpt_parse_data(char *in, bdbhpt_parsed_data_t *pd) { - char *endp, *ttlStr; - char *tmp = in; - char *lastchar = (char *)&tmp[strlen(tmp)]; - - /*% - * String should be formatted as: - * replication_id - * (a space) - * host_name - * (a space) - * ttl - * (a space) - * type - * (a space) - * remaining data - * - * examples: - * - * 9191 host 10 A 127.0.0.1 - * server1_212 host 10 A 127.0.0.2 - * {xxxx-xxxx-xxxx-xxxx-xxxx} host 10 MX 20 mail.example.com - */ - - /* - * we don't need the replication id, so don't - * bother saving a pointer to it. - */ - - /* find space after replication id */ - tmp = strchr(tmp, ' '); - /* verify we found a space */ - if (tmp == NULL) { - return (ISC_R_FAILURE); - } - /* make sure it is safe to increment pointer */ - if (++tmp > lastchar) { - return (ISC_R_FAILURE); - } - - /* save pointer to host */ - pd->host = tmp; - - /* find space after host and change it to a '\0' */ - tmp = strchr(tmp, ' '); - /* verify we found a space */ - if (tmp == NULL) { - return (ISC_R_FAILURE); - } - /* change the space to a null (string terminator) */ - tmp[0] = '\0'; - /* make sure it is safe to increment pointer */ - if (++tmp > lastchar) { - return (ISC_R_FAILURE); - } - - /* save pointer to ttl string */ - ttlStr = tmp; - - /* find space after ttl and change it to a '\0' */ - tmp = strchr(tmp, ' '); - /* verify we found a space */ - if (tmp == NULL) { - return (ISC_R_FAILURE); - } - /* change the space to a null (string terminator) */ - tmp[0] = '\0'; - /* make sure it is safe to increment pointer */ - if (++tmp > lastchar) { - return (ISC_R_FAILURE); - } - - /* save pointer to dns type */ - pd->type = tmp; - - /* find space after type and change it to a '\0' */ - tmp = strchr(tmp, ' '); - /* verify we found a space */ - if (tmp == NULL) { - return (ISC_R_FAILURE); - } - /* change the space to a null (string terminator) */ - tmp[0] = '\0'; - /* make sure it is safe to increment pointer */ - if (++tmp > lastchar) { - return (ISC_R_FAILURE); - } - - /* save pointer to remainder of DNS data */ - pd->data = tmp; - - /* convert ttl string to integer */ - pd->ttl = strtol(ttlStr, &endp, 10); - if (*endp != '\0' || pd->ttl < 0) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "bdbhpt driver ttl must be a positive number"); - return (ISC_R_FAILURE); - } - - /* if we get this far everything should have worked. */ - return (ISC_R_SUCCESS); -} - -/* - * DLZ methods - */ - -static isc_result_t -bdbhpt_allowzonexfr(void *driverarg, void *dbdata, const char *name, - const char *client) { - isc_result_t result; - bdbhpt_instance_t *db = (bdbhpt_instance_t *)dbdata; - DBT key, data; - - /* check to see if we are authoritative for the zone first. */ - result = bdbhpt_findzone(driverarg, dbdata, name, NULL, NULL); - if (result != ISC_R_SUCCESS) { - return (ISC_R_NOTFOUND); - } - - memset(&key, 0, sizeof(DBT)); - key.flags = DB_DBT_MALLOC; - key.data = strdup(name); - if (key.data == NULL) { - result = ISC_R_NOMEMORY; - goto xfr_cleanup; - } - key.size = strlen(key.data); - - memset(&data, 0, sizeof(DBT)); - data.flags = DB_DBT_MALLOC; - data.data = strdup(client); - if (data.data == NULL) { - result = ISC_R_NOMEMORY; - goto xfr_cleanup; - } - data.size = strlen(data.data); - - switch (db->client->get(db->client, NULL, &key, &data, DB_GET_BOTH)) { - case DB_NOTFOUND: - result = ISC_R_NOTFOUND; - break; - case 0: - result = ISC_R_SUCCESS; - break; - default: - result = ISC_R_FAILURE; - } - -xfr_cleanup: - - /* free any memory duplicate string in the key field */ - if (key.data != NULL) { - free(key.data); - } - - /* free any memory allocated to the data field. */ - if (data.data != NULL) { - free(data.data); - } - - return (result); -} - -/*% - * BDB does not allow a secondary index on a database that allows - * duplicates. We have a few options: - * - * 1) kill speed by having lookup method use a secondary db which - * is associated to the primary DB with the DNS data. Then have - * another secondary db for zone transfer which also points to - * the dns_data primary. NO - The point of this driver is - * lookup performance. - * - * 2) Blow up database size by storing DNS data twice. Once for - * the lookup (dns_data) database, and a second time for the zone - * transfer (dns_xfr) database. NO - That would probably require - * a larger cache to provide good performance. Also, that would - * make the DB larger on disk potentially slowing it as well. - * - * 3) Loop through the dns_xfr database with a cursor to get - * all the different hosts in a zone. Then use the zone & host - * together to lookup the data in the dns_data database. YES - - * This may slow down zone xfr's a little, but that's ok they - * don't happen as often and don't need to be as fast. We can - * also use this table when deleting a zone (The BDB driver - * is read only - the delete would be used during replication - * updates by a separate process). - */ - -static isc_result_t -bdbhpt_allnodes(const char *zone, void *driverarg, void *dbdata, - dns_sdlzallnodes_t *allnodes) { - isc_result_t result = ISC_R_NOTFOUND; - bdbhpt_instance_t *db = (bdbhpt_instance_t *)dbdata; - DBC *xfr_cursor = NULL; - DBC *dns_cursor = NULL; - DBT xfr_key, xfr_data, dns_key, dns_data; - int xfr_flags; - int dns_flags; - int bdbhptres; - bdbhpt_parsed_data_t pd; - char *tmp = NULL, *tmp_zone, *tmp_zone_host = NULL; - - UNUSED(driverarg); - - memset(&xfr_key, 0, sizeof(DBT)); - memset(&xfr_data, 0, sizeof(DBT)); - memset(&dns_key, 0, sizeof(DBT)); - memset(&dns_data, 0, sizeof(DBT)); - - xfr_key.data = tmp_zone = strdup(zone); - if (xfr_key.data == NULL) { - return (ISC_R_NOMEMORY); - } - - xfr_key.size = strlen(xfr_key.data); - - /* get a cursor to loop through dns_xfr table */ - if (db->xfr->cursor(db->xfr, NULL, &xfr_cursor, 0) != 0) { - result = ISC_R_FAILURE; - goto allnodes_cleanup; - } - - /* get a cursor to loop through dns_data table */ - if (db->data->cursor(db->data, NULL, &dns_cursor, 0) != 0) { - result = ISC_R_FAILURE; - goto allnodes_cleanup; - } - - xfr_flags = DB_SET; - - /* loop through xfr table for specified zone. */ - while ((bdbhptres = xfr_cursor->c_get(xfr_cursor, &xfr_key, &xfr_data, - xfr_flags)) == 0) - { - xfr_flags = DB_NEXT_DUP; - - /* +1 to allow for space between zone and host names */ - dns_key.size = xfr_data.size + xfr_key.size + 1; - - /* +1 to allow for null term at end of string. */ - dns_key.data = tmp_zone_host = malloc(dns_key.size + 1); - if (dns_key.data == NULL) { - goto allnodes_cleanup; - } - - /* - * construct search key for dns_data. - * zone_name(a space)host_name - */ - strcpy(dns_key.data, zone); - strcat(dns_key.data, " "); - strncat(dns_key.data, xfr_data.data, xfr_data.size); - - dns_flags = DB_SET; - - while ((bdbhptres = dns_cursor->c_get(dns_cursor, &dns_key, - &dns_data, dns_flags)) == - 0) - { - dns_flags = DB_NEXT_DUP; - - /* +1 to allow for null term at end of string. */ - tmp = realloc(tmp, dns_data.size + 1); - if (tmp == NULL) { - goto allnodes_cleanup; - } - - /* copy data to tmp string, and append null term. */ - strncpy(tmp, dns_data.data, dns_data.size); - tmp[dns_data.size] = '\0'; - - /* split string into dns data parts. */ - if (bdbhpt_parse_data(tmp, &pd) != ISC_R_SUCCESS) { - goto allnodes_cleanup; - } - - result = dns_sdlz_putnamedrr(allnodes, pd.host, pd.type, - pd.ttl, pd.data); - if (result != ISC_R_SUCCESS) { - goto allnodes_cleanup; - } - } /* end inner while loop */ - - /* clean up memory */ - if (tmp_zone_host != NULL) { - free(tmp_zone_host); - tmp_zone_host = NULL; - } - } /* end outer while loop */ - -allnodes_cleanup: - - /* free any memory */ - if (tmp != NULL) { - free(tmp); - } - - if (tmp_zone_host != NULL) { - free(tmp_zone_host); - } - - if (tmp_zone != NULL) { - free(tmp_zone); - } - - /* get rid of cursors */ - if (xfr_cursor != NULL) { - xfr_cursor->c_close(xfr_cursor); - } - - if (dns_cursor != NULL) { - dns_cursor->c_close(dns_cursor); - } - - return (result); -} - -/*% - * Performs bdbhpt cleanup. - * Used by bdbhpt_create if there is an error starting up. - * Used by bdbhpt_destroy when the driver is shutting down. - */ - -static void -bdbhpt_cleanup(bdbhpt_instance_t *db) { - isc_mem_t *mctx; - - /* close databases */ - if (db->data != NULL) { - db->data->close(db->data, 0); - } - if (db->xfr != NULL) { - db->xfr->close(db->xfr, 0); - } - if (db->zone != NULL) { - db->zone->close(db->zone, 0); - } - if (db->client != NULL) { - db->client->close(db->client, 0); - } - - /* close environment */ - if (db->dbenv != NULL) { - db->dbenv->close(db->dbenv, 0); - } - - /* cleanup memory */ - if (db->mctx != NULL) { - /* save mctx for later */ - mctx = db->mctx; - /* return, and detach the memory */ - isc_mem_putanddetach(&mctx, db, sizeof(bdbhpt_instance_t)); - } -} - -static isc_result_t -bdbhpt_findzone(void *driverarg, void *dbdata, const char *name, - dns_clientinfomethods_t *methods, - dns_clientinfo_t *clientinfo) { - isc_result_t result; - bdbhpt_instance_t *db = (bdbhpt_instance_t *)dbdata; - DBT key, data; - - UNUSED(driverarg); - UNUSED(methods); - UNUSED(clientinfo); - - memset(&key, 0, sizeof(DBT)); - memset(&data, 0, sizeof(DBT)); - data.flags = DB_DBT_MALLOC; - - key.data = strdup(name); - - if (key.data == NULL) { - return (ISC_R_NOMEMORY); - } - - /* - * reverse string to take advantage of BDB locality of reference - * if we need further lookups because the zone doesn't match the - * first time. - */ - key.data = bdbhpt_strrev(key.data); - key.size = strlen(key.data); - - switch (db->zone->get(db->zone, NULL, &key, &data, 0)) { - case DB_NOTFOUND: - result = ISC_R_NOTFOUND; - break; - case 0: - result = ISC_R_SUCCESS; - break; - default: - result = ISC_R_FAILURE; - } - - /* free any memory duplicate string in the key field */ - if (key.data != NULL) { - free(key.data); - } - - /* free any memory allocated to the data field. */ - if (data.data != NULL) { - free(data.data); - } - - return (result); -} - -static isc_result_t -bdbhpt_lookup(const char *zone, const char *name, void *driverarg, void *dbdata, - dns_sdlzlookup_t *lookup, dns_clientinfomethods_t *methods, - dns_clientinfo_t *clientinfo) { - isc_result_t result = ISC_R_NOTFOUND; - bdbhpt_instance_t *db = (bdbhpt_instance_t *)dbdata; - DBC *data_cursor = NULL; - DBT key, data; - int bdbhptres; - int flags; - - bdbhpt_parsed_data_t pd; - char *tmp = NULL; - char *keyStr = NULL; - - UNUSED(driverarg); - UNUSED(methods); - UNUSED(clientinfo); - - memset(&key, 0, sizeof(DBT)); - memset(&data, 0, sizeof(DBT)); - - key.size = strlen(zone) + strlen(name) + 1; - - /* allocate mem for key */ - key.data = keyStr = malloc((key.size + 1) * sizeof(char)); - - if (keyStr == NULL) { - return (ISC_R_NOMEMORY); - } - - strcpy(keyStr, zone); - strcat(keyStr, " "); - strcat(keyStr, name); - - /* get a cursor to loop through data */ - if (db->data->cursor(db->data, NULL, &data_cursor, 0) != 0) { - result = ISC_R_FAILURE; - goto lookup_cleanup; - } - - result = ISC_R_NOTFOUND; - - flags = DB_SET; - while ((bdbhptres = data_cursor->c_get(data_cursor, &key, &data, - flags)) == 0) { - flags = DB_NEXT_DUP; - tmp = realloc(tmp, data.size + 1); - if (tmp == NULL) { - goto lookup_cleanup; - } - - strncpy(tmp, data.data, data.size); - tmp[data.size] = '\0'; - - if (bdbhpt_parse_data(tmp, &pd) != ISC_R_SUCCESS) { - goto lookup_cleanup; - } - - result = dns_sdlz_putrr(lookup, pd.type, pd.ttl, pd.data); - - if (result != ISC_R_SUCCESS) { - goto lookup_cleanup; - } - } /* end while loop */ - -lookup_cleanup: - - /* get rid of cursor */ - if (data_cursor != NULL) { - data_cursor->c_close(data_cursor); - } - - free(keyStr); - if (tmp != NULL) { - free(tmp); - } - - return (result); -} - -/*% Initializes, sets flags and then opens Berkeley databases. */ - -static isc_result_t -bdbhpt_opendb(DB_ENV *db_env, DBTYPE db_type, DB **db, const char *db_name, - char *db_file, int flags) { - int result; - - /* Initialize the database. */ - if ((result = db_create(db, db_env, 0)) != 0) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "bdbhpt could not initialize %s database. " - "bdbhpt error: %s", - db_name, db_strerror(result)); - return (ISC_R_FAILURE); - } - - /* set database flags. */ - if ((result = (*db)->set_flags(*db, flags)) != 0) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "bdbhpt could not set flags for %s database. " - "bdbhpt error: %s", - db_name, db_strerror(result)); - return (ISC_R_FAILURE); - } - - /* open the database. */ - if ((result = (*db)->open(*db, NULL, db_file, db_name, db_type, - DB_RDONLY | bdbhpt_threads, 0)) != 0) - { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "bdbhpt could not open %s database in %s. " - "bdbhpt error: %s", - db_name, db_file, db_strerror(result)); - return (ISC_R_FAILURE); - } - - return (ISC_R_SUCCESS); -} - -static isc_result_t -bdbhpt_create(const char *dlzname, unsigned int argc, char *argv[], - void *driverarg, void **dbdata) { - isc_result_t result; - int bdbhptres; - int bdbFlags = 0; - bdbhpt_instance_t *db = NULL; - - UNUSED(dlzname); - UNUSED(driverarg); - - /* verify we have 4 arg's passed to the driver */ - if (argc != 4) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "bdbhpt driver requires at least " - "3 command line args."); - return (ISC_R_FAILURE); - } - - switch ((char)*argv[1]) { - /* - * Transactional mode. Highest safety - lowest speed. - */ - case 'T': - case 't': - bdbFlags = DB_INIT_MPOOL | DB_INIT_LOCK | DB_INIT_LOG | - DB_INIT_TXN; - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(1), - "bdbhpt driver using transactional mode."); - break; - /* - * Concurrent mode. Lower safety (no rollback) - - * higher speed. - */ - case 'C': - case 'c': - bdbFlags = DB_INIT_CDB | DB_INIT_MPOOL; - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(1), - "bdbhpt driver using concurrent mode."); - break; - /* - * Private mode. No inter-process communication & no locking. - * Lowest safety - highest speed. - */ - case 'P': - case 'p': - bdbFlags = DB_PRIVATE | DB_INIT_MPOOL; - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(1), - "bdbhpt driver using private mode."); - break; - default: - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "bdbhpt driver requires the operating mode " - "be set to P or C or T. You specified '%s'", - argv[1]); - return (ISC_R_FAILURE); - } - - /* allocate and zero memory for driver structure */ - db = isc_mem_get(named_g_mctx, sizeof(bdbhpt_instance_t)); - memset(db, 0, sizeof(bdbhpt_instance_t)); - - /* attach to the memory context */ - isc_mem_attach(named_g_mctx, &db->mctx); - - /* - * create bdbhpt environment - * Basically bdbhpt allocates and assigns memory to db->dbenv - */ - bdbhptres = db_env_create(&db->dbenv, 0); - if (bdbhptres != 0) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "bdbhpt environment could not be created. " - "bdbhpt error: %s", - db_strerror(bdbhptres)); - result = ISC_R_FAILURE; - goto init_cleanup; - } - - /* open bdbhpt environment */ - bdbhptres = db->dbenv->open(db->dbenv, argv[2], - bdbFlags | bdbhpt_threads | DB_CREATE, 0); - if (bdbhptres != 0) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "bdbhpt environment at '%s' could not be opened." - " bdbhpt error: %s", - argv[2], db_strerror(bdbhptres)); - result = ISC_R_FAILURE; - goto init_cleanup; - } - - /* open dlz_data database. */ - result = bdbhpt_opendb(db->dbenv, DB_UNKNOWN, &db->data, dlz_data, - argv[3], DB_DUP | DB_DUPSORT); - if (result != ISC_R_SUCCESS) { - goto init_cleanup; - } - - /* open dlz_xfr database. */ - result = bdbhpt_opendb(db->dbenv, DB_UNKNOWN, &db->xfr, dlz_xfr, - argv[3], DB_DUP | DB_DUPSORT); - if (result != ISC_R_SUCCESS) { - goto init_cleanup; - } - - /* open dlz_zone database. */ - result = bdbhpt_opendb(db->dbenv, DB_UNKNOWN, &db->zone, dlz_zone, - argv[3], 0); - if (result != ISC_R_SUCCESS) { - goto init_cleanup; - } - - /* open dlz_client database. */ - result = bdbhpt_opendb(db->dbenv, DB_UNKNOWN, &db->client, dlz_client, - argv[3], DB_DUP | DB_DUPSORT); - if (result != ISC_R_SUCCESS) { - goto init_cleanup; - } - - *dbdata = db; - - return (ISC_R_SUCCESS); - -init_cleanup: - - bdbhpt_cleanup(db); - return (result); -} - -static void -bdbhpt_destroy(void *driverarg, void *dbdata) { - UNUSED(driverarg); - - bdbhpt_cleanup((bdbhpt_instance_t *)dbdata); -} - -/* - * bdbhpt_authority not needed as authority data is returned by lookup - */ -static dns_sdlzmethods_t dlz_bdbhpt_methods = { - bdbhpt_create, - bdbhpt_destroy, - bdbhpt_findzone, - bdbhpt_lookup, - NULL, - bdbhpt_allnodes, - bdbhpt_allowzonexfr, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, -}; - -/*% - * Wrapper around dns_sdlzregister(). - */ -isc_result_t -dlz_bdbhpt_init(void) { - isc_result_t result; - - /* - * Write debugging message to log - */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_DEBUG(2), "Registering DLZ bdbhpt driver."); - - result = dns_sdlzregister("bdbhpt", &dlz_bdbhpt_methods, NULL, - DNS_SDLZFLAG_RELATIVEOWNER | - DNS_SDLZFLAG_RELATIVERDATA | - DNS_SDLZFLAG_THREADSAFE, - named_g_mctx, &dlz_bdbhpt); - if (result != ISC_R_SUCCESS) { - UNEXPECTED_ERROR(__FILE__, __LINE__, - "dns_sdlzregister() failed: %s", - isc_result_totext(result)); - result = ISC_R_UNEXPECTED; - } - - return (result); -} - -/*% - * Wrapper around dns_sdlzunregister(). - */ -void -dlz_bdbhpt_clear(void) { - /* - * Write debugging message to log - */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_DEBUG(2), "Unregistering DLZ bdbhpt driver."); - - if (dlz_bdbhpt != NULL) { - dns_sdlzunregister(&dlz_bdbhpt); - } -} - -#endif /* ifdef DLZ_BDB */ diff --git a/contrib/dlz/drivers/dlz_dlopen_driver.c b/contrib/dlz/drivers/dlz_dlopen_driver.c deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/contrib/dlz/drivers/dlz_drivers.c b/contrib/dlz/drivers/dlz_drivers.c deleted file mode 100644 index 5f5b66e884..0000000000 --- a/contrib/dlz/drivers/dlz_drivers.c +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (C) 2005 Internet Systems Consortium, Inc. ("ISC") - * - * Permission to use, copy, modify, and 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 ISC DISCLAIMS ALL WARRANTIES WITH - * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS. IN NO EVENT SHALL ISC 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. - */ - -/*! \file */ - -#include - -/* - * Pull in declarations for this module's functions. - */ - -#include - -/* - * Pull in driver-specific stuff. - */ - -#ifdef DLZ_STUB -#include -#endif /* ifdef DLZ_STUB */ - -#ifdef DLZ_POSTGRES -#include -#endif /* ifdef DLZ_POSTGRES */ - -#ifdef DLZ_MYSQL -#include -#endif /* ifdef DLZ_MYSQL */ - -#ifdef DLZ_FILESYSTEM -#include -#endif /* ifdef DLZ_FILESYSTEM */ - -#ifdef DLZ_BDB -#include -#include -#endif /* ifdef DLZ_BDB */ - -#ifdef DLZ_LDAP -#include -#endif /* ifdef DLZ_LDAP */ - -#ifdef DLZ_ODBC -#include -#endif /* ifdef DLZ_ODBC */ - -/*% - * Call init functions for all relevant DLZ drivers. - */ - -isc_result_t -dlz_drivers_init(void) { - isc_result_t result = ISC_R_SUCCESS; - -#ifdef DLZ_STUB - result = dlz_stub_init(); - if (result != ISC_R_SUCCESS) { - return (result); - } -#endif /* ifdef DLZ_STUB */ - -#ifdef DLZ_POSTGRES - result = dlz_postgres_init(); - if (result != ISC_R_SUCCESS) { - return (result); - } -#endif /* ifdef DLZ_POSTGRES */ - -#ifdef DLZ_MYSQL - result = dlz_mysql_init(); - if (result != ISC_R_SUCCESS) { - return (result); - } -#endif /* ifdef DLZ_MYSQL */ - -#ifdef DLZ_FILESYSTEM - result = dlz_fs_init(); - if (result != ISC_R_SUCCESS) { - return (result); - } -#endif /* ifdef DLZ_FILESYSTEM */ - -#ifdef DLZ_BDB - result = dlz_bdb_init(); - if (result != ISC_R_SUCCESS) { - return (result); - } - result = dlz_bdbhpt_init(); - if (result != ISC_R_SUCCESS) { - return (result); - } -#endif /* ifdef DLZ_BDB */ - -#ifdef DLZ_LDAP - result = dlz_ldap_init(); - if (result != ISC_R_SUCCESS) { - return (result); - } -#endif /* ifdef DLZ_LDAP */ - -#ifdef DLZ_ODBC - result = dlz_odbc_init(); - if (result != ISC_R_SUCCESS) { - return (result); - } -#endif /* ifdef DLZ_ODBC */ - - return (result); -} - -/*% - * Call shutdown functions for all relevant DLZ drivers. - */ - -void -dlz_drivers_clear(void) { -#ifdef DLZ_STUB - dlz_stub_clear(); -#endif /* ifdef DLZ_STUB */ - -#ifdef DLZ_POSTGRES - dlz_postgres_clear(); -#endif /* ifdef DLZ_POSTGRES */ - -#ifdef DLZ_MYSQL - dlz_mysql_clear(); -#endif /* ifdef DLZ_MYSQL */ - -#ifdef DLZ_FILESYSTEM - dlz_fs_clear(); -#endif /* ifdef DLZ_FILESYSTEM */ - -#ifdef DLZ_BDB - dlz_bdb_clear(); - dlz_bdbhpt_clear(); -#endif /* ifdef DLZ_BDB */ - -#ifdef DLZ_LDAP - dlz_ldap_clear(); -#endif /* ifdef DLZ_LDAP */ - -#ifdef DLZ_ODBC - dlz_odbc_clear(); -#endif /* ifdef DLZ_ODBC */ -} diff --git a/contrib/dlz/drivers/dlz_filesystem_driver.c b/contrib/dlz/drivers/dlz_filesystem_driver.c deleted file mode 100644 index 76b9ca735a..0000000000 --- a/contrib/dlz/drivers/dlz_filesystem_driver.c +++ /dev/null @@ -1,1014 +0,0 @@ -/* - * Copyright (C) 2002 Stichting NLnet, Netherlands, stichting@nlnet.nl. - * - * Permission to use, copy, modify, and 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 STICHTING NLNET - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * STICHTING NLNET 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. - * - * The development of Dynamically Loadable Zones (DLZ) for Bind 9 was - * conceived and contributed by Rob Butler. - * - * Permission to use, copy, modify, and 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 ROB BUTLER - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * ROB BUTLER 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. - */ - -/* - * Copyright (C) 1999-2001, 2016 Internet Systems Consortium, Inc. ("ISC") - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -#ifdef DLZ_FILESYSTEM -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include - -static dns_sdlzimplementation_t *dlz_fs = NULL; - -typedef struct config_data { - char *basedir; - int basedirsize; - char *datadir; - int datadirsize; - char *xfrdir; - int xfrdirsize; - int splitcnt; - char separator; - char pathsep; - isc_mem_t *mctx; -} config_data_t; - -typedef struct dir_entry dir_entry_t; - -struct dir_entry { - char dirpath[PATH_MAX]; - ISC_LINK(dir_entry_t) link; -}; - -typedef ISC_LIST(dir_entry_t) dlist_t; - -/* forward reference */ - -static void -fs_destroy(void *driverarg, void *dbdata); - -/* - * Private methods - */ - -static bool -is_safe(const char *input) { - unsigned int i; - unsigned int len = strlen(input); - - /* check that only allowed characters are in the domain name */ - for (i = 0; i < len; i++) { - /* '.' is allowed, but has special requirements */ - if (input[i] == '.') { - /* '.' is not allowed as first char */ - if (i == 0) { - return (false); - } - /* '..', two dots together is not allowed. */ - if (input[i - 1] == '.') { - return (false); - } - /* '.' is not allowed as last char */ - if (i == len - 1) { - return (false); - } - /* only 1 dot in ok location, continue at next char */ - continue; - } - /* '-' is allowed, continue at next char */ - if (input[i] == '-') { - continue; - } - /* 0-9 is allowed, continue at next char */ - if (input[i] >= '0' && input[i] <= '9') { - continue; - } - /* A-Z uppercase is allowed, continue at next char */ - if (input[i] >= 'A' && input[i] <= 'Z') { - continue; - } - /* a-z lowercase is allowed, continue at next char */ - if (input[i] >= 'a' && input[i] <= 'z') { - continue; - } - - /* - * colon needs to be allowed for IPV6 client - * addresses. Not dangerous in domain names, as not a - * special char. - */ - if (input[i] == ':') { - continue; - } - - /* - * '@' needs to be allowed for in zone data. Not - * dangerous in domain names, as not a special char. - */ - if (input[i] == '@') { - continue; - } - - /* - * if we reach this point we have encountered a - * disallowed char! - */ - return (false); - } - /* everything ok. */ - return (true); -} - -static void -create_path_helper(char *out, const char *in, config_data_t *cd) { - char *tmpString; - char *tmpPtr; - int i; - - tmpString = isc_mem_strdup(named_g_mctx, in); - - /* - * don't forget is_safe guarantees '.' will NOT be the - * first/last char - */ - while ((tmpPtr = strrchr(tmpString, '.')) != NULL) { - i = 0; - while (tmpPtr[i + 1] != '\0') { - if (cd->splitcnt < 1) { - strcat(out, (char *)&tmpPtr[i + 1]); - } else { - strncat(out, (char *)&tmpPtr[i + 1], - cd->splitcnt); - } - strncat(out, (char *)&cd->pathsep, 1); - if (cd->splitcnt == 0) { - break; - } - if (strlen((char *)&tmpPtr[i + 1]) <= - (unsigned int)cd->splitcnt) { - break; - } - i += cd->splitcnt; - } - tmpPtr[0] = '\0'; - } - - /* handle the "first" label properly */ - i = 0; - tmpPtr = tmpString; - while (tmpPtr[i] != '\0') { - if (cd->splitcnt < 1) { - strcat(out, (char *)&tmpPtr[i]); - } else { - strncat(out, (char *)&tmpPtr[i], cd->splitcnt); - } - strncat(out, (char *)&cd->pathsep, 1); - if (cd->splitcnt == 0) { - break; - } - if (strlen((char *)&tmpPtr[i]) <= (unsigned int)cd->splitcnt) { - break; - } - i += cd->splitcnt; - } - - isc_mem_free(named_g_mctx, tmpString); -} - -/*% - * Checks to make sure zone and host are safe. If safe, then - * hashes zone and host strings to build a path. If zone / host - * are not safe an error is returned. - */ - -static isc_result_t -create_path(const char *zone, const char *host, const char *client, - config_data_t *cd, char **path) { - char *tmpPath; - int pathsize; - int len; - bool isroot = false; - - /* we require a zone & cd parameter */ - REQUIRE(zone != NULL); - REQUIRE(cd != NULL); - /* require path to be a pointer to NULL */ - REQUIRE(path != NULL && *path == NULL); - /* - * client and host may both be NULL, but they can't both be - * NON-NULL - */ - REQUIRE((host == NULL && client == NULL) || - (host != NULL && client == NULL) || - (host == NULL && client != NULL)); - - /* special case for root zone */ - if (strcmp(zone, ".") == 0) { - isroot = true; - } - - /* if the requested zone is "unsafe", return error */ - if (!isroot && !is_safe(zone)) { - return (ISC_R_FAILURE); - } - - /* if host was passed, verify that it is safe */ - if (host != NULL && !is_safe(host)) { - return (ISC_R_FAILURE); - } - - /* if client was passed, verify that it is safe */ - if (client != NULL && !is_safe(client)) { - return (ISC_R_FAILURE); - } - - /* Determine how much memory the split up string will require */ - if (host != NULL) { - len = strlen(zone) + strlen(host); - } else if (client != NULL) { - len = strlen(zone) + strlen(client); - } else { - len = strlen(zone); - } - - /* - * even though datadir and xfrdir will never be in the same - * string we only waste a few bytes by allocating for both, - * and then we are safe from buffer overruns. - */ - pathsize = len + cd->basedirsize + cd->datadirsize + cd->xfrdirsize + 4; - - /* if we are splitting names, we will need extra space. */ - if (cd->splitcnt > 0) { - pathsize += len / cd->splitcnt; - } - - tmpPath = isc_mem_allocate(named_g_mctx, pathsize * sizeof(char)); - - /* - * build path string. - * start out with base directory. - */ - strcpy(tmpPath, cd->basedir); - - /* add zone name - parsed properly */ - if (!isroot) { - create_path_helper(tmpPath, zone, cd); - } - - /* - * When neither client or host is passed we are building a - * path to see if a zone is supported. We require that a zone - * path have the "data dir" directory contained within it so - * that we know this zone is really supported. Otherwise, - * this zone may not really be supported because we are - * supporting a delagated sub zone. - * - * Example: - * - * We are supporting long.domain.com and using a splitcnt of - * 0. the base dir is "/base-dir/" and the data dir is - * "/.datadir" We want to see if we are authoritative for - * domain.com. Path /base-dir/com/domain/.datadir since - * /base-dir/com/domain/.datadir does not exist, we are not - * authoritative for the domain "domain.com". However we are - * authoritative for the domain "long.domain.com" because the - * path /base-dir/com/domain/long/.datadir does exist! - */ - - /* if client is passed append xfr dir, otherwise append data dir */ - if (client != NULL) { - strcat(tmpPath, cd->xfrdir); - strncat(tmpPath, (char *)&cd->pathsep, 1); - strcat(tmpPath, client); - } else { - strcat(tmpPath, cd->datadir); - } - - /* if host not null, add it. */ - if (host != NULL) { - strncat(tmpPath, (char *)&cd->pathsep, 1); - create_path_helper(tmpPath, host, cd); - } - - /* return the path we built. */ - *path = tmpPath; - - return (ISC_R_SUCCESS); -} - -static isc_result_t -process_dir(isc_dir_t *dir, void *passback, config_data_t *cd, - dlist_t *dir_list, unsigned int basedirlen) { - char tmp[PATH_MAX + NAME_MAX]; - int astPos; - struct stat sb; - isc_result_t result = ISC_R_FAILURE; - char *endp; - char *type; - char *ttlStr; - char *data; - char host[NAME_MAX]; - char *tmpString; - char *tmpPtr; - int ttl; - int i; - int len; - dir_entry_t *direntry; - bool foundHost; - - tmp[0] = '\0'; /* set 1st byte to '\0' so strcpy works right. */ - host[0] = '\0'; - foundHost = false; - - /* copy base directory name to tmp. */ - strcpy(tmp, dir->dirname); - - /* dir->dirname will always have '*' as the last char. */ - astPos = strlen(dir->dirname) - 1; - - /* if dir_list != NULL, were are performing a zone xfr */ - if (dir_list != NULL) { - /* if splitcnt == 0, determine host from path. */ - if (cd->splitcnt == 0) { - if (strlen(tmp) - 3 > basedirlen) { - tmp[astPos - 1] = '\0'; - tmpString = (char *)&tmp[basedirlen + 1]; - /* handle filesystem's special wildcard "-" */ - if (strcmp(tmpString, "-") == 0) { - strcpy(host, "*"); - } else { - /* - * not special wildcard -- normal name - */ - while ((tmpPtr = strrchr( - tmpString, - cd->pathsep)) != NULL) { - if ((strlen(host) + - strlen(tmpPtr + 1) + 2) > - NAME_MAX) { - continue; - } - strcat(host, tmpPtr + 1); - strcat(host, "."); - tmpPtr[0] = '\0'; - } - if ((strlen(host) + strlen(tmpString) + - 1) <= NAME_MAX) { - strcat(host, tmpString); - } - } - - foundHost = true; - /* set tmp again for use later */ - strcpy(tmp, dir->dirname); - } - } else { - /* - * if splitcnt != 0 determine host from - * ".host" directory entry - */ - while (isc_dir_read(dir) == ISC_R_SUCCESS) { - if (strncasecmp(".host", dir->entry.name, 5) == - 0) { - /* - * handle filesystem's special - * wildcard "-" - */ - if (strcmp((char *)&dir->entry.name[6], - "-") == 0) { - strlcpy(host, "*", - sizeof(host)); - } else { - strlcpy(host, - (char *)&dir->entry - .name[6], - sizeof(host)); - } - foundHost = true; - break; - } - } - /* reset dir list for use later */ - isc_dir_reset(dir); - } /* end of else */ - } - - while (isc_dir_read(dir) == ISC_R_SUCCESS) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(1), - "Filesystem driver Dir name:" - " '%s' Dir entry: '%s'\n", - dir->dirname, dir->entry.name); - - /* skip any entries starting with "." */ - if (dir->entry.name[0] == '.') { - continue; - } - - /* - * get rid of '*', set to NULL. Effectively trims - * string from previous loop to base directory only - * while still leaving memory for concat to be - * performed next. - */ - - tmp[astPos] = '\0'; - - /* add name to base directory name. */ - strcat(tmp, dir->entry.name); - - /* make sure we can stat entry */ - if (stat(tmp, &sb) == 0) { - /* if entry is a directory */ - if ((sb.st_mode & S_IFDIR) != 0) { - /* - * if dir list is NOT NULL, add dir to - * dir list - */ - if (dir_list != NULL) { - direntry = isc_mem_get( - named_g_mctx, - sizeof(dir_entry_t)); - strcpy(direntry->dirpath, tmp); - ISC_LINK_INIT(direntry, link); - ISC_LIST_APPEND(*dir_list, direntry, - link); - result = ISC_R_SUCCESS; - } - continue; - - /* - * if entry is a file be sure we do - * not add entry to DNS results if we - * are performing a zone xfr and we - * could not find a host entry. - */ - } else if (dir_list != NULL && !foundHost) { - continue; - } - } else { /* if we cannot stat entry, skip it. */ - continue; - } - - type = dir->entry.name; - ttlStr = strchr(type, cd->separator); - if (ttlStr == NULL) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Filesystem driver: " - "%s could not be parsed properly", - tmp); - return (ISC_R_FAILURE); - } - - /* replace separator char with NULL to split string */ - ttlStr[0] = '\0'; - /* start string after NULL of previous string */ - ttlStr = (char *)&ttlStr[1]; - - data = strchr(ttlStr, cd->separator); - if (data == NULL) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Filesystem driver: " - "%s could not be parsed properly", - tmp); - return (ISC_R_FAILURE); - } - - /* replace separator char with NULL to split string */ - data[0] = '\0'; - - /* start string after NULL of previous string */ - data = (char *)&data[1]; - - /* replace all cd->separator chars with a space. */ - len = strlen(data); - - for (i = 0; i < len; i++) { - if (data[i] == cd->separator) { - data[i] = ' '; - } - } - - /* convert text to int, make sure it worked right */ - ttl = strtol(ttlStr, &endp, 10); - if (*endp != '\0' || ttl < 0) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Filesystem driver " - "ttl must be a positive number"); - } - - /* pass data back to Bind */ - if (dir_list == NULL) { - result = dns_sdlz_putrr((dns_sdlzlookup_t *)passback, - type, ttl, data); - } else { - result = dns_sdlz_putnamedrr( - (dns_sdlzallnodes_t *)passback, (char *)host, - type, ttl, data); - } - - /* if error, return error right away */ - if (result != ISC_R_SUCCESS) { - return (result); - } - } /* end of while loop */ - - return (result); -} - -/* - * SDLZ interface methods - */ - -static isc_result_t -fs_allowzonexfr(void *driverarg, void *dbdata, const char *name, - const char *client) { - isc_result_t result; - char *path; - struct stat sb; - config_data_t *cd; - path = NULL; - - UNUSED(driverarg); - - cd = (config_data_t *)dbdata; - - if (create_path(name, NULL, client, cd, &path) != ISC_R_SUCCESS) { - return (ISC_R_NOTFOUND); - } - - if (stat(path, &sb) != 0) { - result = ISC_R_NOTFOUND; - goto complete_AXFR; - } - - if ((sb.st_mode & S_IFREG) != 0) { - result = ISC_R_SUCCESS; - goto complete_AXFR; - } - - result = ISC_R_NOTFOUND; - -complete_AXFR: - isc_mem_free(named_g_mctx, path); - return (result); -} - -static isc_result_t -fs_allnodes(const char *zone, void *driverarg, void *dbdata, - dns_sdlzallnodes_t *allnodes) { - isc_result_t result; - dlist_t *dir_list; - config_data_t *cd; - char *basepath; - unsigned int basepathlen; - struct stat sb; - isc_dir_t dir; - dir_entry_t *dir_entry; - dir_entry_t *next_de; - - basepath = NULL; - dir_list = NULL; - - UNUSED(driverarg); - UNUSED(allnodes); - - cd = (config_data_t *)dbdata; - - /* allocate memory for list */ - dir_list = isc_mem_get(named_g_mctx, sizeof(dlist_t)); - - /* initialize list */ - ISC_LIST_INIT(*dir_list); - - if (create_path(zone, NULL, NULL, cd, &basepath) != ISC_R_SUCCESS) { - result = ISC_R_NOTFOUND; - goto complete_allnds; - } - - /* remove path separator at end of path so stat works properly */ - basepathlen = strlen(basepath); - - if (stat(basepath, &sb) != 0) { - result = ISC_R_NOTFOUND; - goto complete_allnds; - } - - if ((sb.st_mode & S_IFDIR) == 0) { - result = ISC_R_NOTFOUND; - goto complete_allnds; - } - - /* initialize and open directory */ - isc_dir_init(&dir); - result = isc_dir_open(&dir, basepath); - - /* if directory open failed, return error. */ - if (result != ISC_R_SUCCESS) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Unable to open %s directory to read entries.", - basepath); - result = ISC_R_FAILURE; - goto complete_allnds; - } - - /* process the directory */ - result = process_dir(&dir, allnodes, cd, dir_list, basepathlen); - - /* close the directory */ - isc_dir_close(&dir); - - if (result != ISC_R_SUCCESS) { - goto complete_allnds; - } - - /* get first dir entry from list. */ - dir_entry = ISC_LIST_HEAD(*dir_list); - while (dir_entry != NULL) { - result = isc_dir_open(&dir, dir_entry->dirpath); - /* if directory open failed, return error. */ - if (result != ISC_R_SUCCESS) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Unable to open %s " - "directory to read entries.", - basepath); - result = ISC_R_FAILURE; - goto complete_allnds; - } - - /* process the directory */ - result = process_dir(&dir, allnodes, cd, dir_list, basepathlen); - - /* close the directory */ - isc_dir_close(&dir); - - if (result != ISC_R_SUCCESS) { - goto complete_allnds; - } - - dir_entry = ISC_LIST_NEXT(dir_entry, link); - } /* end while */ - -complete_allnds: - /* clean up entries from list. */ - dir_entry = ISC_LIST_HEAD(*dir_list); - while (dir_entry != NULL) { - next_de = ISC_LIST_NEXT(dir_entry, link); - isc_mem_put(named_g_mctx, dir_entry, sizeof(dir_entry_t)); - dir_entry = next_de; - } /* end while */ - isc_mem_put(named_g_mctx, dir_list, sizeof(dlist_t)); - - if (basepath != NULL) { - isc_mem_free(named_g_mctx, basepath); - } - - return (result); -} - -static isc_result_t -fs_findzone(void *driverarg, void *dbdata, const char *name, - dns_clientinfomethods_t *methods, dns_clientinfo_t *clientinfo) { - isc_result_t result; - char *path; - struct stat sb; - path = NULL; - - UNUSED(driverarg); - UNUSED(methods); - UNUSED(clientinfo); - - if (create_path(name, NULL, NULL, (config_data_t *)dbdata, &path) != - ISC_R_SUCCESS) - { - return (ISC_R_NOTFOUND); - } - - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_DEBUG(1), - "Filesystem driver Findzone() Checking for path: '%s'\n", - path); - - if (stat(path, &sb) != 0) { - result = ISC_R_NOTFOUND; - goto complete_FZ; - } - - if ((sb.st_mode & S_IFDIR) != 0) { - result = ISC_R_SUCCESS; - goto complete_FZ; - } - - result = ISC_R_NOTFOUND; - -complete_FZ: - - isc_mem_free(named_g_mctx, path); - return (result); -} - -static isc_result_t -fs_lookup(const char *zone, const char *name, void *driverarg, void *dbdata, - dns_sdlzlookup_t *lookup, dns_clientinfomethods_t *methods, - dns_clientinfo_t *clientinfo) { - isc_result_t result; - char *path; - struct stat sb; - isc_dir_t dir; - path = NULL; - - UNUSED(driverarg); - UNUSED(lookup); - UNUSED(methods); - UNUSED(clientinfo); - - if (strcmp(name, "*") == 0) { - /* - * handle filesystem's special wildcard "-" - */ - result = create_path(zone, "-", NULL, (config_data_t *)dbdata, - &path); - } else { - result = create_path(zone, name, NULL, (config_data_t *)dbdata, - &path); - } - - if (result != ISC_R_SUCCESS) { - return (ISC_R_NOTFOUND); - } - - /* remove path separator at end of path so stat works properly */ - path[strlen(path) - 1] = '\0'; - - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_DEBUG(1), - "Filesystem driver lookup() Checking for path: '%s'\n", - path); - - if (stat(path, &sb) != 0) { - result = ISC_R_NOTFOUND; - goto complete_lkup; - } - - if ((sb.st_mode & S_IFDIR) == 0) { - result = ISC_R_NOTFOUND; - goto complete_lkup; - } - - /* initialize and open directory */ - isc_dir_init(&dir); - result = isc_dir_open(&dir, path); - - /* if directory open failed, return error. */ - if (result != ISC_R_SUCCESS) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Unable to open %s directory to read entries.", - path); - result = ISC_R_FAILURE; - goto complete_lkup; - } - - /* process any records in the directory */ - result = process_dir(&dir, lookup, (config_data_t *)dbdata, NULL, 0); - - /* close the directory */ - isc_dir_close(&dir); - -complete_lkup: - - isc_mem_free(named_g_mctx, path); - return (result); -} - -static isc_result_t -fs_create(const char *dlzname, unsigned int argc, char *argv[], void *driverarg, - void **dbdata) { - config_data_t *cd; - char *endp; - int len; - char pathsep; - - UNUSED(driverarg); - UNUSED(dlzname); - - /* we require 5 command line args. */ - if (argc != 6) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Filesystem driver requires " - "6 command line args."); - return (ISC_R_FAILURE); - } - - if (strlen(argv[5]) > 1) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Filesystem driver can only " - "accept a single character for separator."); - return (ISC_R_FAILURE); - } - - /* verify base dir ends with '/' or '\' */ - len = strlen(argv[1]); - if (argv[1][len - 1] != '\\' && argv[1][len - 1] != '/') { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Base dir parameter for filesystem driver " - "should end with %s", - "either '/' or '\\' "); - return (ISC_R_FAILURE); - } - - /* determine and save path separator for later */ - if (argv[1][len - 1] == '\\') { - pathsep = '\\'; - } else { - pathsep = '/'; - } - - /* allocate memory for our config data */ - cd = isc_mem_get(named_g_mctx, sizeof(config_data_t)); - - /* zero the memory */ - memset(cd, 0, sizeof(config_data_t)); - - cd->pathsep = pathsep; - - /* get and store our base directory */ - cd->basedir = isc_mem_strdup(named_g_mctx, argv[1]); - cd->basedirsize = strlen(cd->basedir); - - /* get and store our data sub-dir */ - cd->datadir = isc_mem_strdup(named_g_mctx, argv[2]); - cd->datadirsize = strlen(cd->datadir); - - /* get and store our zone xfr sub-dir */ - cd->xfrdir = isc_mem_strdup(named_g_mctx, argv[3]); - cd->xfrdirsize = strlen(cd->xfrdir); - - /* get and store our directory split count */ - cd->splitcnt = strtol(argv[4], &endp, 10); - if (*endp != '\0' || cd->splitcnt < 0) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Directory split count must be zero (0) " - "or a positive number"); - } - - /* get and store our separator character */ - cd->separator = *argv[5]; - - /* attach config data to memory context */ - isc_mem_attach(named_g_mctx, &cd->mctx); - - /* pass back config data */ - *dbdata = cd; - - /* return success */ - return (ISC_R_SUCCESS); -} - -static void -fs_destroy(void *driverarg, void *dbdata) { - isc_mem_t *mctx; - config_data_t *cd; - - UNUSED(driverarg); - - cd = (config_data_t *)dbdata; - - /* - * free memory for each section of config data that was - * allocated - */ - if (cd->basedir != NULL) { - isc_mem_free(named_g_mctx, cd->basedir); - } - - if (cd->datadir != NULL) { - isc_mem_free(named_g_mctx, cd->datadir); - } - - if (cd->xfrdir != NULL) { - isc_mem_free(named_g_mctx, cd->xfrdir); - } - - /* hold memory context to use later */ - mctx = cd->mctx; - - /* free config data memory */ - isc_mem_putanddetach(&mctx, cd, sizeof(config_data_t)); -} - -static dns_sdlzmethods_t dlz_fs_methods = { - fs_create, - fs_destroy, - fs_findzone, - fs_lookup, - NULL, - fs_allnodes, - fs_allowzonexfr, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, -}; - -/*% - * Wrapper around dns_sdlzregister(). - */ -isc_result_t -dlz_fs_init(void) { - isc_result_t result; - - /* - * Write debugging message to log - */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_DEBUG(2), "Registering DLZ filesystem driver."); - - result = dns_sdlzregister("filesystem", &dlz_fs_methods, NULL, - DNS_SDLZFLAG_RELATIVEOWNER | - DNS_SDLZFLAG_RELATIVERDATA, - named_g_mctx, &dlz_fs); - if (result != ISC_R_SUCCESS) { - UNEXPECTED_ERROR(__FILE__, __LINE__, - "dns_sdlzregister() failed: %s", - isc_result_totext(result)); - result = ISC_R_UNEXPECTED; - } - - return (result); -} - -/*% - * Wrapper around dns_sdlzunregister(). - */ -void -dlz_fs_clear(void) { - /* - * Write debugging message to log - */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_DEBUG(2), "Unregistering DLZ filesystem driver."); - - if (dlz_fs != NULL) { - dns_sdlzunregister(&dlz_fs); - } -} - -#endif /* ifdef DLZ_FILESYSTEM */ diff --git a/contrib/dlz/drivers/dlz_ldap_driver.c b/contrib/dlz/drivers/dlz_ldap_driver.c deleted file mode 100644 index 637d8e8c97..0000000000 --- a/contrib/dlz/drivers/dlz_ldap_driver.c +++ /dev/null @@ -1,1233 +0,0 @@ -/* - * Copyright (C) 2002 Stichting NLnet, Netherlands, stichting@nlnet.nl. - * - * Permission to use, copy, modify, and 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 STICHTING NLNET - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * STICHTING NLNET 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. - * - * The development of Dynamically Loadable Zones (DLZ) for BIND 9 was - * conceived and contributed by Rob Butler. - * - * Permission to use, copy, modify, and 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 ROB BUTLER - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * ROB BUTLER 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. - */ - -/* - * Copyright (C) 1999-2001, 2016 Internet Systems Consortium, Inc. ("ISC") - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -#ifdef DLZ_LDAP -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include - -/* - * Need older API functions from ldap.h. - */ -#define LDAP_DEPRECATED 1 - -#include - -#define SIMPLE "simple" -#define KRB41 "krb41" -#define KRB42 "krb42" -#define V2 "v2" -#define V3 "v3" - -static dns_sdlzimplementation_t *dlz_ldap = NULL; - -#define dbc_search_limit 30 -#define ALLNODES 1 -#define ALLOWXFR 2 -#define AUTHORITY 3 -#define FINDZONE 4 -#define LOOKUP 5 - -/*% - * Structure to hold everything needed by this "instance" of the LDAP - * driver remember, the driver code is only loaded once, but may have - * many separate instances. - */ - -typedef struct { - db_list_t *db; /*%< handle to a list of DB */ - int method; /*%< security authentication method */ - char *user; /*%< who is authenticating */ - char *cred; /*%< password for simple authentication method */ - int protocol; /*%< LDAP communication protocol version */ - char *hosts; /*%< LDAP server hosts */ -} ldap_instance_t; - -/* forward references */ - -static isc_result_t -dlz_ldap_findzone(void *driverarg, void *dbdata, const char *name, - dns_clientinfomethods_t *methods, - dns_clientinfo_t *clientinfo); - -static void -dlz_ldap_destroy(void *driverarg, void *dbdata); - -/* - * Private methods - */ - -/*% checks that the LDAP URL parameters make sense */ -static isc_result_t -dlz_ldap_checkURL(char *URL, int attrCnt, const char *msg) { - isc_result_t result = ISC_R_SUCCESS; - int ldap_result; - LDAPURLDesc *ldap_url = NULL; - - if (!ldap_is_ldap_url(URL)) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "%s query is not a valid LDAP URL", msg); - result = ISC_R_FAILURE; - goto cleanup; - } - - ldap_result = ldap_url_parse(URL, &ldap_url); - if (ldap_result != LDAP_SUCCESS || ldap_url == NULL) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "parsing %s query failed", msg); - result = ISC_R_FAILURE; - goto cleanup; - } - - if (ldap_count_values(ldap_url->lud_attrs) < attrCnt) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "%s query must specify at least " - "%d attributes to return", - msg, attrCnt); - result = ISC_R_FAILURE; - goto cleanup; - } - - if (ldap_url->lud_host != NULL) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "%s query must not specify a host", msg); - result = ISC_R_FAILURE; - goto cleanup; - } - - if (ldap_url->lud_port != 389) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "%s query must not specify a port", msg); - result = ISC_R_FAILURE; - goto cleanup; - } - - if (ldap_url->lud_dn == NULL || strlen(ldap_url->lud_dn) < 1) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "%s query must specify a search base", msg); - result = ISC_R_FAILURE; - goto cleanup; - } - - if (ldap_url->lud_exts != NULL || ldap_url->lud_crit_exts != 0) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "%s uses extensions. " - "The driver does not support LDAP extensions.", - msg); - result = ISC_R_FAILURE; - goto cleanup; - } - -cleanup: - if (ldap_url != NULL) { - ldap_free_urldesc(ldap_url); - } - - return (result); -} - -/*% Connects / reconnects to LDAP server */ -static isc_result_t -dlz_ldap_connect(ldap_instance_t *dbi, dbinstance_t *dbc) { - isc_result_t result; - int ldap_result; - - /* if we have a connection, get ride of it. */ - if (dbc->dbconn != NULL) { - ldap_unbind_s((LDAP *)dbc->dbconn); - dbc->dbconn = NULL; - } - - /* now connect / reconnect. */ - - /* initialize. */ - dbc->dbconn = ldap_init(dbi->hosts, LDAP_PORT); - if (dbc->dbconn == NULL) { - return (ISC_R_NOMEMORY); - } - - /* set protocol version. */ - ldap_result = ldap_set_option((LDAP *)dbc->dbconn, - LDAP_OPT_PROTOCOL_VERSION, - &(dbi->protocol)); - if (ldap_result != LDAP_SUCCESS) { - result = ISC_R_NOPERM; - goto cleanup; - } - - /* "bind" to server. i.e. send username / pass */ - ldap_result = ldap_bind_s((LDAP *)dbc->dbconn, dbi->user, dbi->cred, - dbi->method); - if (ldap_result != LDAP_SUCCESS) { - result = ISC_R_FAILURE; - goto cleanup; - } - - return (ISC_R_SUCCESS); - -cleanup: - - /* cleanup if failure. */ - if (dbc->dbconn != NULL) { - ldap_unbind_s((LDAP *)dbc->dbconn); - dbc->dbconn = NULL; - } - - return (result); -} - -/*% - * Properly cleans up a list of database instances. - * This function is only used when the driver is compiled for - * multithreaded operation. - */ -static void -ldap_destroy_dblist(db_list_t *dblist) { - dbinstance_t *ndbi = NULL; - dbinstance_t *dbi = NULL; - - /* get the first DBI in the list */ - ndbi = ISC_LIST_HEAD(*dblist); - - /* loop through the list */ - while (ndbi != NULL) { - dbi = ndbi; - /* get the next DBI in the list */ - ndbi = ISC_LIST_NEXT(dbi, link); - /* release DB connection */ - if (dbi->dbconn != NULL) { - ldap_unbind_s((LDAP *)dbi->dbconn); - } - /* release all memory that comprised a DBI */ - destroy_sqldbinstance(dbi); - } - /* release memory for the list structure */ - isc_mem_put(named_g_mctx, dblist, sizeof(db_list_t)); -} - -/*% - * Loops through the list of DB instances, attempting to lock - * on the mutex. If successful, the DBI is reserved for use - * and the thread can perform queries against the database. - * If the lock fails, the next one in the list is tried. - * looping continues until a lock is obtained, or until - * the list has been searched dbc_search_limit times. - * This function is only used when the driver is compiled for - * multithreaded operation. - */ -static dbinstance_t * -ldap_find_avail_conn(db_list_t *dblist) { - dbinstance_t *dbi = NULL; - dbinstance_t *head; - int count = 0; - - /* get top of list */ - head = dbi = ISC_LIST_HEAD(*dblist); - - /* loop through list */ - while (count < dbc_search_limit) { - /* try to lock on the mutex */ - if (isc_mutex_trylock(&dbi->instance_lock) == ISC_R_SUCCESS) { - return (dbi); /* success, return the DBI for use. */ - } - /* not successful, keep trying */ - dbi = ISC_LIST_NEXT(dbi, link); - - /* check to see if we have gone to the top of the list. */ - if (dbi == NULL) { - count++; - dbi = head; - } - } - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_INFO, - "LDAP driver unable to find available connection " - "after searching %d times", - count); - return (NULL); -} - -static isc_result_t -ldap_process_results(LDAP *dbc, LDAPMessage *msg, char **attrs, void *ptr, - bool allnodes) { - isc_result_t result = ISC_R_SUCCESS; - int i = 0; - int j; - int len; - char *attribute = NULL; - LDAPMessage *entry; - char *endp = NULL; - char *host = NULL; - char *type = NULL; - char *data = NULL; - char **vals = NULL; - int ttl; - - /* make sure there are at least some attributes to process. */ - REQUIRE(attrs != NULL || attrs[0] != NULL); - - /* get the first entry to process */ - entry = ldap_first_entry(dbc, msg); - if (entry == NULL) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_INFO, - "LDAP no entries to process."); - return (ISC_R_FAILURE); - } - - /* loop through all entries returned */ - while (entry != NULL) { - /* reset for this loop */ - ttl = 0; - len = 0; - i = 0; - attribute = attrs[i]; - - /* determine how much space we need for data string */ - for (j = 0; attrs[j] != NULL; j++) { - /* get the list of values for this attribute. */ - vals = ldap_get_values(dbc, entry, attrs[j]); - /* skip empty attributes. */ - if (vals == NULL || ldap_count_values(vals) < 1) { - continue; - } - /* - * we only use the first value. this driver - * does not support multi-valued attributes. - */ - len = len + strlen(vals[0]) + 1; - /* free vals for next loop */ - ldap_value_free(vals); - } /* end for (j = 0; attrs[j] != NULL, j++) loop */ - - /* allocate memory for data string */ - data = isc_mem_allocate(named_g_mctx, len + 1); - - /* - * Make sure data is null termed at the beginning so - * we can check if any data was stored to it later. - */ - data[0] = '\0'; - - /* reset j to re-use below */ - j = 0; - - /* loop through the attributes in the order specified. */ - while (attribute != NULL) { - /* get the list of values for this attribute. */ - vals = ldap_get_values(dbc, entry, attribute); - - /* skip empty attributes. */ - if (vals == NULL || vals[0] == NULL) { - /* increment attribute pointer */ - attribute = attrs[++i]; - /* start loop over */ - continue; - } - - /* - * j initially = 0. Increment j each time we - * set a field that way next loop will set - * next field. - */ - switch (j) { - case 0: - j++; - /* - * convert text to int, make sure it - * worked right - */ - ttl = strtol(vals[0], &endp, 10); - if (*endp != '\0' || ttl < 0) { - isc_log_write(dns_lctx, - DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, - ISC_LOG_ERROR, - "LDAP driver ttl must " - "be a positive number"); - goto cleanup; - } - break; - case 1: - j++; - type = isc_mem_strdup(named_g_mctx, vals[0]); - break; - case 2: - j++; - if (allnodes) { - host = isc_mem_strdup(named_g_mctx, - vals[0]); - } else { - strcpy(data, vals[0]); - } - break; - case 3: - j++; - if (allnodes) { - strcpy(data, vals[0]); - } else { - strcat(data, " "); - strcat(data, vals[0]); - } - break; - default: - strcat(data, " "); - strcat(data, vals[0]); - break; - } /* end switch(j) */ - - /* free values */ - ldap_value_free(vals); - vals = NULL; - - /* increment attribute pointer */ - attribute = attrs[++i]; - } /* end while (attribute != NULL) */ - - if (type == NULL) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "LDAP driver unable " - "to retrieve DNS type"); - result = ISC_R_FAILURE; - goto cleanup; - } - - if (strlen(data) < 1) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "LDAP driver unable " - "to retrieve DNS data"); - result = ISC_R_FAILURE; - goto cleanup; - } - - if (allnodes && host != NULL) { - if (strcasecmp(host, "~") == 0) { - result = dns_sdlz_putnamedrr( - (dns_sdlzallnodes_t *)ptr, "*", type, - ttl, data); - } else { - result = dns_sdlz_putnamedrr( - (dns_sdlzallnodes_t *)ptr, host, type, - ttl, data); - } - if (result != ISC_R_SUCCESS) { - isc_log_write(dns_lctx, - DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "dlz-ldap: putnamedrr failed " - "for \"%s %s %u %s\", %s", - host, type, ttl, data, - isc_result_totext(result)); - } - } else { - result = dns_sdlz_putrr((dns_sdlzlookup_t *)ptr, type, - ttl, data); - if (result != ISC_R_SUCCESS) { - isc_log_write(dns_lctx, - DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "dlz-ldap: putrr failed " - "for \"%s %u %s\", %s", - type, ttl, data, - isc_result_totext(result)); - } - } - - if (result != ISC_R_SUCCESS) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "LDAP driver failed " - "while sending data to BIND."); - goto cleanup; - } - - /* free memory for type, data and host for next loop */ - isc_mem_free(named_g_mctx, type); - isc_mem_free(named_g_mctx, data); - if (host != NULL) { - isc_mem_free(named_g_mctx, host); - } - - /* get the next entry to process */ - entry = ldap_next_entry(dbc, entry); - } /* end while (entry != NULL) */ - -cleanup: - /* de-allocate memory */ - if (vals != NULL) { - ldap_value_free(vals); - } - if (host != NULL) { - isc_mem_free(named_g_mctx, host); - } - if (type != NULL) { - isc_mem_free(named_g_mctx, type); - } - if (data != NULL) { - isc_mem_free(named_g_mctx, data); - } - - return (result); -} - -/*% - * This function is the real core of the driver. Zone, record - * and client strings are passed in (or NULL is passed if the - * string is not available). The type of query we want to run - * is indicated by the query flag, and the dbdata object is passed - * passed in to. dbdata really holds either: - * 1) a list of database instances (in multithreaded mode) OR - * 2) a single database instance (in single threaded mode) - * The function will construct the query and obtain an available - * database instance (DBI). It will then run the query and hopefully - * obtain a result set. - */ -static isc_result_t -ldap_get_results(const char *zone, const char *record, const char *client, - unsigned int query, void *dbdata, void *ptr) { - isc_result_t result; - dbinstance_t *dbi = NULL; - char *querystring = NULL; - LDAPURLDesc *ldap_url = NULL; - int ldap_result = 0; - LDAPMessage *ldap_msg = NULL; - int i; - int entries; - - /* get db instance / connection */ - /* find an available DBI from the list */ - dbi = ldap_find_avail_conn( - (db_list_t *)((ldap_instance_t *)dbdata)->db); - - /* if DBI is null, can't do anything else */ - if (dbi == NULL) { - return (ISC_R_FAILURE); - } - - /* set fields */ - if (zone != NULL) { - dbi->zone = isc_mem_strdup(named_g_mctx, zone); - } else { - dbi->zone = NULL; - } - if (record != NULL) { - dbi->record = isc_mem_strdup(named_g_mctx, record); - } else { - dbi->record = NULL; - } - if (client != NULL) { - dbi->client = isc_mem_strdup(named_g_mctx, client); - } else { - dbi->client = NULL; - } - - /* what type of query are we going to run? */ - switch (query) { - case ALLNODES: - /* - * if the query was not passed in from the config file - * then we can't run it. return not_implemented, so - * it's like the code for that operation was never - * built into the driver.... AHHH flexibility!!! - */ - if (dbi->allnodes_q == NULL) { - result = ISC_R_NOTIMPLEMENTED; - goto cleanup; - } else { - querystring = build_querystring(named_g_mctx, - dbi->allnodes_q); - } - break; - case ALLOWXFR: - /* same as comments as ALLNODES */ - if (dbi->allowxfr_q == NULL) { - result = ISC_R_NOTIMPLEMENTED; - goto cleanup; - } else { - querystring = build_querystring(named_g_mctx, - dbi->allowxfr_q); - } - break; - case AUTHORITY: - /* same as comments as ALLNODES */ - if (dbi->authority_q == NULL) { - result = ISC_R_NOTIMPLEMENTED; - goto cleanup; - } else { - querystring = build_querystring(named_g_mctx, - dbi->authority_q); - } - break; - case FINDZONE: - /* this is required. It's the whole point of DLZ! */ - if (dbi->findzone_q == NULL) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(2), - "No query specified for findzone. " - "Findzone requires a query"); - result = ISC_R_FAILURE; - goto cleanup; - } else { - querystring = build_querystring(named_g_mctx, - dbi->findzone_q); - } - break; - case LOOKUP: - /* this is required. It's also a major point of DLZ! */ - if (dbi->lookup_q == NULL) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(2), - "No query specified for lookup. " - "Lookup requires a query"); - result = ISC_R_FAILURE; - goto cleanup; - } else { - querystring = build_querystring(named_g_mctx, - dbi->lookup_q); - } - break; - default: - /* - * this should never happen. If it does, the code is - * screwed up! - */ - UNEXPECTED_ERROR(__FILE__, __LINE__, - "Incorrect query flag passed to " - "ldap_get_results"); - result = ISC_R_UNEXPECTED; - goto cleanup; - } - - /* if the querystring is null, Bummer, outta RAM. UPGRADE TIME!!! */ - if (querystring == NULL) { - result = ISC_R_NOMEMORY; - goto cleanup; - } - - /* - * output the full query string during debug so we can see - * what lame error the query has. - */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_DEBUG(1), "\nQuery String: %s\n", querystring); - - /* break URL down into it's component parts, if error cleanup */ - ldap_result = ldap_url_parse(querystring, &ldap_url); - if (ldap_result != LDAP_SUCCESS || ldap_url == NULL) { - result = ISC_R_FAILURE; - goto cleanup; - } - - for (i = 0; i < 3; i++) { - /* - * dbi->dbconn may be null if trying to reconnect on a - * previous query failed. - */ - if (dbi->dbconn == NULL) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_INFO, - "LDAP driver attempting to re-connect"); - - result = dlz_ldap_connect((ldap_instance_t *)dbdata, - dbi); - if (result != ISC_R_SUCCESS) { - result = ISC_R_FAILURE; - continue; - } - } - - /* perform ldap search synchronously */ - ldap_result = - ldap_search_s((LDAP *)dbi->dbconn, ldap_url->lud_dn, - ldap_url->lud_scope, ldap_url->lud_filter, - ldap_url->lud_attrs, 0, &ldap_msg); - - /* - * check return code. No such object is ok, just - * didn't find what we wanted - */ - switch (ldap_result) { - case LDAP_NO_SUCH_OBJECT: - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(1), - "No object found matching " - "query requirements"); - result = ISC_R_NOTFOUND; - goto cleanup; - break; - case LDAP_SUCCESS: /* on success do nothing */ - result = ISC_R_SUCCESS; - i = 3; - break; - case LDAP_SERVER_DOWN: - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_INFO, - "LDAP driver attempting to re-connect"); - result = dlz_ldap_connect((ldap_instance_t *)dbdata, - dbi); - if (result != ISC_R_SUCCESS) { - result = ISC_R_FAILURE; - } - break; - default: - /* - * other errors not ok. Log error message and - * get out - */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "LDAP error: %s", - ldap_err2string(ldap_result)); - result = ISC_R_FAILURE; - goto cleanup; - break; - } /* close switch(ldap_result) */ - } /* end for (int i = 0 i < 3; i++) */ - - if (result != ISC_R_SUCCESS) { - goto cleanup; - } - - switch (query) { - case ALLNODES: - result = ldap_process_results((LDAP *)dbi->dbconn, ldap_msg, - ldap_url->lud_attrs, ptr, true); - break; - case AUTHORITY: - case LOOKUP: - result = ldap_process_results((LDAP *)dbi->dbconn, ldap_msg, - ldap_url->lud_attrs, ptr, false); - break; - case ALLOWXFR: - entries = ldap_count_entries((LDAP *)dbi->dbconn, ldap_msg); - if (entries == 0) { - result = ISC_R_NOPERM; - } else if (entries > 0) { - result = ISC_R_SUCCESS; - } else { - result = ISC_R_FAILURE; - } - break; - case FINDZONE: - entries = ldap_count_entries((LDAP *)dbi->dbconn, ldap_msg); - if (entries == 0) { - result = ISC_R_NOTFOUND; - } else if (entries > 0) { - result = ISC_R_SUCCESS; - } else { - result = ISC_R_FAILURE; - } - break; - default: - /* - * this should never happen. If it does, the code is - * screwed up! - */ - UNEXPECTED_ERROR(__FILE__, __LINE__, - "Incorrect query flag passed to " - "ldap_get_results"); - result = ISC_R_UNEXPECTED; - } - -cleanup: - /* it's always good to cleanup after yourself */ - - /* if we retrieved results, free them */ - if (ldap_msg != NULL) { - ldap_msgfree(ldap_msg); - } - - if (ldap_url != NULL) { - ldap_free_urldesc(ldap_url); - } - - /* cleanup */ - if (dbi->zone != NULL) { - isc_mem_free(named_g_mctx, dbi->zone); - } - if (dbi->record != NULL) { - isc_mem_free(named_g_mctx, dbi->record); - } - if (dbi->client != NULL) { - isc_mem_free(named_g_mctx, dbi->client); - } - - /* release the lock so another thread can use this dbi */ - isc_mutex_unlock(&dbi->instance_lock); - - /* release query string */ - if (querystring != NULL) { - isc_mem_free(named_g_mctx, querystring); - } - - /* return result */ - return (result); -} - -/* - * DLZ methods - */ -static isc_result_t -dlz_ldap_allowzonexfr(void *driverarg, void *dbdata, const char *name, - const char *client) { - isc_result_t result; - - UNUSED(driverarg); - - /* check to see if we are authoritative for the zone first */ - result = dlz_ldap_findzone(driverarg, dbdata, name, NULL, NULL); - if (result != ISC_R_SUCCESS) { - return (result); - } - - /* get all the zone data */ - result = ldap_get_results(name, NULL, client, ALLOWXFR, dbdata, NULL); - return (result); -} - -static isc_result_t -dlz_ldap_allnodes(const char *zone, void *driverarg, void *dbdata, - dns_sdlzallnodes_t *allnodes) { - UNUSED(driverarg); - return (ldap_get_results(zone, NULL, NULL, ALLNODES, dbdata, allnodes)); -} - -static isc_result_t -dlz_ldap_authority(const char *zone, void *driverarg, void *dbdata, - dns_sdlzlookup_t *lookup) { - UNUSED(driverarg); - return (ldap_get_results(zone, NULL, NULL, AUTHORITY, dbdata, lookup)); -} - -static isc_result_t -dlz_ldap_findzone(void *driverarg, void *dbdata, const char *name, - dns_clientinfomethods_t *methods, - dns_clientinfo_t *clientinfo) { - UNUSED(driverarg); - UNUSED(methods); - UNUSED(clientinfo); - return (ldap_get_results(name, NULL, NULL, FINDZONE, dbdata, NULL)); -} - -static isc_result_t -dlz_ldap_lookup(const char *zone, const char *name, void *driverarg, - void *dbdata, dns_sdlzlookup_t *lookup, - dns_clientinfomethods_t *methods, - dns_clientinfo_t *clientinfo) { - isc_result_t result; - - UNUSED(driverarg); - UNUSED(methods); - UNUSED(clientinfo); - - if (strcmp(name, "*") == 0) { - result = ldap_get_results(zone, "~", NULL, LOOKUP, dbdata, - lookup); - } else { - result = ldap_get_results(zone, name, NULL, LOOKUP, dbdata, - lookup); - } - return (result); -} - -static isc_result_t -dlz_ldap_create(const char *dlzname, unsigned int argc, char *argv[], - void *driverarg, void **dbdata) { - isc_result_t result; - ldap_instance_t *ldap_inst = NULL; - dbinstance_t *dbi = NULL; - int protocol; - int method; - int dbcount; - char *endp; - /* db_list_t *dblist = NULL; */ - int i; - - UNUSED(dlzname); - UNUSED(driverarg); - - /* if debugging, let user know we are multithreaded. */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_DEBUG(1), "LDAP driver running multithreaded"); - - if (argc < 9) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "LDAP driver requires at least " - "8 command line args."); - return (ISC_R_FAILURE); - } - - /* no more than 13 arg's should be passed to the driver */ - if (argc > 12) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "LDAP driver cannot accept more than " - "11 command line args."); - return (ISC_R_FAILURE); - } - - /* determine protocol version. */ - if (strncasecmp(argv[2], V2, strlen(V2)) == 0) { - protocol = 2; - } else if (strncasecmp(argv[2], V3, strlen(V3)) == 0) { - protocol = 3; - } else { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "LDAP driver protocol must be either %s or %s", - V2, V3); - return (ISC_R_FAILURE); - } - - /* determine connection method. */ - if (strncasecmp(argv[3], SIMPLE, strlen(SIMPLE)) == 0) { - method = LDAP_AUTH_SIMPLE; - } else if (strncasecmp(argv[3], KRB41, strlen(KRB41)) == 0) { - method = LDAP_AUTH_KRBV41; - } else if (strncasecmp(argv[3], KRB42, strlen(KRB42)) == 0) { - method = LDAP_AUTH_KRBV42; - } else { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "LDAP driver authentication method must be " - "one of %s, %s or %s", - SIMPLE, KRB41, KRB42); - return (ISC_R_FAILURE); - } - - /* check how many db connections we should create */ - dbcount = strtol(argv[1], &endp, 10); - if (*endp != '\0' || dbcount < 0) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "LDAP driver database connection count " - "must be positive."); - return (ISC_R_FAILURE); - } - - /* check that LDAP URL parameters make sense */ - switch (argc) { - case 12: - result = dlz_ldap_checkURL(argv[11], 0, "allow zone transfer"); - if (result != ISC_R_SUCCESS) { - return (result); - } - case 11: - result = dlz_ldap_checkURL(argv[10], 3, "all nodes"); - if (result != ISC_R_SUCCESS) { - return (result); - } - case 10: - if (strlen(argv[9]) > 0) { - result = dlz_ldap_checkURL(argv[9], 3, "authority"); - if (result != ISC_R_SUCCESS) { - return (result); - } - } - case 9: - result = dlz_ldap_checkURL(argv[8], 3, "lookup"); - if (result != ISC_R_SUCCESS) { - return (result); - } - result = dlz_ldap_checkURL(argv[7], 0, "find zone"); - if (result != ISC_R_SUCCESS) { - return (result); - } - break; - default: - /* not really needed, should shut up compiler. */ - result = ISC_R_FAILURE; - } - - /* allocate memory for LDAP instance */ - ldap_inst = isc_mem_get(named_g_mctx, sizeof(ldap_instance_t)); - memset(ldap_inst, 0, sizeof(ldap_instance_t)); - - /* store info needed to automatically re-connect. */ - ldap_inst->protocol = protocol; - ldap_inst->method = method; - ldap_inst->hosts = isc_mem_strdup(named_g_mctx, argv[6]); - ldap_inst->user = isc_mem_strdup(named_g_mctx, argv[4]); - ldap_inst->cred = isc_mem_strdup(named_g_mctx, argv[5]); - - /* allocate memory for database connection list */ - ldap_inst->db = isc_mem_get(named_g_mctx, sizeof(db_list_t)); - - /* initialize DB connection list */ - ISC_LIST_INIT(*(ldap_inst->db)); - - /* - * create the appropriate number of database instances (DBI) - * append each new DBI to the end of the list - */ - for (i = 0; i < dbcount; i++) { - /* how many queries were passed in from config file? */ - switch (argc) { - case 9: - result = build_sqldbinstance(named_g_mctx, NULL, NULL, - NULL, argv[7], argv[8], - NULL, &dbi); - break; - case 10: - result = build_sqldbinstance(named_g_mctx, NULL, NULL, - argv[9], argv[7], argv[8], - NULL, &dbi); - break; - case 11: - result = build_sqldbinstance(named_g_mctx, argv[10], - NULL, argv[9], argv[7], - argv[8], NULL, &dbi); - break; - case 12: - result = build_sqldbinstance(named_g_mctx, argv[10], - argv[11], argv[9], argv[7], - argv[8], NULL, &dbi); - break; - default: - /* not really needed, should shut up compiler. */ - result = ISC_R_FAILURE; - } - - if (result == ISC_R_SUCCESS) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(2), - "LDAP driver created " - "database instance object."); - } else { /* unsuccessful?, log err msg and cleanup. */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "LDAP driver could not create " - "database instance object."); - goto cleanup; - } - - ISC_LINK_INIT(dbi, link); - ISC_LIST_APPEND(*(ldap_inst->db), dbi, link); - - /* attempt to connect */ - result = dlz_ldap_connect(ldap_inst, dbi); - - /* - * if db connection cannot be created, log err msg and - * cleanup. - */ - switch (result) { - /* success, do nothing */ - case ISC_R_SUCCESS: - break; - /* - * no memory means ldap_init could not - * allocate memory - */ - case ISC_R_NOMEMORY: - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "LDAP driver could not allocate memory " - "for connection number %u", - i + 1); - goto cleanup; - break; - /* - * no perm means ldap_set_option could not set - * protocol version - */ - case ISC_R_NOPERM: - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "LDAP driver could not " - "set protocol version."); - result = ISC_R_FAILURE; - goto cleanup; - break; - /* failure means couldn't connect to ldap server */ - case ISC_R_FAILURE: - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "LDAP driver could not " - "bind connection number %u to server.", - i + 1); - goto cleanup; - break; - /* - * default should never happen. If it does, - * major errors. - */ - default: - UNEXPECTED_ERROR(__FILE__, __LINE__, - "dlz_ldap_create() failed: %s", - isc_result_totext(result)); - result = ISC_R_UNEXPECTED; - goto cleanup; - break; - } /* end switch(result) */ - - /* set DBI = null for next loop through. */ - dbi = NULL; - } /* end for loop */ - - /* set dbdata to the ldap_instance we created. */ - *dbdata = ldap_inst; - - /* hey, we got through all of that ok, return success. */ - return (ISC_R_SUCCESS); - -cleanup: - dlz_ldap_destroy(NULL, ldap_inst); - - return (ISC_R_FAILURE); -} - -void -dlz_ldap_destroy(void *driverarg, void *dbdata) { - UNUSED(driverarg); - - if (dbdata != NULL) { - /* cleanup the list of DBI's */ - ldap_destroy_dblist( - (db_list_t *)((ldap_instance_t *)dbdata)->db); - - if (((ldap_instance_t *)dbdata)->hosts != NULL) { - isc_mem_free(named_g_mctx, - ((ldap_instance_t *)dbdata)->hosts); - } - - if (((ldap_instance_t *)dbdata)->user != NULL) { - isc_mem_free(named_g_mctx, - ((ldap_instance_t *)dbdata)->user); - } - - if (((ldap_instance_t *)dbdata)->cred != NULL) { - isc_mem_free(named_g_mctx, - ((ldap_instance_t *)dbdata)->cred); - } - - isc_mem_put(named_g_mctx, dbdata, sizeof(ldap_instance_t)); - } -} - -static dns_sdlzmethods_t dlz_ldap_methods = { - dlz_ldap_create, - dlz_ldap_destroy, - dlz_ldap_findzone, - dlz_ldap_lookup, - dlz_ldap_authority, - dlz_ldap_allnodes, - dlz_ldap_allowzonexfr, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, -}; - -/*% - * Wrapper around dns_sdlzregister(). - */ -isc_result_t -dlz_ldap_init(void) { - isc_result_t result; - - /* - * Write debugging message to log - */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_DEBUG(2), "Registering DLZ ldap driver."); - - result = dns_sdlzregister("ldap", &dlz_ldap_methods, NULL, - DNS_SDLZFLAG_RELATIVEOWNER | - DNS_SDLZFLAG_RELATIVERDATA, - named_g_mctx, &dlz_ldap); - if (result != ISC_R_SUCCESS) { - UNEXPECTED_ERROR(__FILE__, __LINE__, - "dns_sdlzregister() failed: %s", - isc_result_totext(result)); - result = ISC_R_UNEXPECTED; - } - - return (result); -} - -/*% - * Wrapper around dns_sdlzunregister(). - */ -void -dlz_ldap_clear(void) { - /* - * Write debugging message to log - */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_DEBUG(2), "Unregistering DLZ ldap driver."); - - if (dlz_ldap != NULL) { - dns_sdlzunregister(&dlz_ldap); - } -} - -#endif /* ifdef DLZ_LDAP */ diff --git a/contrib/dlz/drivers/dlz_mysql_driver.c b/contrib/dlz/drivers/dlz_mysql_driver.c deleted file mode 100644 index 3b6d6cfa2d..0000000000 --- a/contrib/dlz/drivers/dlz_mysql_driver.c +++ /dev/null @@ -1,1055 +0,0 @@ -/* - * Copyright (C) 2002 Stichting NLnet, Netherlands, stichting@nlnet.nl. - * - * Permission to use, copy, modify, and 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 STICHTING NLNET - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * STICHTING NLNET 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. - * - * The development of Dynamically Loadable Zones (DLZ) for Bind 9 was - * conceived and contributed by Rob Butler. - * - * Permission to use, copy, modify, and 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 ROB BUTLER - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * ROB BUTLER 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. - */ - -/* - * Copyright (C) 1999-2001, 2016 Internet Systems Consortium, Inc. ("ISC") - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -#ifdef DLZ_MYSQL -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include - -#if !defined(LIBMARIADB) && MYSQL_VERSION_ID >= 80000 -typedef bool my_bool; -#endif /* !defined(LIBMARIADB) && MYSQL_VERSION_ID >= 80000 */ - -static dns_sdlzimplementation_t *dlz_mysql = NULL; - -#define dbc_search_limit 30 -#define ALLNODES 1 -#define ALLOWXFR 2 -#define AUTHORITY 3 -#define FINDZONE 4 -#define COUNTZONE 5 -#define LOOKUP 6 - -#define safeGet(in) in == NULL ? "" : in - -/* - * Private methods - */ - -/*% - * Allocates memory for a new string, and then constructs the new - * string by "escaping" the input string. The new string is - * safe to be used in queries. This is necessary because we cannot - * be sure of what types of strings are passed to us, and we don't - * want special characters in the string causing problems. - */ - -static char * -mysqldrv_escape_string(MYSQL *mysql, const char *instr) { - char *outstr; - unsigned int len; - - if (instr == NULL) { - return (NULL); - } - - len = strlen(instr); - - outstr = isc_mem_allocate(named_g_mctx, (2 * len * sizeof(char)) + 1); - - mysql_real_escape_string(mysql, outstr, instr, len); - - return (outstr); -} - -/*% - * This function is the real core of the driver. Zone, record - * and client strings are passed in (or NULL is passed if the - * string is not available). The type of query we want to run - * is indicated by the query flag, and the dbdata object is passed - * passed in to. dbdata really holds a single database instance. - * The function will construct and run the query, hopefully getting - * a result set. - */ - -static isc_result_t -mysql_get_resultset(const char *zone, const char *record, const char *client, - unsigned int query, void *dbdata, MYSQL_RES **rs) { - isc_result_t result; - dbinstance_t *dbi = NULL; - char *querystring = NULL; - unsigned int i = 0; - unsigned int j = 0; - int qres = 0; - - if (query != COUNTZONE) { - REQUIRE(*rs == NULL); - } else { - REQUIRE(rs == NULL); - } - - /* get db instance / connection */ - dbi = (dbinstance_t *)dbdata; - - /* if DBI is null, can't do anything else */ - if (dbi == NULL) { - return (ISC_R_FAILURE); - } - - /* what type of query are we going to run? */ - switch (query) { - case ALLNODES: - /* - * if the query was not passed in from the config file - * then we can't run it. return not_implemented, so - * it's like the code for that operation was never - * built into the driver.... AHHH flexibility!!! - */ - if (dbi->allnodes_q == NULL) { - result = ISC_R_NOTIMPLEMENTED; - goto cleanup; - } - break; - case ALLOWXFR: - /* same as comments as ALLNODES */ - if (dbi->allowxfr_q == NULL) { - result = ISC_R_NOTIMPLEMENTED; - goto cleanup; - } - break; - case AUTHORITY: - /* same as comments as ALLNODES */ - if (dbi->authority_q == NULL) { - result = ISC_R_NOTIMPLEMENTED; - goto cleanup; - } - break; - case FINDZONE: - /* this is required. It's the whole point of DLZ! */ - if (dbi->findzone_q == NULL) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(2), - "No query specified for findzone. " - "Findzone requires a query"); - result = ISC_R_FAILURE; - goto cleanup; - } - break; - case COUNTZONE: - /* same as comments as ALLNODES */ - if (dbi->countzone_q == NULL) { - result = ISC_R_NOTIMPLEMENTED; - goto cleanup; - } - break; - case LOOKUP: - /* this is required. It's also a major point of DLZ! */ - if (dbi->lookup_q == NULL) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(2), - "No query specified for lookup. " - "Lookup requires a query"); - result = ISC_R_FAILURE; - goto cleanup; - } - break; - default: - /* - * this should never happen. If it does, the code is - * screwed up! - */ - UNEXPECTED_ERROR(__FILE__, __LINE__, - "Incorrect query flag passed to " - "mysql_get_resultset"); - result = ISC_R_UNEXPECTED; - goto cleanup; - } - - /* - * was a zone string passed? If so, make it safe for use in - * queries. - */ - if (zone != NULL) { - dbi->zone = mysqldrv_escape_string((MYSQL *)dbi->dbconn, zone); - if (dbi->zone == NULL) { - result = ISC_R_NOMEMORY; - goto cleanup; - } - } else { /* no string passed, set the string pointer to NULL */ - dbi->zone = NULL; - } - - /* - * was a record string passed? If so, make it safe for use in - * queries. - */ - if (record != NULL) { - dbi->record = mysqldrv_escape_string((MYSQL *)dbi->dbconn, - record); - if (dbi->record == NULL) { - result = ISC_R_NOMEMORY; - goto cleanup; - } - } else { /* no string passed, set the string pointer to NULL */ - dbi->record = NULL; - } - - /* - * was a client string passed? If so, make it safe for use in - * queries. - */ - if (client != NULL) { - dbi->client = mysqldrv_escape_string((MYSQL *)dbi->dbconn, - client); - if (dbi->client == NULL) { - result = ISC_R_NOMEMORY; - goto cleanup; - } - } else { /* no string passed, set the string pointer to NULL */ - dbi->client = NULL; - } - - /* - * what type of query are we going to run? this time we build - * the actual query to run. - */ - switch (query) { - case ALLNODES: - querystring = build_querystring(named_g_mctx, dbi->allnodes_q); - break; - case ALLOWXFR: - querystring = build_querystring(named_g_mctx, dbi->allowxfr_q); - break; - case AUTHORITY: - querystring = build_querystring(named_g_mctx, dbi->authority_q); - break; - case FINDZONE: - querystring = build_querystring(named_g_mctx, dbi->findzone_q); - break; - case COUNTZONE: - querystring = build_querystring(named_g_mctx, dbi->countzone_q); - break; - case LOOKUP: - querystring = build_querystring(named_g_mctx, dbi->lookup_q); - break; - default: - /* - * this should never happen. If it does, the code is - * screwed up! - */ - UNEXPECTED_ERROR(__FILE__, __LINE__, - "Incorrect query flag passed to " - "mysql_get_resultset"); - result = ISC_R_UNEXPECTED; - goto cleanup; - } - - /* if the querystring is null, Bummer, outta RAM. UPGRADE TIME!!! */ - if (querystring == NULL) { - result = ISC_R_NOMEMORY; - goto cleanup; - } - - /* - * output the full query string during debug so we can see - * what lame error the query has. - */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_DEBUG(1), "\nQuery String: %s\n", querystring); - - /* attempt query up to 3 times. */ - for (i = 0; i < 3; i++) { - qres = mysql_query((MYSQL *)dbi->dbconn, querystring); - if (qres == 0) { - break; - } - for (j = 0; mysql_ping((MYSQL *)dbi->dbconn) != 0 && j < 4; j++) - ; - } - - if (qres == 0) { - result = ISC_R_SUCCESS; - if (query != COUNTZONE) { - *rs = mysql_store_result((MYSQL *)dbi->dbconn); - if (*rs == NULL) { - result = ISC_R_FAILURE; - } - } - } else { - result = ISC_R_FAILURE; - } - -cleanup: - /* it's always good to cleanup after yourself */ - - /* free dbi->zone string */ - if (dbi->zone != NULL) { - isc_mem_free(named_g_mctx, dbi->zone); - } - - /* free dbi->record string */ - if (dbi->record != NULL) { - isc_mem_free(named_g_mctx, dbi->record); - } - - /* free dbi->client string */ - if (dbi->client != NULL) { - isc_mem_free(named_g_mctx, dbi->client); - } - - /* release query string */ - if (querystring != NULL) { - isc_mem_free(named_g_mctx, querystring); - } - - /* return result */ - return (result); -} - -/*% - * The processing of result sets for lookup and authority are - * exactly the same. So that functionality has been moved - * into this function to minimize code. - */ - -static isc_result_t -mysql_process_rs(dns_sdlzlookup_t *lookup, MYSQL_RES *rs) { - isc_result_t result = ISC_R_NOTFOUND; - MYSQL_ROW row; - unsigned int fields; - unsigned int j; - unsigned int len; - char *tmpString; - char *endp; - int ttl; - - row = mysql_fetch_row(rs); /* get a row from the result set */ - fields = mysql_num_fields(rs); /* how many columns in result set */ - while (row != NULL) { - switch (fields) { - case 1: - /* - * one column in rs, it's the data field. use - * default type of A record, and default TTL - * of 86400 - */ - result = dns_sdlz_putrr(lookup, "a", 86400, - safeGet(row[0])); - break; - case 2: - /* - * two columns, data field, and data type. - * use default TTL of 86400. - */ - result = dns_sdlz_putrr(lookup, safeGet(row[0]), 86400, - safeGet(row[1])); - break; - case 3: - /* - * three columns, all data no defaults. - * convert text to int, make sure it worked - * right. - */ - ttl = strtol(safeGet(row[0]), &endp, 10); - if (*endp != '\0' || ttl < 0) { - isc_log_write(dns_lctx, - DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "mysql driver ttl must be " - "a positive number"); - } - result = dns_sdlz_putrr(lookup, safeGet(row[1]), ttl, - safeGet(row[2])); - break; - default: - /* - * more than 3 fields, concatenate the last - * ones together. figure out how long to make - * string. - */ - for (j = 2, len = 0; j < fields; j++) { - len += strlen(safeGet(row[j])) + 1; - } - /* - * allocate string memory, allow for NULL to - * term string - */ - tmpString = isc_mem_allocate(named_g_mctx, len + 1); - /* copy field to tmpString */ - strcpy(tmpString, safeGet(row[2])); - - /* - * concat the rest of fields together, space - * between each one. - */ - for (j = 3; j < fields; j++) { - strcat(tmpString, " "); - strcat(tmpString, safeGet(row[j])); - } - /* convert text to int, make sure it worked right */ - ttl = strtol(safeGet(row[0]), &endp, 10); - if (*endp != '\0' || ttl < 0) { - isc_log_write(dns_lctx, - DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "mysql driver ttl must be " - "a positive number"); - } - /* ok, now tell Bind about it. */ - result = dns_sdlz_putrr(lookup, safeGet(row[1]), ttl, - tmpString); - /* done, get rid of this thing. */ - isc_mem_free(named_g_mctx, tmpString); - } - /* I sure hope we were successful */ - if (result != ISC_R_SUCCESS) { - /* nope, get rid of the Result set, and log a msg */ - mysql_free_result(rs); - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "dns_sdlz_putrr returned error. " - "Error code was: %s", - isc_result_totext(result)); - return (ISC_R_FAILURE); - } - row = mysql_fetch_row(rs); /* get next row */ - } - - /* free result set memory */ - mysql_free_result(rs); - - /* return result code */ - return (result); -} - -/* - * SDLZ interface methods - */ - -/*% determine if the zone is supported by (in) the database */ - -static isc_result_t -mysql_findzone(void *driverarg, void *dbdata, const char *name, - dns_clientinfomethods_t *methods, dns_clientinfo_t *clientinfo) { - isc_result_t result; - MYSQL_RES *rs = NULL; - my_ulonglong rows; - - UNUSED(driverarg); - UNUSED(methods); - UNUSED(clientinfo); - - /* run the query and get the result set from the database. */ - result = mysql_get_resultset(name, NULL, NULL, FINDZONE, dbdata, &rs); - /* if we didn't get a result set, log an err msg. */ - if (result != ISC_R_SUCCESS || rs == NULL) { - if (rs != NULL) { - mysql_free_result(rs); - } - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "mysql driver unable to return " - "result set for findzone query"); - return (ISC_R_FAILURE); - } - /* count how many rows in result set */ - rows = mysql_num_rows(rs); - /* get rid of result set, we are done with it. */ - mysql_free_result(rs); - - /* if we returned any rows, zone is supported. */ - if (rows > 0) { - mysql_get_resultset(name, NULL, NULL, COUNTZONE, dbdata, NULL); - return (ISC_R_SUCCESS); - } - - /* no rows returned, zone is not supported. */ - return (ISC_R_NOTFOUND); -} - -/*% Determine if the client is allowed to perform a zone transfer */ -static isc_result_t -mysql_allowzonexfr(void *driverarg, void *dbdata, const char *name, - const char *client) { - isc_result_t result; - MYSQL_RES *rs = NULL; - my_ulonglong rows; - - UNUSED(driverarg); - - /* first check if the zone is supported by the database. */ - result = mysql_findzone(driverarg, dbdata, name, NULL, NULL); - if (result != ISC_R_SUCCESS) { - return (ISC_R_NOTFOUND); - } - - /* - * if we get to this point we know the zone is supported by - * the database the only questions now are is the zone - * transfer is allowed for this client and did the config file - * have an allow zone xfr query. - * - * Run our query, and get a result set from the database. - */ - result = mysql_get_resultset(name, NULL, client, ALLOWXFR, dbdata, &rs); - /* if we get "not implemented", send it along. */ - if (result == ISC_R_NOTIMPLEMENTED) { - return (result); - } - /* if we didn't get a result set, log an err msg. */ - if (result != ISC_R_SUCCESS || rs == NULL) { - if (rs != NULL) { - mysql_free_result(rs); - } - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "mysql driver unable to return " - "result set for allow xfr query"); - return (ISC_R_FAILURE); - } - /* count how many rows in result set */ - rows = mysql_num_rows(rs); - /* get rid of result set, we are done with it. */ - mysql_free_result(rs); - - /* if we returned any rows, zone xfr is allowed. */ - if (rows > 0) { - return (ISC_R_SUCCESS); - } - - /* no rows returned, zone xfr not allowed */ - return (ISC_R_NOPERM); -} - -/*% - * If the client is allowed to perform a zone transfer, the next order of - * business is to get all the nodes in the zone, so bind can respond to the - * query. - */ -static isc_result_t -mysql_allnodes(const char *zone, void *driverarg, void *dbdata, - dns_sdlzallnodes_t *allnodes) { - isc_result_t result; - MYSQL_RES *rs = NULL; - MYSQL_ROW row; - unsigned int fields; - unsigned int j; - unsigned int len; - char *tmpString; - char *endp; - int ttl; - - UNUSED(driverarg); - - /* run the query and get the result set from the database. */ - result = mysql_get_resultset(zone, NULL, NULL, ALLNODES, dbdata, &rs); - /* if we get "not implemented", send it along */ - if (result == ISC_R_NOTIMPLEMENTED) { - return (result); - } - /* if we didn't get a result set, log an err msg. */ - if (result != ISC_R_SUCCESS) { - if (rs != NULL) { - mysql_free_result(rs); - } - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "mysql driver unable to return " - "result set for all nodes query"); - return (ISC_R_FAILURE); - } - - result = ISC_R_NOTFOUND; - - row = mysql_fetch_row(rs); /* get a row from the result set */ - fields = mysql_num_fields(rs); /* how many columns in result set */ - while (row != NULL) { - if (fields < 4) { /* gotta have at least 4 columns */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "mysql driver too few fields returned " - "by all nodes query"); - } - /* convert text to int, make sure it worked right */ - ttl = strtol(safeGet(row[0]), &endp, 10); - if (*endp != '\0' || ttl < 0) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "mysql driver ttl must be " - "a positive number"); - } - if (fields == 4) { - /* tell Bind about it. */ - result = dns_sdlz_putnamedrr(allnodes, safeGet(row[2]), - safeGet(row[1]), ttl, - safeGet(row[3])); - } else { - /* - * more than 4 fields, concatenate the last - * ones together. figure out how long to make - * string. - */ - for (j = 3, len = 0; j < fields; j++) { - len += strlen(safeGet(row[j])) + 1; - } - /* allocate memory, allow for NULL to term string */ - tmpString = isc_mem_allocate(named_g_mctx, len + 1); - /* copy this field to tmpString */ - strcpy(tmpString, safeGet(row[3])); - /* concatenate the rest, with spaces between */ - for (j = 4; j < fields; j++) { - strcat(tmpString, " "); - strcat(tmpString, safeGet(row[j])); - } - /* tell Bind about it. */ - result = dns_sdlz_putnamedrr(allnodes, safeGet(row[2]), - safeGet(row[1]), ttl, - tmpString); - isc_mem_free(named_g_mctx, tmpString); - } - /* if we weren't successful, log err msg */ - if (result != ISC_R_SUCCESS) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "dns_sdlz_putnamedrr returned error. " - "Error code was: %s", - isc_result_totext(result)); - result = ISC_R_FAILURE; - break; - } - /* get next row from the result set */ - row = mysql_fetch_row(rs); - } - - /* free result set memory */ - mysql_free_result(rs); - - return (result); -} - -/*% if the lookup function does not return SOA or NS records for the zone, - * use this function to get that information for Bind. - */ - -static isc_result_t -mysql_authority(const char *zone, void *driverarg, void *dbdata, - dns_sdlzlookup_t *lookup) { - isc_result_t result; - MYSQL_RES *rs = NULL; - - UNUSED(driverarg); - - /* run the query and get the result set from the database. */ - result = mysql_get_resultset(zone, NULL, NULL, AUTHORITY, dbdata, &rs); - /* if we get "not implemented", send it along */ - if (result == ISC_R_NOTIMPLEMENTED) { - return (result); - } - /* if we didn't get a result set, log an err msg. */ - if (result != ISC_R_SUCCESS) { - if (rs != NULL) { - mysql_free_result(rs); - } - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "mysql driver unable to return " - "result set for authority query"); - return (ISC_R_FAILURE); - } - /* - * lookup and authority result sets are processed in the same - * manner mysql_process_rs does the job for both functions. - */ - return (mysql_process_rs(lookup, rs)); -} - -/*% if zone is supported, lookup up a (or multiple) record(s) in it */ -static isc_result_t -mysql_lookup(const char *zone, const char *name, void *driverarg, void *dbdata, - dns_sdlzlookup_t *lookup, dns_clientinfomethods_t *methods, - dns_clientinfo_t *clientinfo) { - isc_result_t result; - MYSQL_RES *rs = NULL; - - UNUSED(driverarg); - UNUSED(methods); - UNUSED(clientinfo); - - /* run the query and get the result set from the database. */ - result = mysql_get_resultset(zone, name, NULL, LOOKUP, dbdata, &rs); - /* if we didn't get a result set, log an err msg. */ - if (result != ISC_R_SUCCESS) { - if (rs != NULL) { - mysql_free_result(rs); - } - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "mysql driver unable to return " - "result set for lookup query"); - return (ISC_R_FAILURE); - } - /* - * lookup and authority result sets are processed in the same manner - * mysql_process_rs does the job for both functions. - */ - return (mysql_process_rs(lookup, rs)); -} - -/*% - * create an instance of the driver. Remember, only 1 copy of the driver's - * code is ever loaded, the driver has to remember which context it's - * operating in. This is done via use of the dbdata argument which is - * passed into all query functions. - */ -static isc_result_t -mysql_create(const char *dlzname, unsigned int argc, char *argv[], - void *driverarg, void **dbdata) { - isc_result_t result; - dbinstance_t *dbi = NULL; - char *tmp = NULL; - char *dbname = NULL; - char *host = NULL; - char *user = NULL; - char *pass = NULL; - char *socket = NULL; - int port; - MYSQL *dbc; - char *endp; - int j; - unsigned int flags = 0; - - UNUSED(driverarg); - UNUSED(dlzname); - - /* verify we have at least 4 arg's passed to the driver */ - if (argc < 4) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "mysql driver requires " - "at least 4 command line args."); - return (ISC_R_FAILURE); - } - - /* no more than 8 arg's should be passed to the driver */ - if (argc > 8) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "mysql driver cannot accept " - "more than 7 command line args."); - return (ISC_R_FAILURE); - } - - /* parse connection string and get parameters. */ - - /* get db name - required */ - dbname = getParameterValue(argv[1], "dbname="); - if (dbname == NULL) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "mysql driver requires a dbname parameter."); - result = ISC_R_FAILURE; - goto full_cleanup; - } - - /* get db port. Not required, but must be > 0 if specified */ - tmp = getParameterValue(argv[1], "port="); - if (tmp == NULL) { - port = 0; - } else { - port = strtol(tmp, &endp, 10); - if (*endp != '\0' || port < 0) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Mysql driver port " - "must be a positive number."); - isc_mem_free(named_g_mctx, tmp); - result = ISC_R_FAILURE; - goto full_cleanup; - } - isc_mem_free(named_g_mctx, tmp); - } - - /* how many queries were passed in from config file? */ - switch (argc) { - case 4: - result = build_sqldbinstance(named_g_mctx, NULL, NULL, NULL, - argv[2], argv[3], NULL, &dbi); - break; - case 5: - result = build_sqldbinstance(named_g_mctx, NULL, NULL, argv[4], - argv[2], argv[3], NULL, &dbi); - break; - case 6: - result = build_sqldbinstance(named_g_mctx, argv[5], NULL, - argv[4], argv[2], argv[3], NULL, - &dbi); - break; - case 7: - result = build_sqldbinstance(named_g_mctx, argv[5], argv[6], - argv[4], argv[2], argv[3], NULL, - &dbi); - break; - case 8: - result = build_sqldbinstance(named_g_mctx, argv[5], argv[6], - argv[4], argv[2], argv[3], argv[7], - &dbi); - break; - default: - /* not really needed, should shut up compiler. */ - result = ISC_R_FAILURE; - } - - /* unsuccessful?, log err msg and cleanup. */ - if (result != ISC_R_SUCCESS) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "mysql driver could not create " - "database instance object."); - result = ISC_R_FAILURE; - goto cleanup; - } - - /* create and set db connection */ - dbi->dbconn = mysql_init(NULL); - - /* if db connection cannot be created, log err msg and cleanup. */ - if (dbi->dbconn == NULL) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "mysql driver could not allocate " - "memory for database connection"); - result = ISC_R_FAILURE; - goto full_cleanup; - } - - tmp = getParameterValue(argv[1], "compress="); - if (tmp != NULL) { - if (strcasecmp(tmp, "true") == 0) { - flags = CLIENT_COMPRESS; - } - isc_mem_free(named_g_mctx, tmp); - } - - tmp = getParameterValue(argv[1], "ssl="); - if (tmp != NULL) { - if (strcasecmp(tmp, "true") == 0) { - flags = flags | CLIENT_SSL; - } - isc_mem_free(named_g_mctx, tmp); - } - - tmp = getParameterValue(argv[1], "space="); - if (tmp != NULL) { - if (strcasecmp(tmp, "ignore") == 0) { - flags = flags | CLIENT_IGNORE_SPACE; - } - isc_mem_free(named_g_mctx, tmp); - } - - dbc = NULL; - host = getParameterValue(argv[1], "host="); - user = getParameterValue(argv[1], "user="); - pass = getParameterValue(argv[1], "pass="); - socket = getParameterValue(argv[1], "socket="); - - /* enable automatic reconnection. */ - if (mysql_options((MYSQL *)dbi->dbconn, MYSQL_OPT_RECONNECT, - &(my_bool){ 1 }) != 0) - { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_WARNING, - "mysql driver failed to set " - "MYSQL_OPT_RECONNECT option, " - "continuing"); - } - - for (j = 0; dbc == NULL && j < 4; j++) { - dbc = mysql_real_connect((MYSQL *)dbi->dbconn, host, user, pass, - dbname, port, socket, flags); - } - - /* let user know if we couldn't connect. */ - if (dbc == NULL) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "mysql driver failed to create " - "database connection after 4 attempts"); - result = ISC_R_FAILURE; - goto full_cleanup; - } - - /* return db connection via dbdata */ - *dbdata = dbi; - - result = ISC_R_SUCCESS; - goto cleanup; - -full_cleanup: - - if (dbi != NULL) { - destroy_sqldbinstance(dbi); - } - -cleanup: - - if (dbname != NULL) { - isc_mem_free(named_g_mctx, dbname); - } - if (host != NULL) { - isc_mem_free(named_g_mctx, host); - } - if (user != NULL) { - isc_mem_free(named_g_mctx, user); - } - if (pass != NULL) { - isc_mem_free(named_g_mctx, pass); - } - if (socket != NULL) { - isc_mem_free(named_g_mctx, socket); - } - - return (result); -} - -/*% - * destroy the driver. Remember, only 1 copy of the driver's - * code is ever loaded, the driver has to remember which context it's - * operating in. This is done via use of the dbdata argument. - * so we really only need to clean it up since we are not using driverarg. - */ - -static void -mysql_destroy(void *driverarg, void *dbdata) { - dbinstance_t *dbi; - - UNUSED(driverarg); - - dbi = (dbinstance_t *)dbdata; - - /* release DB connection */ - if (dbi->dbconn != NULL) { - mysql_close((MYSQL *)dbi->dbconn); - } - - /* destroy DB instance */ - destroy_sqldbinstance(dbi); -} - -/* pointers to all our runtime methods. */ -/* this is used during driver registration */ -/* i.e. in dlz_mysql_init below. */ -static dns_sdlzmethods_t dlz_mysql_methods = { - mysql_create, - mysql_destroy, - mysql_findzone, - mysql_lookup, - mysql_authority, - mysql_allnodes, - mysql_allowzonexfr, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, -}; - -/*% - * Wrapper around dns_sdlzregister(). - */ -isc_result_t -dlz_mysql_init(void) { - isc_result_t result; - - /* - * Write debugging message to log - */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_DEBUG(2), "Registering DLZ mysql driver."); - - /* Driver is always threadsafe. Because of the way MySQL handles - * threads the MySQL driver can only be used when bind is run single - * threaded. Using MySQL with Bind running multi-threaded is not - * allowed. When using the MySQL driver "-n1" should always be - * passed to Bind to guarantee single threaded operation. - */ - result = dns_sdlzregister("mysql", &dlz_mysql_methods, NULL, - DNS_SDLZFLAG_RELATIVEOWNER | - DNS_SDLZFLAG_RELATIVERDATA | - DNS_SDLZFLAG_THREADSAFE, - named_g_mctx, &dlz_mysql); - /* if we can't register the driver, there are big problems. */ - if (result != ISC_R_SUCCESS) { - UNEXPECTED_ERROR(__FILE__, __LINE__, - "dns_sdlzregister() failed: %s", - isc_result_totext(result)); - result = ISC_R_UNEXPECTED; - } - - return (result); -} - -/*% - * Wrapper around dns_sdlzunregister(). - */ -void -dlz_mysql_clear(void) { - /* - * Write debugging message to log - */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_DEBUG(2), "Unregistering DLZ mysql driver."); - - /* unregister the driver. */ - if (dlz_mysql != NULL) { - dns_sdlzunregister(&dlz_mysql); - } -} - -#endif /* ifdef DLZ_MYSQL */ diff --git a/contrib/dlz/drivers/dlz_odbc_driver.c b/contrib/dlz/drivers/dlz_odbc_driver.c deleted file mode 100644 index 0a7cc96154..0000000000 --- a/contrib/dlz/drivers/dlz_odbc_driver.c +++ /dev/null @@ -1,1423 +0,0 @@ -/* - * Copyright (C) 2002 Stichting NLnet, Netherlands, stichting@nlnet.nl. - * - * Permission to use, copy, modify, and 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 STICHTING NLNET - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * STICHTING NLNET 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. - * - * The development of Dynamically Loadable Zones (DLZ) for Bind 9 was - * conceived and contributed by Rob Butler. - * - * Permission to use, copy, modify, and 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 ROB BUTLER - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * ROB BUTLER 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. - */ - -/* - * Copyright (C) 1999-2001, 2016 Internet Systems Consortium, Inc. ("ISC") - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -#ifdef DLZ_ODBC -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include - -static dns_sdlzimplementation_t *dlz_odbc = NULL; - -#define dbc_search_limit 30 -#define ALLNODES 1 -#define ALLOWXFR 2 -#define AUTHORITY 3 -#define FINDZONE 4 -#define LOOKUP 5 - -#define sqlOK(a) ((a == SQL_SUCCESS || a == SQL_SUCCESS_WITH_INFO) ? -1 : 0) - -/* - * Private Structures - */ - -/* - * structure to hold ODBC connection & statement - */ - -typedef struct { - SQLHDBC dbc; - SQLHSTMT stmnt; -} odbc_db_t; - -/* - * Structure to hold everything needed by this "instance" of the odbc driver - * remember, the driver code is only loaded once, but may have many separate - * instances - */ - -typedef struct { - db_list_t *db; /* handle to a list of DB */ - SQLHENV sql_env; /* handle to SQL environment */ - SQLCHAR *dsn; - SQLCHAR *user; - SQLCHAR *pass; -} odbc_instance_t; - -/* forward reference */ - -static size_t -odbc_makesafe(char *to, const char *from, size_t length); - -/* - * Private methods - */ - -static SQLSMALLINT -safeLen(void *a) { - if (a == NULL) { - return (0); - } - return (strlen((char *)a)); -} - -/*% properly cleans up an odbc_instance_t */ - -static void -destroy_odbc_instance(odbc_instance_t *odbc_inst) { - dbinstance_t *ndbi = NULL; - dbinstance_t *dbi = NULL; - - /* get the first DBI in the list */ - ndbi = ISC_LIST_HEAD(*odbc_inst->db); - - /* loop through the list */ - while (ndbi != NULL) { - dbi = ndbi; - /* get the next DBI in the list */ - ndbi = ISC_LIST_NEXT(dbi, link); - - /* if we have a connection / statement object in memory */ - if (dbi->dbconn != NULL) { - /* free statement handle */ - if (((odbc_db_t *)(dbi->dbconn))->stmnt != NULL) { - SQLFreeHandle( - SQL_HANDLE_STMT, - ((odbc_db_t *)(dbi->dbconn))->stmnt); - ((odbc_db_t *)(dbi->dbconn))->stmnt = NULL; - } - - /* disconnect from database & free connection handle */ - if (((odbc_db_t *)(dbi->dbconn))->dbc != NULL) { - SQLDisconnect(((odbc_db_t *)dbi->dbconn)->dbc); - SQLFreeHandle( - SQL_HANDLE_DBC, - ((odbc_db_t *)(dbi->dbconn))->dbc); - ((odbc_db_t *)(dbi->dbconn))->dbc = NULL; - } - - /* free memory that held connection & statement. */ - isc_mem_free(named_g_mctx, dbi->dbconn); - } - /* release all memory that comprised a DBI */ - destroy_sqldbinstance(dbi); - } - /* release memory for the list structure */ - isc_mem_put(named_g_mctx, odbc_inst->db, sizeof(db_list_t)); - - /* free sql environment */ - if (odbc_inst->sql_env != NULL) { - SQLFreeHandle(SQL_HANDLE_ENV, odbc_inst->sql_env); - } - - /* free ODBC instance strings */ - if (odbc_inst->dsn != NULL) { - isc_mem_free(named_g_mctx, odbc_inst->dsn); - } - if (odbc_inst->pass != NULL) { - isc_mem_free(named_g_mctx, odbc_inst->pass); - } - if (odbc_inst->user != NULL) { - isc_mem_free(named_g_mctx, odbc_inst->user); - } - - /* free memory for odbc_inst */ - if (odbc_inst != NULL) { - isc_mem_put(named_g_mctx, odbc_inst, sizeof(odbc_instance_t)); - } -} - -/*% Connects to database, and creates ODBC statements */ - -static isc_result_t -odbc_connect(odbc_instance_t *dbi, odbc_db_t **dbc) { - odbc_db_t *ndb = *dbc; - SQLRETURN sqlRes; - isc_result_t result = ISC_R_SUCCESS; - - if (ndb != NULL) { - /* - * if db != null, we have to do some cleanup - * if statement handle != null free it - */ - if (ndb->stmnt != NULL) { - SQLFreeHandle(SQL_HANDLE_STMT, ndb->stmnt); - ndb->stmnt = NULL; - } - - /* if connection handle != null free it */ - if (ndb->dbc != NULL) { - SQLFreeHandle(SQL_HANDLE_DBC, ndb->dbc); - ndb->dbc = NULL; - } - } else { - ndb = isc_mem_allocate(named_g_mctx, sizeof(odbc_db_t)); - memset(ndb, 0, sizeof(odbc_db_t)); - } - - sqlRes = SQLAllocHandle(SQL_HANDLE_DBC, dbi->sql_env, &(ndb->dbc)); - if (!sqlOK(sqlRes)) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Odbc driver unable to allocate memory"); - result = ISC_R_NOMEMORY; - goto cleanup; - } - - sqlRes = SQLConnect(ndb->dbc, dbi->dsn, safeLen(dbi->dsn), dbi->user, - safeLen(dbi->user), dbi->pass, safeLen(dbi->pass)); - if (!sqlOK(sqlRes)) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Odbc driver unable to connect"); - result = ISC_R_FAILURE; - goto cleanup; - } - - sqlRes = SQLAllocHandle(SQL_HANDLE_STMT, ndb->dbc, &(ndb->stmnt)); - if (!sqlOK(sqlRes)) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Odbc driver unable to allocate memory"); - result = ISC_R_NOMEMORY; - goto cleanup; - } - - *dbc = ndb; - - return (ISC_R_SUCCESS); - -cleanup: - - if (ndb != NULL) { - /* if statement handle != null free it */ - if (ndb->stmnt != NULL) { - SQLFreeHandle(SQL_HANDLE_STMT, ndb->stmnt); - ndb->stmnt = NULL; - } - - /* if connection handle != null free it */ - if (ndb->dbc != NULL) { - SQLDisconnect(ndb->dbc); - SQLFreeHandle(SQL_HANDLE_DBC, ndb->dbc); - ndb->dbc = NULL; - } - /* free memory holding ndb */ - isc_mem_free(named_g_mctx, ndb); - } - - return (result); -} - -/*% - * Loops through the list of DB instances, attempting to lock - * on the mutex. If successful, the DBI is reserved for use - * and the thread can perform queries against the database. - * If the lock fails, the next one in the list is tried. - * looping continues until a lock is obtained, or until - * the list has been searched dbc_search_limit times. - * This function is only used when the driver is compiled for - * multithreaded operation. - */ - -static dbinstance_t * -odbc_find_avail_conn(db_list_t *dblist) { - dbinstance_t *dbi = NULL; - dbinstance_t *head; - int count = 0; - - /* get top of list */ - head = dbi = ISC_LIST_HEAD(*dblist); - - /* loop through list */ - while (count < dbc_search_limit) { - /* try to lock on the mutex */ - if (isc_mutex_trylock(&dbi->instance_lock) == ISC_R_SUCCESS) { - return (dbi); /* success, return the DBI for use. */ - } - /* not successful, keep trying */ - dbi = ISC_LIST_NEXT(dbi, link); - - /* check to see if we have gone to the top of the list. */ - if (dbi == NULL) { - count++; - dbi = head; - } - } - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_INFO, - "Odbc driver unable to find available " - "connection after searching %d times", - count); - return (NULL); -} - -/*% Allocates memory for a new string, and then constructs the new - * string by "escaping" the input string. The new string is - * safe to be used in queries. This is necessary because we cannot - * be sure of what types of strings are passed to us, and we don't - * want special characters in the string causing problems. - */ - -static char * -odbc_escape_string(const char *instr) { - char *outstr; - unsigned int len; - - if (instr == NULL) { - return (NULL); - } - - len = strlen(instr); - - outstr = isc_mem_allocate(named_g_mctx, (2 * len * sizeof(char)) + 1); - - odbc_makesafe(outstr, instr, len); - - return (outstr); -} - -/* --------------- - * Escaping arbitrary strings to get valid SQL strings/identifiers. - * - * Replaces "\\" with "\\\\" and "'" with "''". - * length is the length of the buffer pointed to by - * from. The buffer at to must be at least 2*length + 1 characters - * long. A terminating NUL character is written. - * - * NOTICE!!! - * This function was borrowed directly from PostgreSQL's libpq. - * - * The copyright statements from the original file containing this - * function are included below: - * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group - * Portions Copyright (c) 1994, Regents of the University of California - * --------------- - */ - -static size_t -odbc_makesafe(char *to, const char *from, size_t length) { - const char *source = from; - char *target = to; - unsigned int remaining = length; - - while (remaining > 0) { - switch (*source) { - case '\\': - *target = '\\'; - target++; - *target = '\\'; - /* target and remaining are updated below. */ - break; - - case '\'': - *target = '\''; - target++; - *target = '\''; - /* target and remaining are updated below. */ - break; - - default: - *target = *source; - /* target and remaining are updated below. */ - } - source++; - target++; - remaining--; - } - - /* Write the terminating NUL character. */ - *target = '\0'; - - return (target - to); -} - -/*% - * This function is the real core of the driver. Zone, record - * and client strings are passed in (or NULL is passed if the - * string is not available). The type of query we want to run - * is indicated by the query flag, and the dbdata object is passed - * passed in to. dbdata really holds either: - * 1) a list of database instances (in multithreaded mode) OR - * 2) a single database instance (in single threaded mode) - * The function will construct the query and obtain an available - * database instance (DBI). It will then run the query and hopefully - * obtain a result set. The data base instance that is used is returned - * to the caller so they can get the data from the result set from it. - * If successful, it will be the responsibility of the caller to close - * the cursor, and unlock the mutex of the DBI when they are done with it. - * If not successful, this function will perform all the cleanup. - */ - -static isc_result_t -odbc_get_resultset(const char *zone, const char *record, const char *client, - unsigned int query, void *dbdata, dbinstance_t **r_dbi) { - isc_result_t result; - dbinstance_t *dbi = NULL; - char *querystring = NULL; - unsigned int j = 0; - SQLRETURN sqlRes; - - REQUIRE(*r_dbi == NULL); - - /* get db instance / connection */ - - /* find an available DBI from the list */ - dbi = odbc_find_avail_conn(((odbc_instance_t *)dbdata)->db); - - /* if DBI is null, can't do anything else */ - if (dbi == NULL) { - return (ISC_R_FAILURE); - } - - /* what type of query are we going to run? */ - switch (query) { - case ALLNODES: - /* - * if the query was not passed in from the config file - * then we can't run it. return not_implemented, so - * it's like the code for that operation was never - * built into the driver.... AHHH flexibility!!! - */ - if (dbi->allnodes_q == NULL) { - result = ISC_R_NOTIMPLEMENTED; - goto cleanup; - } - break; - case ALLOWXFR: - /* same as comments as ALLNODES */ - if (dbi->allowxfr_q == NULL) { - result = ISC_R_NOTIMPLEMENTED; - goto cleanup; - } - break; - case AUTHORITY: - /* same as comments as ALLNODES */ - if (dbi->authority_q == NULL) { - result = ISC_R_NOTIMPLEMENTED; - goto cleanup; - } - break; - case FINDZONE: - /* this is required. It's the whole point of DLZ! */ - if (dbi->findzone_q == NULL) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(2), - "No query specified for findzone. " - "Findzone requires a query"); - result = ISC_R_FAILURE; - goto cleanup; - } - break; - case LOOKUP: - /* this is required. It's also a major point of DLZ! */ - if (dbi->lookup_q == NULL) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(2), - "No query specified for lookup. " - "Lookup requires a query"); - result = ISC_R_FAILURE; - goto cleanup; - } - break; - default: - /* - * this should never happen. If it does, the code is - * screwed up! - */ - UNEXPECTED_ERROR(__FILE__, __LINE__, - "Incorrect query flag passed to " - "odbc_get_resultset"); - result = ISC_R_UNEXPECTED; - goto cleanup; - } - - /* - * was a zone string passed? If so, make it safe for use in - * queries. - */ - if (zone != NULL) { - dbi->zone = odbc_escape_string(zone); - if (dbi->zone == NULL) { - result = ISC_R_NOMEMORY; - goto cleanup; - } - } else { /* no string passed, set the string pointer to NULL */ - dbi->zone = NULL; - } - - /* - * was a record string passed? If so, make it safe for use in - * queries. - */ - if (record != NULL) { - dbi->record = odbc_escape_string(record); - if (dbi->record == NULL) { - result = ISC_R_NOMEMORY; - goto cleanup; - } - } else { /* no string passed, set the string pointer to NULL */ - dbi->record = NULL; - } - - /* - * was a client string passed? If so, make it safe for use in - * queries. - */ - if (client != NULL) { - dbi->client = odbc_escape_string(client); - if (dbi->client == NULL) { - result = ISC_R_NOMEMORY; - goto cleanup; - } - } else { /* no string passed, set the string pointer to NULL */ - dbi->client = NULL; - } - - /* - * what type of query are we going to run? - * this time we build the actual query to run. - */ - switch (query) { - case ALLNODES: - querystring = build_querystring(named_g_mctx, dbi->allnodes_q); - break; - case ALLOWXFR: - querystring = build_querystring(named_g_mctx, dbi->allowxfr_q); - break; - case AUTHORITY: - querystring = build_querystring(named_g_mctx, dbi->authority_q); - break; - case FINDZONE: - querystring = build_querystring(named_g_mctx, dbi->findzone_q); - break; - case LOOKUP: - querystring = build_querystring(named_g_mctx, dbi->lookup_q); - break; - default: - /* - * this should never happen. If it does, the code is - * screwed up! - */ - UNEXPECTED_ERROR(__FILE__, __LINE__, - "Incorrect query flag passed to " - "odbc_get_resultset"); - result = ISC_R_UNEXPECTED; - goto cleanup; - } - - /* if the querystring is null, Bummer, outta RAM. UPGRADE TIME!!! */ - if (querystring == NULL) { - result = ISC_R_NOMEMORY; - goto cleanup; - } - - /* output the full query string during debug so we can see */ - /* what lame error the query has. */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_DEBUG(1), "\nQuery String: %s\n", querystring); - - /* attempt query up to 3 times. */ - for (j = 0; j < 3; j++) { - /* try to get result set */ - sqlRes = SQLExecDirect(((odbc_db_t *)dbi->dbconn)->stmnt, - (SQLCHAR *)querystring, - (SQLINTEGER)strlen(querystring)); - - /* if error, reset DB connection */ - if (!sqlOK(sqlRes)) { - /* close cursor */ - SQLCloseCursor(((odbc_db_t *)dbi->dbconn)->stmnt); - /* attempt to reconnect */ - result = odbc_connect((odbc_instance_t *)dbdata, - (odbc_db_t **)&(dbi->dbconn)); - /* check if we reconnected */ - if (result != ISC_R_SUCCESS) { - break; - } - /* in case this is the last time through the loop */ - result = ISC_R_FAILURE; - } else { - result = ISC_R_SUCCESS; - /* return dbi */ - *r_dbi = dbi; - /* result set ok, break loop */ - break; - } - } /* end for loop */ - -cleanup: /* it's always good to cleanup after yourself */ - - /* free dbi->zone string */ - if (dbi->zone != NULL) { - isc_mem_free(named_g_mctx, dbi->zone); - } - - /* free dbi->record string */ - if (dbi->record != NULL) { - isc_mem_free(named_g_mctx, dbi->record); - } - - /* free dbi->client string */ - if (dbi->client != NULL) { - isc_mem_free(named_g_mctx, dbi->client); - } - - /* if we are done using this dbi, release the lock */ - if (result != ISC_R_SUCCESS) { - isc_mutex_unlock(&dbi->instance_lock); - } - - /* release query string */ - if (querystring != NULL) { - isc_mem_free(named_g_mctx, querystring); - } - - /* return result */ - return (result); -} - -/*% - * Gets a single field from the ODBC statement. The memory for the - * returned data is dynamically allocated. If this method is successful - * it is the responsibility of the caller to free the memory using - * isc_mem_free(named_g_mctx, *ptr); - */ - -static isc_result_t -odbc_getField(SQLHSTMT *stmnt, SQLSMALLINT field, char **data) { - SQLLEN size; - - REQUIRE(data != NULL && *data == NULL); - - if (sqlOK(SQLColAttribute(stmnt, field, SQL_DESC_DISPLAY_SIZE, NULL, 0, - NULL, &size)) && - size > 0) - { - *data = isc_mem_allocate(named_g_mctx, size + 1); - if (data != NULL) { - if (sqlOK(SQLGetData(stmnt, field, SQL_C_CHAR, *data, - size + 1, &size))) { - return (ISC_R_SUCCESS); - } - isc_mem_free(named_g_mctx, *data); - } - } - return (ISC_R_FAILURE); -} - -/*% - * Gets multiple fields from the ODBC statement. The memory for the - * returned data is dynamically allocated. If this method is successful - * it is the responsibility of the caller to free the memory using - * isc_mem_free(named_g_mctx, *ptr); - */ - -static isc_result_t -odbc_getManyFields(SQLHSTMT *stmnt, SQLSMALLINT startField, - SQLSMALLINT endField, char **retData) { - isc_result_t result; - SQLLEN size; - int totSize = 0; - SQLSMALLINT i; - int j = 0; - char *data; - - REQUIRE(retData != NULL && *retData == NULL); - REQUIRE(startField > 0 && startField <= endField); - - /* determine how large the data is */ - for (i = startField; i <= endField; i++) { - if (sqlOK(SQLColAttribute(stmnt, i, SQL_DESC_DISPLAY_SIZE, NULL, - 0, NULL, &size)) && - size > 0) - { - { - /* always allow for a " " (space) character */ - totSize += (size + 1); - /* after the data item */ - } - } - } - - if (totSize < 1) { - return (ISC_R_FAILURE); - } - - /* allow for a "\n" at the end of the string/ */ - data = isc_mem_allocate(named_g_mctx, ++totSize); - - result = ISC_R_FAILURE; - - /* get the data and concat all fields into a large string */ - for (i = startField; i <= endField; i++) { - if (sqlOK(SQLGetData(stmnt, i, SQL_C_CHAR, &(data[j]), - totSize - j, &size))) { - if (size > 0) { - j += size; - data[j++] = ' '; - data[j] = '\0'; - result = ISC_R_SUCCESS; - } - } else { - isc_mem_free(named_g_mctx, data); - return (ISC_R_FAILURE); - } - } - - if (result != ISC_R_SUCCESS) { - isc_mem_free(named_g_mctx, data); - return (result); - } - - *retData = data; - return (ISC_R_SUCCESS); -} - -/*% - * The processing of result sets for lookup and authority are - * exactly the same. So that functionality has been moved - * into this function to minimize code. - */ - -static isc_result_t -odbc_process_rs(dns_sdlzlookup_t *lookup, dbinstance_t *dbi) { - isc_result_t result; - SQLSMALLINT fields; - SQLHSTMT *stmnt; - char *ttl_s; - char *type; - char *data; - char *endp; - int ttl; - - REQUIRE(dbi != NULL); - - stmnt = ((odbc_db_t *)(dbi->dbconn))->stmnt; - - /* get number of columns */ - if (!sqlOK(SQLNumResultCols(stmnt, &fields))) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Odbc driver unable to process result set"); - result = ISC_R_FAILURE; - goto process_rs_cleanup; - } - - /* get things ready for processing */ - result = ISC_R_FAILURE; - - while (sqlOK(SQLFetch(stmnt))) { - /* set to null for next pass through */ - data = type = ttl_s = NULL; - - switch (fields) { - case 1: - /* - * one column in rs, it's the data field. use - * default type of A record, and default TTL - * of 86400. attempt to get data, & tell bind - * about it. - */ - if ((result = odbc_getField(stmnt, 1, &data)) == - ISC_R_SUCCESS) { - result = dns_sdlz_putrr(lookup, "a", 86400, - data); - } - break; - case 2: - /* - * two columns, data field, and data type. - * use default TTL of 86400. attempt to get - * DNS type & data, then tell bind about it. - */ - if ((result = odbc_getField(stmnt, 1, &type)) == - ISC_R_SUCCESS && - (result = odbc_getField(stmnt, 2, &data)) == - ISC_R_SUCCESS) - { - result = dns_sdlz_putrr(lookup, type, 86400, - data); - } - break; - default: - /* - * 3 fields or more, concatenate the last ones - * together. attempt to get DNS ttl, type, - * data then tell Bind about them. - */ - if ((result = odbc_getField(stmnt, 1, &ttl_s)) == - ISC_R_SUCCESS && - (result = odbc_getField(stmnt, 2, &type)) == - ISC_R_SUCCESS && - (result = odbc_getManyFields( - stmnt, 3, fields, &data)) == ISC_R_SUCCESS) - { - /* try to convert ttl string to int */ - ttl = strtol(ttl_s, &endp, 10); - /* failure converting ttl. */ - if (*endp != '\0' || ttl < 0) { - isc_log_write(dns_lctx, - DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, - ISC_LOG_ERROR, - "Odbc driver ttl must " - "be a positive number"); - result = ISC_R_FAILURE; - } else { - /* - * successful converting TTL, - * tell Bind everything - */ - result = dns_sdlz_putrr(lookup, type, - ttl, data); - } - } /* closes bid if () */ - } /* closes switch(fields) */ - - /* clean up mem */ - if (ttl_s != NULL) { - isc_mem_free(named_g_mctx, ttl_s); - } - if (type != NULL) { - isc_mem_free(named_g_mctx, type); - } - if (data != NULL) { - isc_mem_free(named_g_mctx, data); - } - - /* I sure hope we were successful */ - if (result != ISC_R_SUCCESS) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "dns_sdlz_putrr returned error. " - "Error code was: %s", - isc_result_totext(result)); - result = ISC_R_FAILURE; - goto process_rs_cleanup; - } - } /* closes while loop */ - -process_rs_cleanup: - - /* close cursor */ - SQLCloseCursor(((odbc_db_t *)(dbi->dbconn))->stmnt); - - /* free lock on dbi so someone else can use it. */ - isc_mutex_unlock(&dbi->instance_lock); - - return (result); -} - -/* - * SDLZ interface methods - */ - -/*% determine if the zone is supported by (in) the database */ - -static isc_result_t -odbc_findzone(void *driverarg, void *dbdata, const char *name, - dns_clientinfomethods_t *methods, dns_clientinfo_t *clientinfo) { - isc_result_t result; - dbinstance_t *dbi = NULL; - - UNUSED(driverarg); - UNUSED(methods); - UNUSED(clientinfo); - - /* run the query and get the result set from the database. */ - /* if result != ISC_R_SUCCESS cursor and mutex already cleaned up. */ - /* so we don't have to do it here. */ - result = odbc_get_resultset(name, NULL, NULL, FINDZONE, dbdata, &dbi); - - /* Check that we got a result set with data */ - if (result == ISC_R_SUCCESS && - !sqlOK(SQLFetch(((odbc_db_t *)(dbi->dbconn))->stmnt))) - { - result = ISC_R_NOTFOUND; - } - - if (dbi != NULL) { - /* get rid of result set, we are done with it. */ - SQLCloseCursor(((odbc_db_t *)(dbi->dbconn))->stmnt); - - /* free lock on dbi so someone else can use it. */ - isc_mutex_unlock(&dbi->instance_lock); - } - - return (result); -} - -/*% Determine if the client is allowed to perform a zone transfer */ -static isc_result_t -odbc_allowzonexfr(void *driverarg, void *dbdata, const char *name, - const char *client) { - isc_result_t result; - dbinstance_t *dbi = NULL; - - UNUSED(driverarg); - - /* first check if the zone is supported by the database. */ - result = odbc_findzone(driverarg, dbdata, name, NULL, NULL); - if (result != ISC_R_SUCCESS) { - return (ISC_R_NOTFOUND); - } - - /* - * if we get to this point we know the zone is supported by - * the database. the only questions now are is the zone - * transfer is allowed for this client and did the config file - * have an allow zone xfr query - * - * Run our query, and get a result set from the database. if - * result != ISC_R_SUCCESS cursor and mutex already cleaned - * up, so we don't have to do it here. - */ - result = odbc_get_resultset(name, NULL, client, ALLOWXFR, dbdata, &dbi); - - /* if we get "not implemented", send it along. */ - if (result == ISC_R_NOTIMPLEMENTED) { - return (result); - } - - /* Check that we got a result set with data */ - if (result == ISC_R_SUCCESS && - !sqlOK(SQLFetch(((odbc_db_t *)(dbi->dbconn))->stmnt))) - { - result = ISC_R_NOPERM; - } - - if (dbi != NULL) { - /* get rid of result set, we are done with it. */ - SQLCloseCursor(((odbc_db_t *)(dbi->dbconn))->stmnt); - - /* free lock on dbi so someone else can use it. */ - isc_mutex_unlock(&dbi->instance_lock); - } - - return (result); -} - -/*% - * If the client is allowed to perform a zone transfer, the next order of - * business is to get all the nodes in the zone, so bind can respond to the - * query. - */ - -static isc_result_t -odbc_allnodes(const char *zone, void *driverarg, void *dbdata, - dns_sdlzallnodes_t *allnodes) { - isc_result_t result; - dbinstance_t *dbi = NULL; - SQLHSTMT *stmnt; - SQLSMALLINT fields; - char *data; - char *type; - char *ttl_s; - int ttl; - char *host; - char *endp; - - UNUSED(driverarg); - - /* run the query and get the result set from the database. */ - result = odbc_get_resultset(zone, NULL, NULL, ALLNODES, dbdata, &dbi); - - /* if we get "not implemented", send it along */ - if (result == ISC_R_NOTIMPLEMENTED) { - return (result); - } - - /* if we didn't get a result set, log an err msg. */ - if (result != ISC_R_SUCCESS) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Odbc driver unable to return " - "result set for all nodes query"); - return (ISC_R_FAILURE); - } - - stmnt = ((odbc_db_t *)(dbi->dbconn))->stmnt; - - /* get number of columns */ - if (!sqlOK(SQLNumResultCols(stmnt, &fields))) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Odbc driver unable to process result set"); - result = ISC_R_FAILURE; - goto allnodes_cleanup; - } - - if (fields < 4) { /* gotta have at least 4 columns */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Odbc driver too few fields returned by " - "all nodes query"); - result = ISC_R_FAILURE; - goto allnodes_cleanup; - } - - /* get things ready for processing */ - result = ISC_R_FAILURE; - - while (sqlOK(SQLFetch(stmnt))) { - /* set to null for next pass through */ - data = host = type = ttl_s = NULL; - - /* - * attempt to get DNS ttl, type, host, data then tell - * Bind about them - */ - if ((result = odbc_getField(stmnt, 1, &ttl_s)) == - ISC_R_SUCCESS && - (result = odbc_getField(stmnt, 2, &type)) == - ISC_R_SUCCESS && - (result = odbc_getField(stmnt, 3, &host)) == - ISC_R_SUCCESS && - (result = odbc_getManyFields(stmnt, 4, fields, &data)) == - ISC_R_SUCCESS) - { - /* convert ttl string to int */ - ttl = strtol(ttl_s, &endp, 10); - /* failure converting ttl. */ - if (*endp != '\0' || ttl < 0) { - isc_log_write(dns_lctx, - DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Odbc driver ttl must be " - "a positive number"); - result = ISC_R_FAILURE; - } else { - /* successful converting TTL, tell Bind */ - result = dns_sdlz_putnamedrr(allnodes, host, - type, ttl, data); - } - } /* closes big if () */ - - /* clean up mem */ - if (ttl_s != NULL) { - isc_mem_free(named_g_mctx, ttl_s); - } - if (type != NULL) { - isc_mem_free(named_g_mctx, type); - } - if (host != NULL) { - isc_mem_free(named_g_mctx, host); - } - if (data != NULL) { - isc_mem_free(named_g_mctx, data); - } - - /* if we weren't successful, log err msg */ - if (result != ISC_R_SUCCESS) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "dns_sdlz_putnamedrr returned error. " - "Error code was: %s", - isc_result_totext(result)); - result = ISC_R_FAILURE; - goto allnodes_cleanup; - } - } /* closes while loop */ - -allnodes_cleanup: - - /* close cursor */ - SQLCloseCursor(((odbc_db_t *)(dbi->dbconn))->stmnt); - - /* free lock on dbi so someone else can use it. */ - isc_mutex_unlock(&dbi->instance_lock); - - return (result); -} - -/*% - * if the lookup function does not return SOA or NS records for the zone, - * use this function to get that information for Bind. - */ - -static isc_result_t -odbc_authority(const char *zone, void *driverarg, void *dbdata, - dns_sdlzlookup_t *lookup) { - isc_result_t result; - dbinstance_t *dbi = NULL; - - UNUSED(driverarg); - - /* run the query and get the result set from the database. */ - result = odbc_get_resultset(zone, NULL, NULL, AUTHORITY, dbdata, &dbi); - /* if we get "not implemented", send it along */ - if (result == ISC_R_NOTIMPLEMENTED) { - return (result); - } - /* if we didn't get a result set, log an err msg. */ - if (result != ISC_R_SUCCESS) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Odbc driver unable to return " - "result set for authority query"); - return (ISC_R_FAILURE); - } - /* lookup and authority result sets are processed in the same manner */ - /* odbc_process_rs does the job for both functions. */ - return (odbc_process_rs(lookup, dbi)); -} - -/*% if zone is supported, lookup up a (or multiple) record(s) in it */ - -static isc_result_t -odbc_lookup(const char *zone, const char *name, void *driverarg, void *dbdata, - dns_sdlzlookup_t *lookup, dns_clientinfomethods_t *methods, - dns_clientinfo_t *clientinfo) { - isc_result_t result; - dbinstance_t *dbi = NULL; - - UNUSED(driverarg); - UNUSED(methods); - UNUSED(clientinfo); - - /* run the query and get the result set from the database. */ - result = odbc_get_resultset(zone, name, NULL, LOOKUP, dbdata, &dbi); - /* if we didn't get a result set, log an err msg. */ - if (result != ISC_R_SUCCESS) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Odbc driver unable to return " - "result set for lookup query"); - return (ISC_R_FAILURE); - } - /* lookup and authority result sets are processed in the same manner */ - /* odbc_process_rs does the job for both functions. */ - return (odbc_process_rs(lookup, dbi)); -} - -/*% - * create an instance of the driver. Remember, only 1 copy of the driver's - * code is ever loaded, the driver has to remember which context it's - * operating in. This is done via use of the dbdata argument which is - * passed into all query functions. - */ -static isc_result_t -odbc_create(const char *dlzname, unsigned int argc, char *argv[], - void *driverarg, void **dbdata) { - isc_result_t result; - odbc_instance_t *odbc_inst = NULL; - dbinstance_t *db = NULL; - SQLRETURN sqlRes; - int dbcount; - int i; - char *endp; - - UNUSED(dlzname); - UNUSED(driverarg); - - /* if debugging, let user know we are multithreaded. */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_DEBUG(1), "Odbc driver running multithreaded"); - - /* verify we have at least 5 arg's passed to the driver */ - if (argc < 5) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Odbc driver requires at least " - "4 command line args."); - return (ISC_R_FAILURE); - } - - /* no more than 8 arg's should be passed to the driver */ - if (argc > 8) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Odbc driver cannot accept more than " - "7 command line args."); - return (ISC_R_FAILURE); - } - - /* multithreaded build can have multiple DB connections */ - /* check how many db connections we should create */ - dbcount = strtol(argv[1], &endp, 10); - if (*endp != '\0' || dbcount < 0) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Odbc driver database connection count " - "must be positive."); - return (ISC_R_FAILURE); - } - - /* allocate memory for odbc instance */ - odbc_inst = isc_mem_get(named_g_mctx, sizeof(odbc_instance_t)); - memset(odbc_inst, 0, sizeof(odbc_instance_t)); - - /* parse connection string and get parameters. */ - - /* get odbc database dsn - required */ - odbc_inst->dsn = (SQLCHAR *)getParameterValue(argv[2], "dsn="); - if (odbc_inst->dsn == NULL) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "odbc driver requires a dns parameter."); - result = ISC_R_FAILURE; - goto cleanup; - } - /* get odbc database username */ - /* if no username was passed, set odbc_inst.user = NULL; */ - odbc_inst->user = (SQLCHAR *)getParameterValue(argv[2], "user="); - - /* get odbc database password */ - /* if no password was passed, set odbc_inst.pass = NULL; */ - odbc_inst->pass = (SQLCHAR *)getParameterValue(argv[2], "pass="); - - /* create odbc environment & set environment to ODBC V3 */ - if (odbc_inst->sql_env == NULL) { - /* create environment handle */ - sqlRes = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, - &(odbc_inst->sql_env)); - if (!sqlOK(sqlRes)) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_INFO, - "Odbc driver unable to allocate memory"); - result = ISC_R_NOMEMORY; - goto cleanup; - } - /*set ODBC version = 3 */ - sqlRes = SQLSetEnvAttr(odbc_inst->sql_env, - SQL_ATTR_ODBC_VERSION, - (void *)SQL_OV_ODBC3, 0); - if (!sqlOK(sqlRes)) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_INFO, - "Unable to configure ODBC environment"); - result = ISC_R_NOMEMORY; - goto cleanup; - } - } - - /* allocate memory for database connection list */ - odbc_inst->db = isc_mem_get(named_g_mctx, sizeof(db_list_t)); - - /* initialize DB connection list */ - ISC_LIST_INIT(*odbc_inst->db); - - /* create the appropriate number of database instances (DBI) */ - /* append each new DBI to the end of the list */ - for (i = 0; i < dbcount; i++) { - /* how many queries were passed in from config file? */ - switch (argc) { - case 5: - result = build_sqldbinstance(named_g_mctx, NULL, NULL, - NULL, argv[3], argv[4], - NULL, &db); - break; - case 6: - result = build_sqldbinstance(named_g_mctx, NULL, NULL, - argv[5], argv[3], argv[4], - NULL, &db); - break; - case 7: - result = build_sqldbinstance(named_g_mctx, argv[6], - NULL, argv[5], argv[3], - argv[4], NULL, &db); - break; - case 8: - result = build_sqldbinstance(named_g_mctx, argv[6], - argv[7], argv[5], argv[3], - argv[4], NULL, &db); - break; - default: - /* not really needed, should shut up compiler. */ - result = ISC_R_FAILURE; - } - - /* unsuccessful?, log err msg and cleanup. */ - if (result != ISC_R_SUCCESS) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Odbc driver could not create " - "database instance object."); - goto cleanup; - } - - /* when multithreaded, build a list of DBI's */ - ISC_LINK_INIT(db, link); - ISC_LIST_APPEND(*odbc_inst->db, db, link); - - result = odbc_connect(odbc_inst, (odbc_db_t **)&(db->dbconn)); - - if (result != ISC_R_SUCCESS) { - /* - * if multi threaded, let user know which - * connection failed. user could be - * attempting to create 10 db connections and - * for some reason the db backend only allows - * 9. - */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Odbc driver failed to create database " - "connection number %u after 3 attempts", - i + 1); - goto cleanup; - } - - /* set DB = null for next loop through. */ - db = NULL; - } /* end for loop */ - - /* set dbdata to the odbc_instance we created. */ - *dbdata = odbc_inst; - - /* hey, we got through all of that ok, return success. */ - return (ISC_R_SUCCESS); - -cleanup: - - destroy_odbc_instance(odbc_inst); - - return (result); -} - -/*% - * destroy an instance of the driver. Remember, only 1 copy of the driver's - * code is ever loaded, the driver has to remember which context it's - * operating in. This is done via use of the dbdata argument. - * so we really only need to clean it up since we are not using driverarg. - */ - -static void -odbc_destroy(void *driverarg, void *dbdata) { - UNUSED(driverarg); - - destroy_odbc_instance((odbc_instance_t *)dbdata); -} - -/* pointers to all our runtime methods. */ -/* this is used during driver registration */ -/* i.e. in dlz_odbc_init below. */ -static dns_sdlzmethods_t dlz_odbc_methods = { - odbc_create, - odbc_destroy, - odbc_findzone, - odbc_lookup, - odbc_authority, - odbc_allnodes, - odbc_allowzonexfr, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, -}; - -/*% - * Wrapper around dns_sdlzregister(). - */ -isc_result_t -dlz_odbc_init(void) { - isc_result_t result; - - /* - * Write debugging message to log - */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_DEBUG(2), "Registering DLZ odbc driver."); - - /* - * Driver is always threadsafe. When multithreaded all - * functions use multithreaded code. When not multithreaded, - * all functions can only be entered once, but only 1 thread - * of operation is available in Bind. So everything is still - * threadsafe. - */ - result = dns_sdlzregister("odbc", &dlz_odbc_methods, NULL, - DNS_SDLZFLAG_RELATIVEOWNER | - DNS_SDLZFLAG_RELATIVERDATA | - DNS_SDLZFLAG_THREADSAFE, - named_g_mctx, &dlz_odbc); - /* if we can't register the driver, there are big problems. */ - if (result != ISC_R_SUCCESS) { - UNEXPECTED_ERROR(__FILE__, __LINE__, - "dns_sdlzregister() failed: %s", - isc_result_totext(result)); - result = ISC_R_UNEXPECTED; - } - - return (result); -} - -/*% - * Wrapper around dns_sdlzunregister(). - */ -void -dlz_odbc_clear(void) { - /* - * Write debugging message to log - */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_DEBUG(2), "Unregistering DLZ odbc driver."); - - /* unregister the driver. */ - if (dlz_odbc != NULL) { - dns_sdlzunregister(&dlz_odbc); - } -} - -#endif /* ifdef DLZ_ODBC */ diff --git a/contrib/dlz/drivers/dlz_postgres_driver.c b/contrib/dlz/drivers/dlz_postgres_driver.c deleted file mode 100644 index f67d843682..0000000000 --- a/contrib/dlz/drivers/dlz_postgres_driver.c +++ /dev/null @@ -1,1258 +0,0 @@ -/* - * Copyright (C) 2002 Stichting NLnet, Netherlands, stichting@nlnet.nl. - * - * Permission to use, copy, modify, and 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 STICHTING NLNET - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * STICHTING NLNET 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. - * - * The development of Dynamically Loadable Zones (DLZ) for Bind 9 was - * conceived and contributed by Rob Butler. - * - * Permission to use, copy, modify, and 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 ROB BUTLER - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * ROB BUTLER 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. - */ - -/* - * Copyright (C) 1999-2001, 2016 Internet Systems Consortium, Inc. ("ISC") - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -#ifdef DLZ_POSTGRES -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include - -/* temporarily include time. */ -#include -#include - -static dns_sdlzimplementation_t *dlz_postgres = NULL; - -#define dbc_search_limit 30 -#define ALLNODES 1 -#define ALLOWXFR 2 -#define AUTHORITY 3 -#define FINDZONE 4 -#define LOOKUP 5 - -/* - * Private methods - */ - -/* --------------- - * Escaping arbitrary strings to get valid SQL strings/identifiers. - * - * Replaces "\\" with "\\\\" and "'" with "''". - * length is the length of the buffer pointed to by - * from. The buffer at to must be at least 2*length + 1 characters - * long. A terminating NUL character is written. - * - * NOTICE!!! - * This function was borrowed directly from PostgreSQL's libpq. - * The function was originally called PQescapeString and renamed - * to postgres_makesafe to avoid a naming collision. - * PQescapeString is a new function made available in Postgres 7.2. - * For some reason the function is not properly exported on Win32 - * builds making the function unavailable on Windows. Also, since - * this function is new it would require building this driver with - * the libpq 7.2. By borrowing this function the Windows problem - * is solved, and the dependence on libpq 7.2 is removed. Libpq is - * still required of course, but an older version should work now too. - * - * The copyright statements from the original file containing this - * function are included below: - * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group - * Portions Copyright (c) 1994, Regents of the University of California - * --------------- - */ - -static size_t -postgres_makesafe(char *to, const char *from, size_t length) { - const char *source = from; - char *target = to; - unsigned int remaining = length; - - while (remaining > 0) { - switch (*source) { - case '\\': - *target = '\\'; - target++; - *target = '\\'; - /* target and remaining are updated below. */ - break; - - case '\'': - *target = '\''; - target++; - *target = '\''; - /* target and remaining are updated below. */ - break; - - default: - *target = *source; - /* target and remaining are updated below. */ - } - source++; - target++; - remaining--; - } - - /* Write the terminating NUL character. */ - *target = '\0'; - - return (target - to); -} - -/*% - * Properly cleans up a list of database instances. - * This function is only used when the driver is compiled for - * multithreaded operation. - */ -static void -postgres_destroy_dblist(db_list_t *dblist) { - dbinstance_t *ndbi = NULL; - dbinstance_t *dbi = NULL; - - /* get the first DBI in the list */ - ndbi = ISC_LIST_HEAD(*dblist); - - /* loop through the list */ - while (ndbi != NULL) { - dbi = ndbi; - /* get the next DBI in the list */ - ndbi = ISC_LIST_NEXT(dbi, link); - /* release DB connection */ - if (dbi->dbconn != NULL) { - PQfinish((PGconn *)dbi->dbconn); - } - /* release all memory that comprised a DBI */ - destroy_sqldbinstance(dbi); - } - /* release memory for the list structure */ - isc_mem_put(named_g_mctx, dblist, sizeof(db_list_t)); -} - -/*% - * Loops through the list of DB instances, attempting to lock - * on the mutex. If successful, the DBI is reserved for use - * and the thread can perform queries against the database. - * If the lock fails, the next one in the list is tried. - * looping continues until a lock is obtained, or until - * the list has been searched dbc_search_limit times. - * This function is only used when the driver is compiled for - * multithreaded operation. - */ - -static dbinstance_t * -postgres_find_avail_conn(db_list_t *dblist) { - dbinstance_t *dbi = NULL; - dbinstance_t *head; - int count = 0; - - /* get top of list */ - head = dbi = ISC_LIST_HEAD(*dblist); - - /* loop through list */ - while (count < dbc_search_limit) { - /* try to lock on the mutex */ - if (isc_mutex_trylock(&dbi->instance_lock) == ISC_R_SUCCESS) { - return (dbi); /* success, return the DBI for use. */ - } - /* not successful, keep trying */ - dbi = ISC_LIST_NEXT(dbi, link); - - /* check to see if we have gone to the top of the list. */ - if (dbi == NULL) { - count++; - dbi = head; - } - } - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_INFO, - "Postgres driver unable to find available connection " - "after searching %d times", - count); - return (NULL); -} - -/*% - * Allocates memory for a new string, and then constructs the new - * string by "escaping" the input string. The new string is - * safe to be used in queries. This is necessary because we cannot - * be sure of what types of strings are passed to us, and we don't - * want special characters in the string causing problems. - */ - -static char * -postgres_escape_string(const char *instr) { - char *outstr; - unsigned int len; - - if (instr == NULL) { - return (NULL); - } - - len = strlen(instr); - - outstr = isc_mem_allocate(named_g_mctx, (2 * len * sizeof(char)) + 1); - - postgres_makesafe(outstr, instr, len); - /* PQescapeString(outstr, instr, len); */ - - return (outstr); -} - -/*% - * This function is the real core of the driver. Zone, record - * and client strings are passed in (or NULL is passed if the - * string is not available). The type of query we want to run - * is indicated by the query flag, and the dbdata object is passed - * passed in to. dbdata really holds either: - * 1) a list of database instances (in multithreaded mode) OR - * 2) a single database instance (in single threaded mode) - * The function will construct the query and obtain an available - * database instance (DBI). It will then run the query and hopefully - * obtain a result set. Postgres is nice, in that once the result - * set is returned, we can make the db connection available for another - * thread to use, while this thread continues on. So, the DBI is made - * available ASAP by unlocking the instance_lock after we have cleaned - * it up properly. - */ -static isc_result_t -postgres_get_resultset(const char *zone, const char *record, const char *client, - unsigned int query, void *dbdata, PGresult **rs) { - isc_result_t result; - dbinstance_t *dbi = NULL; - char *querystring = NULL; - unsigned int i = 0; - unsigned int j = 0; - -#if 0 - /* temporarily get a unique thread # */ - unsigned int dlz_thread_num = 1 + - (int) (1000.0 * rand() / - (RAND_MAX + 1.0)); -#endif /* if 0 */ - - REQUIRE(*rs == NULL); - -#if 0 - /* temporary logging message */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "%d Getting DBI", dlz_thread_num); -#endif /* if 0 */ - - /* get db instance / connection */ - - /* find an available DBI from the list */ - dbi = postgres_find_avail_conn((db_list_t *)dbdata); - -#if 0 - /* temporary logging message */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "%d Got DBI - checking query", dlz_thread_num); -#endif /* if 0 */ - - /* if DBI is null, can't do anything else */ - if (dbi == NULL) { - return (ISC_R_FAILURE); - } - - /* what type of query are we going to run? */ - switch (query) { - case ALLNODES: - /* - * if the query was not passed in from the config file - * then we can't run it. return not_implemented, so - * it's like the code for that operation was never - * built into the driver.... AHHH flexibility!!! - */ - if (dbi->allnodes_q == NULL) { - result = ISC_R_NOTIMPLEMENTED; - goto cleanup; - } - break; - case ALLOWXFR: - /* same as comments as ALLNODES */ - if (dbi->allowxfr_q == NULL) { - result = ISC_R_NOTIMPLEMENTED; - goto cleanup; - } - break; - case AUTHORITY: - /* same as comments as ALLNODES */ - if (dbi->authority_q == NULL) { - result = ISC_R_NOTIMPLEMENTED; - goto cleanup; - } - break; - case FINDZONE: - /* this is required. It's the whole point of DLZ! */ - if (dbi->findzone_q == NULL) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(2), - "No query specified for findzone. " - "Findzone requires a query"); - result = ISC_R_FAILURE; - goto cleanup; - } - break; - case LOOKUP: - /* this is required. It's also a major point of DLZ! */ - if (dbi->lookup_q == NULL) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(2), - "No query specified for lookup. " - "Lookup requires a query"); - result = ISC_R_FAILURE; - goto cleanup; - } - break; - default: - /* - * this should never happen. If it does, the code is - * screwed up! - */ - UNEXPECTED_ERROR(__FILE__, __LINE__, - "Incorrect query flag passed to " - "postgres_get_resultset"); - result = ISC_R_UNEXPECTED; - goto cleanup; - } - -#if 0 - /* temporary logging message */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "%d checked query", dlz_thread_num); -#endif /* if 0 */ - - /* - * was a zone string passed? If so, make it safe for use in - * queries. - */ - if (zone != NULL) { - dbi->zone = postgres_escape_string(zone); - if (dbi->zone == NULL) { - result = ISC_R_NOMEMORY; - goto cleanup; - } - } else { /* no string passed, set the string pointer to NULL */ - dbi->zone = NULL; - } - -#if 0 - /* temporary logging message */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "%d did zone", dlz_thread_num); -#endif /* if 0 */ - - /* - * was a record string passed? If so, make it safe for use in - * queries. - */ - if (record != NULL) { - dbi->record = postgres_escape_string(record); - if (dbi->record == NULL) { - result = ISC_R_NOMEMORY; - goto cleanup; - } - } else { /* no string passed, set the string pointer to NULL */ - dbi->record = NULL; - } - -#if 0 - /* temporary logging message */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "%d did record", dlz_thread_num); -#endif /* if 0 */ - - /* - * was a client string passed? If so, make it safe for use in - * queries. - */ - if (client != NULL) { - dbi->client = postgres_escape_string(client); - if (dbi->client == NULL) { - result = ISC_R_NOMEMORY; - goto cleanup; - } - } else { /* no string passed, set the string pointer to NULL */ - dbi->client = NULL; - } - -#if 0 - /* temporary logging message */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "%d did client", dlz_thread_num); -#endif /* if 0 */ - - /* - * what type of query are we going to run? - * this time we build the actual query to run. - */ - switch (query) { - case ALLNODES: - querystring = build_querystring(named_g_mctx, dbi->allnodes_q); - break; - case ALLOWXFR: - querystring = build_querystring(named_g_mctx, dbi->allowxfr_q); - break; - case AUTHORITY: - querystring = build_querystring(named_g_mctx, dbi->authority_q); - break; - case FINDZONE: - querystring = build_querystring(named_g_mctx, dbi->findzone_q); - break; - case LOOKUP: - querystring = build_querystring(named_g_mctx, dbi->lookup_q); - break; - default: - /* - * this should never happen. If it does, the code is - * screwed up! - */ - UNEXPECTED_ERROR(__FILE__, __LINE__, - "Incorrect query flag passed to " - "postgres_get_resultset"); - result = ISC_R_UNEXPECTED; - goto cleanup; - } - -#if 0 - /* temporary logging message */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "%d built query", dlz_thread_num); -#endif /* if 0 */ - - /* if the querystring is null, Bummer, outta RAM. UPGRADE TIME!!! */ - if (querystring == NULL) { - result = ISC_R_NOMEMORY; - goto cleanup; - } - -#if 0 - /* temporary logging message */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "%d query is '%s'", dlz_thread_num, querystring); -#endif /* if 0 */ - - /* - * output the full query string during debug so we can see - * what lame error the query has. - */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_DEBUG(1), "\nQuery String: %s\n", querystring); - - /* attempt query up to 3 times. */ - for (j = 0; j < 3; j++) { -#if 0 - /* temporary logging message */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "%d executing query for %d time", - dlz_thread_num, j); -#endif /* if 0 */ - /* try to get result set */ - *rs = PQexec((PGconn *)dbi->dbconn, querystring); - result = ISC_R_SUCCESS; - /* - * if result set is null, reset DB connection, max 3 - * attempts. - */ - for (i = 0; *rs == NULL && i < 3; i++) { -#if 0 - /* temporary logging message */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "%d resetting connection", - dlz_thread_num); -#endif /* if 0 */ - result = ISC_R_FAILURE; - PQreset((PGconn *)dbi->dbconn); - /* connection ok, break inner loop */ - if (PQstatus((PGconn *)dbi->dbconn) == CONNECTION_OK) { - break; - } - } - /* result set ok, break outer loop */ - if (PQresultStatus(*rs) == PGRES_TUPLES_OK) { -#if 0 - /* temporary logging message */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "%d rs ok", dlz_thread_num); -#endif /* if 0 */ - break; - } else { - /* we got a result set object, but it's not right. */ -#if 0 - /* temporary logging message */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "%d clearing rs", dlz_thread_num); -#endif /* if 0 */ - PQclear(*rs); /* get rid of it */ - /* in case this was the last attempt */ - *rs = NULL; - result = ISC_R_FAILURE; - } - } - -cleanup: - /* it's always good to cleanup after yourself */ - -#if 0 - /* temporary logging message */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "%d cleaning up", dlz_thread_num); -#endif /* if 0 */ - - /* free dbi->zone string */ - if (dbi->zone != NULL) { - isc_mem_free(named_g_mctx, dbi->zone); - } - - /* free dbi->record string */ - if (dbi->record != NULL) { - isc_mem_free(named_g_mctx, dbi->record); - } - - /* free dbi->client string */ - if (dbi->client != NULL) { - isc_mem_free(named_g_mctx, dbi->client); - } - -#if 0 - /* temporary logging message */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "%d unlocking mutex", dlz_thread_num); -#endif /* if 0 */ - - /* release the lock so another thread can use this dbi */ - isc_mutex_unlock(&dbi->instance_lock); - - /* release query string */ - if (querystring != NULL) { - isc_mem_free(named_g_mctx, querystring); - } - -#if 0 - /* temporary logging message */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "%d returning", dlz_thread_num); -#endif /* if 0 */ - - /* return result */ - return (result); -} - -/*% - * The processing of result sets for lookup and authority are - * exactly the same. So that functionality has been moved - * into this function to minimize code. - */ - -static isc_result_t -postgres_process_rs(dns_sdlzlookup_t *lookup, PGresult *rs) { - isc_result_t result; - unsigned int i; - unsigned int rows; - unsigned int fields; - unsigned int j; - unsigned int len; - char *tmpString; - char *endp; - int ttl; - - rows = PQntuples(rs); /* how many rows in result set */ - fields = PQnfields(rs); /* how many columns in result set */ - for (i = 0; i < rows; i++) { - switch (fields) { - case 1: - /* - * one column in rs, it's the data field. use - * default type of A record, and default TTL - * of 86400 - */ - result = dns_sdlz_putrr(lookup, "a", 86400, - PQgetvalue(rs, i, 0)); - break; - case 2: - /* two columns, data field, and data type. - * use default TTL of 86400. - */ - result = dns_sdlz_putrr(lookup, PQgetvalue(rs, i, 0), - 86400, PQgetvalue(rs, i, 1)); - break; - case 3: - /* three columns, all data no defaults. - * convert text to int, make sure it worked - * right. - */ - ttl = strtol(PQgetvalue(rs, i, 0), &endp, 10); - if (*endp != '\0' || ttl < 0) { - isc_log_write(dns_lctx, - DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Postgres driver ttl must be " - "a positive number"); - } - result = dns_sdlz_putrr(lookup, PQgetvalue(rs, i, 1), - ttl, PQgetvalue(rs, i, 2)); - break; - default: - /* - * more than 3 fields, concatenate the last - * ones together. figure out how long to make - * string - */ - for (j = 2, len = 0; j < fields; j++) { - len += strlen(PQgetvalue(rs, i, j)) + 1; - } - /* - * allocate string memory, allow for NULL to - * term string - */ - tmpString = isc_mem_allocate(named_g_mctx, len + 1); - /* copy field to tmpString */ - strcpy(tmpString, PQgetvalue(rs, i, 2)); - /* - * concat the rest of fields together, space - * between each one. - */ - for (j = 3; j < fields; j++) { - strcat(tmpString, " "); - strcat(tmpString, PQgetvalue(rs, i, j)); - } - /* convert text to int, make sure it worked right */ - ttl = strtol(PQgetvalue(rs, i, 0), &endp, 10); - if (*endp != '\0' || ttl < 0) { - isc_log_write(dns_lctx, - DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Postgres driver ttl must be " - "a positive number"); - } - /* ok, now tell Bind about it. */ - result = dns_sdlz_putrr(lookup, PQgetvalue(rs, i, 1), - ttl, tmpString); - /* done, get rid of this thing. */ - isc_mem_free(named_g_mctx, tmpString); - } - /* I sure hope we were successful */ - if (result != ISC_R_SUCCESS) { - /* nope, get rid of the Result set, and log a msg */ - PQclear(rs); - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "dns_sdlz_putrr returned error. " - "Error code was: %s", - isc_result_totext(result)); - return (ISC_R_FAILURE); - } - } - - /* free result set memory */ - PQclear(rs); - - /* if we did return results, we are successful */ - if (rows > 0) { - return (ISC_R_SUCCESS); - } - - /* empty result set, no data found */ - return (ISC_R_NOTFOUND); -} - -/* - * SDLZ interface methods - */ - -/*% determine if the zone is supported by (in) the database */ - -static isc_result_t -postgres_findzone(void *driverarg, void *dbdata, const char *name, - dns_clientinfomethods_t *methods, - dns_clientinfo_t *clientinfo) { - isc_result_t result; - PGresult *rs = NULL; - unsigned int rows; - - UNUSED(driverarg); - UNUSED(methods); - UNUSED(clientinfo); - - /* run the query and get the result set from the database. */ - result = postgres_get_resultset(name, NULL, NULL, FINDZONE, dbdata, - &rs); - /* if we didn't get a result set, log an err msg. */ - if (result != ISC_R_SUCCESS) { - if (rs != NULL) { - PQclear(rs); - } - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Postgres driver unable to return " - "result set for findzone query"); - return (ISC_R_FAILURE); - } - /* count how many rows in result set */ - rows = PQntuples(rs); - /* get rid of result set, we are done with it. */ - PQclear(rs); - - /* if we returned any rows, zone is supported. */ - if (rows > 0) { - return (ISC_R_SUCCESS); - } - - /* no rows returned, zone is not supported. */ - return (ISC_R_NOTFOUND); -} - -/*% Determine if the client is allowed to perform a zone transfer */ -static isc_result_t -postgres_allowzonexfr(void *driverarg, void *dbdata, const char *name, - const char *client) { - isc_result_t result; - PGresult *rs = NULL; - unsigned int rows; - UNUSED(driverarg); - - /* first check if the zone is supported by the database. */ - result = postgres_findzone(driverarg, dbdata, name, NULL, NULL); - if (result != ISC_R_SUCCESS) { - return (ISC_R_NOTFOUND); - } - - /* - * if we get to this point we know the zone is supported by - * the database the only questions now are is the zone - * transfer is allowed for this client and did the config file - * have an allow zone xfr query. - * - * Run our query, and get a result set from the database. - */ - result = postgres_get_resultset(name, NULL, client, ALLOWXFR, dbdata, - &rs); - /* if we get "not implemented", send it along. */ - if (result == ISC_R_NOTIMPLEMENTED) { - return (result); - } - /* if we didn't get a result set, log an err msg. */ - if (result != ISC_R_SUCCESS) { - if (rs != NULL) { - PQclear(rs); - } - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Postgres driver unable to return " - "result set for allow xfr query"); - return (ISC_R_FAILURE); - } - /* count how many rows in result set */ - rows = PQntuples(rs); - /* get rid of result set, we are done with it. */ - PQclear(rs); - - /* if we returned any rows, zone xfr is allowed. */ - if (rows > 0) { - return (ISC_R_SUCCESS); - } - - /* no rows returned, zone xfr not allowed */ - return (ISC_R_NOPERM); -} - -/*% - * If the client is allowed to perform a zone transfer, the next order of - * business is to get all the nodes in the zone, so bind can respond to the - * query. - */ -static isc_result_t -postgres_allnodes(const char *zone, void *driverarg, void *dbdata, - dns_sdlzallnodes_t *allnodes) { - isc_result_t result; - PGresult *rs = NULL; - unsigned int i; - unsigned int rows; - unsigned int fields; - unsigned int j; - unsigned int len; - char *tmpString; - char *endp; - int ttl; - - UNUSED(driverarg); - - /* run the query and get the result set from the database. */ - result = postgres_get_resultset(zone, NULL, NULL, ALLNODES, dbdata, - &rs); - /* if we get "not implemented", send it along */ - if (result == ISC_R_NOTIMPLEMENTED) { - return (result); - } - /* if we didn't get a result set, log an err msg. */ - if (result != ISC_R_SUCCESS) { - if (rs != NULL) { - PQclear(rs); - } - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Postgres driver unable to return " - "result set for all nodes query"); - return (ISC_R_FAILURE); - } - - rows = PQntuples(rs); /* how many rows in result set */ - fields = PQnfields(rs); /* how many columns in result set */ - for (i = 0; i < rows; i++) { - if (fields < 4) { /* gotta have at least 4 columns */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Postgres driver too few fields " - "returned by all nodes query"); - } - /* convert text to int, make sure it worked right */ - ttl = strtol(PQgetvalue(rs, i, 0), &endp, 10); - if (*endp != '\0' || ttl < 0) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Postgres driver ttl must be " - "a positive number"); - } - if (fields == 4) { - /* tell Bind about it. */ - result = dns_sdlz_putnamedrr(allnodes, - PQgetvalue(rs, i, 2), - PQgetvalue(rs, i, 1), ttl, - PQgetvalue(rs, i, 3)); - } else { - /* - * more than 4 fields, concatonat the last - * ones together. figure out how long to make - * string - */ - for (j = 3, len = 0; j < fields; j++) { - len += strlen(PQgetvalue(rs, i, j)) + 1; - } - /* allocate memory, allow for NULL to term string */ - tmpString = isc_mem_allocate(named_g_mctx, len + 1); - /* copy this field to tmpString */ - strcpy(tmpString, PQgetvalue(rs, i, 3)); - /* concatenate the rest, with spaces between */ - for (j = 4; j < fields; j++) { - strcat(tmpString, " "); - strcat(tmpString, PQgetvalue(rs, i, j)); - } - /* tell Bind about it. */ - result = dns_sdlz_putnamedrr( - allnodes, PQgetvalue(rs, i, 2), - PQgetvalue(rs, i, 1), ttl, tmpString); - isc_mem_free(named_g_mctx, tmpString); - } - /* if we weren't successful, log err msg */ - if (result != ISC_R_SUCCESS) { - PQclear(rs); - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "dns_sdlz_putnamedrr returned error. " - "Error code was: %s", - isc_result_totext(result)); - return (ISC_R_FAILURE); - } - } - - /* free result set memory */ - PQclear(rs); - - /* if we did return results, we are successful */ - if (rows > 0) { - return (ISC_R_SUCCESS); - } - - /* empty result set, no data found */ - return (ISC_R_NOTFOUND); -} - -/*% - * if the lookup function does not return SOA or NS records for the zone, - * use this function to get that information for Bind. - */ - -static isc_result_t -postgres_authority(const char *zone, void *driverarg, void *dbdata, - dns_sdlzlookup_t *lookup) { - isc_result_t result; - PGresult *rs = NULL; - - UNUSED(driverarg); - - /* run the query and get the result set from the database. */ - result = postgres_get_resultset(zone, NULL, NULL, AUTHORITY, dbdata, - &rs); - /* if we get "not implemented", send it along */ - if (result == ISC_R_NOTIMPLEMENTED) { - return (result); - } - /* if we didn't get a result set, log an err msg. */ - if (result != ISC_R_SUCCESS) { - if (rs != NULL) { - PQclear(rs); - } - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Postgres driver unable to return " - "result set for authority query"); - return (ISC_R_FAILURE); - } - /* - * lookup and authority result sets are processed in the same - * manner postgres_process_rs does the job for both - * functions. - */ - return (postgres_process_rs(lookup, rs)); -} - -/*% if zone is supported, lookup up a (or multiple) record(s) in it */ -static isc_result_t -postgres_lookup(const char *zone, const char *name, void *driverarg, - void *dbdata, dns_sdlzlookup_t *lookup, - dns_clientinfomethods_t *methods, - dns_clientinfo_t *clientinfo) { - isc_result_t result; - PGresult *rs = NULL; - - UNUSED(driverarg); - UNUSED(methods); - UNUSED(clientinfo); - - /* run the query and get the result set from the database. */ - result = postgres_get_resultset(zone, name, NULL, LOOKUP, dbdata, &rs); - /* if we didn't get a result set, log an err msg. */ - if (result != ISC_R_SUCCESS) { - if (rs != NULL) { - PQclear(rs); - } - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Postgres driver unable to " - "return result set for lookup query"); - return (ISC_R_FAILURE); - } - /* - * lookup and authority result sets are processed in the same - * manner postgres_process_rs does the job for both functions. - */ - return (postgres_process_rs(lookup, rs)); -} - -/*% - * create an instance of the driver. Remember, only 1 copy of the driver's - * code is ever loaded, the driver has to remember which context it's - * operating in. This is done via use of the dbdata argument which is - * passed into all query functions. - */ -static isc_result_t -postgres_create(const char *dlzname, unsigned int argc, char *argv[], - void *driverarg, void **dbdata) { - isc_result_t result; - dbinstance_t *dbi = NULL; - unsigned int j; - - /* if multi-threaded, we need a few extra variables. */ - int dbcount; - db_list_t *dblist = NULL; - int i; - char *endp; - - UNUSED(driverarg); - UNUSED(dlzname); - - /* seed random # generator */ - srand((unsigned)time(NULL)); - - /* if debugging, let user know we are multithreaded. */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_DEBUG(1), - "Postgres driver running multithreaded"); - - /* verify we have at least 5 arg's passed to the driver */ - if (argc < 5) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Postgres driver requires at least " - "4 command line args."); - return (ISC_R_FAILURE); - } - - /* no more than 8 arg's should be passed to the driver */ - if (argc > 8) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Postgres driver cannot accept more than " - "7 command line args."); - return (ISC_R_FAILURE); - } - - /* multithreaded build can have multiple DB connections */ - - /* check how many db connections we should create */ - dbcount = strtol(argv[1], &endp, 10); - if (*endp != '\0' || dbcount < 0) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Postgres driver database connection count " - "must be positive."); - return (ISC_R_FAILURE); - } - - /* allocate memory for database connection list */ - dblist = isc_mem_get(named_g_mctx, sizeof(db_list_t)); - - /* initialize DB connection list */ - ISC_LIST_INIT(*dblist); - - /* - * create the appropriate number of database instances (DBI) - * append each new DBI to the end of the list - */ - for (i = 0; i < dbcount; i++) { - /* how many queries were passed in from config file? */ - switch (argc) { - case 5: - result = build_sqldbinstance(named_g_mctx, NULL, NULL, - NULL, argv[3], argv[4], - NULL, &dbi); - break; - case 6: - result = build_sqldbinstance(named_g_mctx, NULL, NULL, - argv[5], argv[3], argv[4], - NULL, &dbi); - break; - case 7: - result = build_sqldbinstance(named_g_mctx, argv[6], - NULL, argv[5], argv[3], - argv[4], NULL, &dbi); - break; - case 8: - result = build_sqldbinstance(named_g_mctx, argv[6], - argv[7], argv[5], argv[3], - argv[4], NULL, &dbi); - break; - default: - /* not really needed, should shut up compiler. */ - result = ISC_R_FAILURE; - } - - if (result == ISC_R_SUCCESS) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(2), - "Postgres driver created database " - "instance object."); - } else { /* unsuccessful?, log err msg and cleanup. */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Postgres driver could not create " - "database instance object."); - goto cleanup; - } - - /* when multithreaded, build a list of DBI's */ - ISC_LINK_INIT(dbi, link); - ISC_LIST_APPEND(*dblist, dbi, link); - - /* create and set db connection */ - dbi->dbconn = PQconnectdb(argv[2]); - /* - * if db connection cannot be created, log err msg and - * cleanup. - */ - if (dbi->dbconn == NULL) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Postgres driver could not allocate " - "memory for database connection"); - goto cleanup; - } - - /* if we cannot connect the first time, try 3 more times. */ - for (j = 0; - PQstatus((PGconn *)dbi->dbconn) != CONNECTION_OK && j < 3; - j++) - PQreset((PGconn *)dbi->dbconn); - - /* - * if multi threaded, let user know which connection - * failed. user could be attempting to create 10 db - * connections and for some reason the db backend only - * allows 9 - */ - if (PQstatus((PGconn *)dbi->dbconn) != CONNECTION_OK) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Postgres driver failed to create " - "database connection number %u " - "after 4 attempts", - i + 1); - goto cleanup; - } - - /* set DBI = null for next loop through. */ - dbi = NULL; - } /* end for loop */ - - /* set dbdata to the list we created. */ - *dbdata = dblist; - - /* hey, we got through all of that ok, return success. */ - return (ISC_R_SUCCESS); - -cleanup: - - /* - * if multithreaded, we could fail because only 1 connection - * couldn't be made. We should cleanup the other successful - * connections properly. - */ - postgres_destroy_dblist(dblist); - - return (ISC_R_FAILURE); -} - -/*% - * destroy an instance of the driver. Remember, only 1 copy of the driver's - * code is ever loaded, the driver has to remember which context it's - * operating in. This is done via use of the dbdata argument. - * so we really only need to clean it up since we are not using driverarg. - */ -static void -postgres_destroy(void *driverarg, void *dbdata) { - UNUSED(driverarg); - /* cleanup the list of DBI's */ - postgres_destroy_dblist((db_list_t *)dbdata); -} - -/* pointers to all our runtime methods. */ -/* this is used during driver registration */ -/* i.e. in dlz_postgres_init below. */ -static dns_sdlzmethods_t dlz_postgres_methods = { - postgres_create, - postgres_destroy, - postgres_findzone, - postgres_lookup, - postgres_authority, - postgres_allnodes, - postgres_allowzonexfr, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, -}; - -/*% - * Wrapper around dns_sdlzregister(). - */ -isc_result_t -dlz_postgres_init(void) { - isc_result_t result; - - /* - * Write debugging message to log - */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_DEBUG(2), "Registering DLZ postgres driver."); - - /* - * Driver is always threadsafe. When multithreaded all - * functions use multithreaded code. When not multithreaded, - * all functions can only be entered once, but only 1 thread - * of operation is available in Bind. So everything is still - * threadsafe. - */ - result = dns_sdlzregister("postgres", &dlz_postgres_methods, NULL, - DNS_SDLZFLAG_RELATIVEOWNER | - DNS_SDLZFLAG_RELATIVERDATA | - DNS_SDLZFLAG_THREADSAFE, - named_g_mctx, &dlz_postgres); - /* if we can't register the driver, there are big problems. */ - if (result != ISC_R_SUCCESS) { - UNEXPECTED_ERROR(__FILE__, __LINE__, - "dns_sdlzregister() failed: %s", - isc_result_totext(result)); - result = ISC_R_UNEXPECTED; - } - - return (result); -} - -/*% - * Wrapper around dns_sdlzunregister(). - */ -void -dlz_postgres_clear(void) { - /* - * Write debugging message to log - */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_DEBUG(2), "Unregistering DLZ postgres driver."); - - /* unregister the driver. */ - if (dlz_postgres != NULL) { - dns_sdlzunregister(&dlz_postgres); - } -} - -#endif /* ifdef DLZ_POSTGRES */ diff --git a/contrib/dlz/drivers/dlz_stub_driver.c b/contrib/dlz/drivers/dlz_stub_driver.c deleted file mode 100644 index 26b5aa8cd2..0000000000 --- a/contrib/dlz/drivers/dlz_stub_driver.c +++ /dev/null @@ -1,316 +0,0 @@ -/* - * Copyright (C) 2002 Stichting NLnet, Netherlands, stichting@nlnet.nl. - * - * Permission to use, copy, modify, and 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 STICHTING NLNET - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * STICHTING NLNET 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. - * - * The development of Dynamically Loadable Zones (DLZ) for Bind 9 was - * conceived and contributed by Rob Butler. - * - * Permission to use, copy, modify, and 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 ROB BUTLER - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * ROB BUTLER 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. - */ - -/* - * Copyright (C) 1999-2001, 2016 Internet Systems Consortium, Inc. ("ISC") - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -#ifdef DLZ_STUB -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include - -#include -#include - -static dns_sdlzimplementation_t *dlz_stub = NULL; - -typedef struct config_data { - char *myzone; - char *myname; - char *myip; - isc_mem_t *mctx; -} config_data_t; - -/* - * SDLZ methods - */ - -static isc_result_t -stub_dlz_allnodes(const char *zone, void *driverarg, void *dbdata, - dns_sdlzallnodes_t *allnodes) { - config_data_t *cd; - isc_result_t result; - - UNUSED(zone); - UNUSED(driverarg); - - cd = (config_data_t *)dbdata; - - result = dns_sdlz_putnamedrr(allnodes, cd->myname, "soa", 86400, - "web root.localhost. " - "0 28800 7200 604800 86400"); - if (result != ISC_R_SUCCESS) { - return (ISC_R_FAILURE); - } - result = dns_sdlz_putnamedrr(allnodes, "ns", "ns", 86400, cd->myname); - if (result != ISC_R_SUCCESS) { - return (ISC_R_FAILURE); - } - result = dns_sdlz_putnamedrr(allnodes, cd->myname, "a", 1, cd->myip); - if (result != ISC_R_SUCCESS) { - return (ISC_R_FAILURE); - } - return (ISC_R_SUCCESS); -} - -static isc_result_t -stub_dlz_allowzonexfr(void *driverarg, void *dbdata, const char *name, - const char *client) { - config_data_t *cd; - - UNUSED(driverarg); - UNUSED(client); - - cd = (config_data_t *)dbdata; - - if (strcmp(name, cd->myname) == 0) { - return (ISC_R_SUCCESS); - } - return (ISC_R_NOTFOUND); -} - -static isc_result_t -stub_dlz_authority(const char *zone, void *driverarg, void *dbdata, - dns_sdlzlookup_t *lookup) { - isc_result_t result; - config_data_t *cd; - - UNUSED(driverarg); - - cd = (config_data_t *)dbdata; - - if (strcmp(zone, cd->myzone) == 0) { - result = dns_sdlz_putsoa(lookup, cd->myname, "root.localhost.", - 0); - if (result != ISC_R_SUCCESS) { - return (ISC_R_FAILURE); - } - - result = dns_sdlz_putrr(lookup, "ns", 86400, cd->myname); - if (result != ISC_R_SUCCESS) { - return (ISC_R_FAILURE); - } - - return (ISC_R_SUCCESS); - } - return (ISC_R_NOTFOUND); -} - -static isc_result_t -stub_dlz_findzonedb(void *driverarg, void *dbdata, const char *name, - dns_clientinfomethods_t *methods, - dns_clientinfo_t *clientinfo) { - config_data_t *cd; - - UNUSED(driverarg); - UNUSED(methods); - UNUSED(clientinfo); - - cd = (config_data_t *)dbdata; - - /* Write info message to log */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_DEBUG(2), "dlz_stub findzone looking for '%s'", - name); - - if (strcmp(cd->myzone, name) == 0) { - return (ISC_R_SUCCESS); - } else { - return (ISC_R_NOTFOUND); - } -} - -static isc_result_t -stub_dlz_lookup(const char *zone, const char *name, void *driverarg, - void *dbdata, dns_sdlzlookup_t *lookup, - dns_clientinfomethods_t *methods, - dns_clientinfo_t *clientinfo) { - isc_result_t result; - config_data_t *cd; - - UNUSED(zone); - UNUSED(driverarg); - UNUSED(methods); - UNUSED(clientinfo); - - cd = (config_data_t *)dbdata; - - if (strcmp(name, cd->myname) == 0) { - result = dns_sdlz_putrr(lookup, "a", 1, cd->myip); - if (result != ISC_R_SUCCESS) { - return (ISC_R_FAILURE); - } - - return (ISC_R_SUCCESS); - } - return (ISC_R_FAILURE); -} - -static isc_result_t -stub_dlz_create(const char *dlzname, unsigned int argc, char *argv[], - void *driverarg, void **dbdata) { - config_data_t *cd; - - UNUSED(driverarg); - - if (argc < 4) { - return (ISC_R_FAILURE); - } - /* - * Write info message to log - */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_INFO, - "Loading '%s' using DLZ_stub driver. " - "Zone: %s, Name: %s IP: %s", - dlzname, argv[1], argv[2], argv[3]); - - cd = isc_mem_get(named_g_mctx, sizeof(config_data_t)); - if ((cd) == NULL) { - return (ISC_R_NOMEMORY); - } - - memset(cd, 0, sizeof(config_data_t)); - - cd->myzone = isc_mem_strdup(named_g_mctx, argv[1]); - - cd->myname = isc_mem_strdup(named_g_mctx, argv[2]); - - cd->myip = isc_mem_strdup(named_g_mctx, argv[3]); - - isc_mem_attach(named_g_mctx, &cd->mctx); - - *dbdata = cd; - - return (ISC_R_SUCCESS); -} - -static void -stub_dlz_destroy(void *driverarg, void *dbdata) { - config_data_t *cd; - isc_mem_t *mctx; - - UNUSED(driverarg); - - cd = (config_data_t *)dbdata; - - /* - * Write debugging message to log - */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_DEBUG(2), "Unloading DLZ_stub driver."); - - isc_mem_free(named_g_mctx, cd->myzone); - isc_mem_free(named_g_mctx, cd->myname); - isc_mem_free(named_g_mctx, cd->myip); - mctx = cd->mctx; - isc_mem_putanddetach(&mctx, cd, sizeof(config_data_t)); -} - -static dns_sdlzmethods_t dlz_stub_methods = { - stub_dlz_create, - stub_dlz_destroy, - stub_dlz_findzonedb, - stub_dlz_lookup, - stub_dlz_authority, - stub_dlz_allnodes, - stub_dlz_allowzonexfr, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, -}; - -/*% - * Wrapper around dns_sdlzregister(). - */ -isc_result_t -dlz_stub_init(void) { - isc_result_t result; - - /* - * Write debugging message to log - */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_DEBUG(2), "Registering DLZ_stub driver."); - - result = dns_sdlzregister("dlz_stub", &dlz_stub_methods, NULL, - DNS_SDLZFLAG_RELATIVEOWNER | - DNS_SDLZFLAG_RELATIVERDATA, - named_g_mctx, &dlz_stub); - if (result != ISC_R_SUCCESS) { - UNEXPECTED_ERROR(__FILE__, __LINE__, - "dns_sdlzregister() failed: %s", - isc_result_totext(result)); - result = ISC_R_UNEXPECTED; - } - - return (result); -} - -/* - * Wrapper around dns_sdlzunregister(). - */ -void -dlz_stub_clear(void) { - /* - * Write debugging message to log - */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, - ISC_LOG_DEBUG(2), "Unregistering DLZ_stub driver."); - - if (dlz_stub != NULL) { - dns_sdlzunregister(&dlz_stub); - } -} - -#endif /* ifdef DLZ_STUB */ diff --git a/contrib/dlz/drivers/include/.clang-format b/contrib/dlz/drivers/include/.clang-format deleted file mode 120000 index e919bbad93..0000000000 --- a/contrib/dlz/drivers/include/.clang-format +++ /dev/null @@ -1 +0,0 @@ -../../../../.clang-format.headers \ No newline at end of file diff --git a/contrib/dlz/drivers/include/dlz/dlz_bdb_driver.h b/contrib/dlz/drivers/include/dlz/dlz_bdb_driver.h deleted file mode 100644 index b180832c96..0000000000 --- a/contrib/dlz/drivers/include/dlz/dlz_bdb_driver.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2002 Stichting NLnet, Netherlands, stichting@nlnet.nl. - * - * Permission to use, copy, modify, and 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 STICHTING NLNET - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * STICHTING NLNET 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. - * - * The development of Dynamically Loadable Zones (DLZ) for Bind 9 was - * conceived and contributed by Rob Butler. - * - * Permission to use, copy, modify, and 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 ROB BUTLER - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * ROB BUTLER 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 DLZ_BDB_DRIVER_H -#define DLZ_BDB_DRIVER_H - -isc_result_t -dlz_bdb_init(void); - -void -dlz_bdb_clear(void); - -#endif /* ifndef DLZ_BDB_DRIVER_H */ diff --git a/contrib/dlz/drivers/include/dlz/dlz_bdbhpt_driver.h b/contrib/dlz/drivers/include/dlz/dlz_bdbhpt_driver.h deleted file mode 100644 index 65a2b84ddd..0000000000 --- a/contrib/dlz/drivers/include/dlz/dlz_bdbhpt_driver.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2002 Stichting NLnet, Netherlands, stichting@nlnet.nl. - * - * Permission to use, copy, modify, and 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 STICHTING NLNET - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * STICHTING NLNET 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. - * - * The development of Dynamically Loadable Zones (DLZ) for Bind 9 was - * conceived and contributed by Rob Butler. - * - * Permission to use, copy, modify, and 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 ROB BUTLER - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * ROB BUTLER 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 DLZ_BDBHPT_DRIVER_H -#define DLZ_BDBHPT_DRIVER_H - -isc_result_t -dlz_bdbhpt_init(void); - -void -dlz_bdbhpt_clear(void); - -#endif /* ifndef DLZ_BDBHPT_DRIVER_H */ diff --git a/contrib/dlz/drivers/include/dlz/dlz_dlopen_driver.h b/contrib/dlz/drivers/include/dlz/dlz_dlopen_driver.h deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/contrib/dlz/drivers/include/dlz/dlz_drivers.h b/contrib/dlz/drivers/include/dlz/dlz_drivers.h deleted file mode 100644 index 483285c66f..0000000000 --- a/contrib/dlz/drivers/include/dlz/dlz_drivers.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (C) 2005 Internet Systems Consortium, Inc. ("ISC") - * - * Permission to use, copy, modify, and 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 ISC DISCLAIMS ALL WARRANTIES WITH - * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS. IN NO EVENT SHALL ISC 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 DLZ_DRIVERS_H -#define DLZ_DRIVERS_H 1 - -/*! \file */ - -isc_result_t -dlz_drivers_init(void); - -void -dlz_drivers_clear(void); - -#endif /* DLZ_DRIVERS_H */ diff --git a/contrib/dlz/drivers/include/dlz/dlz_filesystem_driver.h b/contrib/dlz/drivers/include/dlz/dlz_filesystem_driver.h deleted file mode 100644 index a13c703371..0000000000 --- a/contrib/dlz/drivers/include/dlz/dlz_filesystem_driver.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2002 Stichting NLnet, Netherlands, stichting@nlnet.nl. - * - * Permission to use, copy, modify, and 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 STICHTING NLNET - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * STICHTING NLNET 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. - * - * The development of Dynamically Loadable Zones (DLZ) for Bind 9 was - * conceived and contributed by Rob Butler. - * - * Permission to use, copy, modify, and 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 ROB BUTLER - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * ROB BUTLER 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 DLZ_FILESYSTEM_DRIVER_H -#define DLZ_FILESYSTEM_DRIVER_H - -isc_result_t -dlz_fs_init(void); - -void -dlz_fs_clear(void); - -#endif /* ifndef DLZ_FILESYSTEM_DRIVER_H */ diff --git a/contrib/dlz/drivers/include/dlz/dlz_ldap_driver.h b/contrib/dlz/drivers/include/dlz/dlz_ldap_driver.h deleted file mode 100644 index 3df72858d9..0000000000 --- a/contrib/dlz/drivers/include/dlz/dlz_ldap_driver.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2002 Stichting NLnet, Netherlands, stichting@nlnet.nl. - * - * Permission to use, copy, modify, and 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 STICHTING NLNET - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * STICHTING NLNET 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. - * - * The development of Dynamically Loadable Zones (DLZ) for Bind 9 was - * conceived and contributed by Rob Butler. - * - * Permission to use, copy, modify, and 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 ROB BUTLER - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * ROB BUTLER 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 DLZ_LDAP_DRIVER_H -#define DLZ_LDAP_DRIVER_H - -isc_result_t -dlz_ldap_init(void); - -void -dlz_ldap_clear(void); - -#endif /* ifndef DLZ_LDAP_DRIVER_H */ diff --git a/contrib/dlz/drivers/include/dlz/dlz_mysql_driver.h b/contrib/dlz/drivers/include/dlz/dlz_mysql_driver.h deleted file mode 100644 index 68a0b540a2..0000000000 --- a/contrib/dlz/drivers/include/dlz/dlz_mysql_driver.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2002 Stichting NLnet, Netherlands, stichting@nlnet.nl. - * - * Permission to use, copy, modify, and 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 STICHTING NLNET - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * STICHTING NLNET 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. - * - * The development of Dynamically Loadable Zones (DLZ) for Bind 9 was - * conceived and contributed by Rob Butler. - * - * Permission to use, copy, modify, and 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 ROB BUTLER - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * ROB BUTLER 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 DLZ_MYSQL_DRIVER_H -#define DLZ_MYSQL_DRIVER_H - -isc_result_t -dlz_mysql_init(void); - -void -dlz_mysql_clear(void); - -#endif /* ifndef DLZ_MYSQL_DRIVER_H */ diff --git a/contrib/dlz/drivers/include/dlz/dlz_odbc_driver.h b/contrib/dlz/drivers/include/dlz/dlz_odbc_driver.h deleted file mode 100644 index b3ed620b60..0000000000 --- a/contrib/dlz/drivers/include/dlz/dlz_odbc_driver.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2002 Stichting NLnet, Netherlands, stichting@nlnet.nl. - * - * Permission to use, copy, modify, and 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 STICHTING NLNET - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * STICHTING NLNET 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. - * - * The development of Dynamically Loadable Zones (DLZ) for Bind 9 was - * conceived and contributed by Rob Butler. - * - * Permission to use, copy, modify, and 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 ROB BUTLER - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * ROB BUTLER 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 DLZ_ODBC_DRIVER_H -#define DLZ_ODBC_DRIVER_H - -isc_result_t -dlz_odbc_init(void); - -void -dlz_odbc_clear(void); - -#endif /* ifndef DLZ_ODBC_DRIVER_H */ diff --git a/contrib/dlz/drivers/include/dlz/dlz_postgres_driver.h b/contrib/dlz/drivers/include/dlz/dlz_postgres_driver.h deleted file mode 100644 index d8e250dcee..0000000000 --- a/contrib/dlz/drivers/include/dlz/dlz_postgres_driver.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2002 Stichting NLnet, Netherlands, stichting@nlnet.nl. - * - * Permission to use, copy, modify, and 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 STICHTING NLNET - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * STICHTING NLNET 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. - * - * The development of Dynamically Loadable Zones (DLZ) for Bind 9 was - * conceived and contributed by Rob Butler. - * - * Permission to use, copy, modify, and 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 ROB BUTLER - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * ROB BUTLER 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 DLZ_POSTGRES_DRIVER_H -#define DLZ_POSTGRES_DRIVER_H - -isc_result_t -dlz_postgres_init(void); - -void -dlz_postgres_clear(void); - -#endif /* ifndef DLZ_POSTGRES_DRIVER_H */ diff --git a/contrib/dlz/drivers/include/dlz/dlz_stub_driver.h b/contrib/dlz/drivers/include/dlz/dlz_stub_driver.h deleted file mode 100644 index 73df7ba2f9..0000000000 --- a/contrib/dlz/drivers/include/dlz/dlz_stub_driver.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2002 Stichting NLnet, Netherlands, stichting@nlnet.nl. - * - * Permission to use, copy, modify, and 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 STICHTING NLNET - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * STICHTING NLNET 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. - * - * The development of Dynamically Loadable Zones (DLZ) for Bind 9 was - * conceived and contributed by Rob Butler. - * - * Permission to use, copy, modify, and 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 ROB BUTLER - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * ROB BUTLER 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 DLZ_STUB_DRIVER_H -#define DLZ_STUB_DRIVER_H - -isc_result_t -dlz_stub_init(void); - -void -dlz_stub_clear(void); - -#endif /* ifndef DLZ_STUB_DRIVER_H */ diff --git a/contrib/dlz/drivers/include/dlz/sdlz_helper.h b/contrib/dlz/drivers/include/dlz/sdlz_helper.h deleted file mode 100644 index d46db7c21a..0000000000 --- a/contrib/dlz/drivers/include/dlz/sdlz_helper.h +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (C) 2002 Stichting NLnet, Netherlands, stichting@nlnet.nl. - * - * Permission to use, copy, modify, and 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 STICHTING NLNET - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * STICHTING NLNET 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. - * - * The development of Dynamically Loadable Zones (DLZ) for Bind 9 was - * conceived and contributed by Rob Butler. - * - * Permission to use, copy, modify, and 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 ROB BUTLER - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * ROB BUTLER 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 SDLZHELPER_H -#define SDLZHELPER_H - -#include - -/* - * Types - */ -#define SDLZH_REQUIRE_CLIENT 0x01 -#define SDLZH_REQUIRE_QUERY 0x02 -#define SDLZH_REQUIRE_RECORD 0x04 -#define SDLZH_REQUIRE_ZONE 0x08 - -typedef struct query_segment query_segment_t; -typedef ISC_LIST(query_segment_t) query_list_t; -typedef struct dbinstance dbinstance_t; -typedef ISC_LIST(dbinstance_t) db_list_t; -typedef struct driverinstance driverinstance_t; - -/*% - * a query segment is all the text between our special tokens - * special tokens are %zone%, %record%, %client% - */ -struct query_segment { - void * sql; - unsigned int strlen; - bool direct; - ISC_LINK(query_segment_t) link; -}; - -/*% - * a database instance contains everything we need for running - * a query against the database. Using it each separate thread - * can dynamically construct a query and execute it against the - * database. The "instance_lock" and locking code in the driver's - * make sure no two threads try to use the same DBI at a time. - */ -struct dbinstance { - void * dbconn; - query_list_t *allnodes_q; - query_list_t *allowxfr_q; - query_list_t *authority_q; - query_list_t *findzone_q; - query_list_t *lookup_q; - query_list_t *countzone_q; - char * query_buf; - char * zone; - char * record; - char * client; - isc_mem_t * mctx; - isc_mutex_t instance_lock; - ISC_LINK(dbinstance_t) link; -}; - -/* - * Method declarations - */ - -/* see the code in sdlz_helper.c for more information on these methods */ - -char * -sdlzh_build_querystring(isc_mem_t *mctx, query_list_t *querylist); - -isc_result_t -sdlzh_build_sqldbinstance(isc_mem_t *mctx, const char *allnodes_str, - const char *allowxfr_str, const char *authority_str, - const char *findzone_str, const char *lookup_str, - const char *countzone_str, dbinstance_t **dbi); - -void -sdlzh_destroy_sqldbinstance(dbinstance_t *dbi); - -char * -sdlzh_get_parameter_value(isc_mem_t *mctx, const char *input, const char *key); - -/* Compatibility with existing DLZ drivers */ - -#define build_querystring sdlzh_build_querystring -#define build_sqldbinstance sdlzh_build_sqldbinstance -#define destroy_sqldbinstance sdlzh_destroy_sqldbinstance - -#define getParameterValue(x, y) \ - sdlzh_get_parameter_value(named_g_mctx, (x), (y)) - -#endif /* SDLZHELPER_H */ diff --git a/contrib/dlz/drivers/rules.in b/contrib/dlz/drivers/rules.in deleted file mode 100644 index 81d48d63fa..0000000000 --- a/contrib/dlz/drivers/rules.in +++ /dev/null @@ -1,48 +0,0 @@ -# Copyright (C) 2005 Internet Systems Consortium, Inc. ("ISC") -# -# Permission to use, copy, modify, and 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 ISC DISCLAIMS ALL WARRANTIES WITH -# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -# AND FITNESS. IN NO EVENT SHALL ISC 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. - -dlz_drivers.@O@: ${DLZ_DRIVER_DIR}/dlz_drivers.c ${DLZ_DRIVER_DIR}/include/dlz/dlz_drivers.h - ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} -c ${DLZ_DRIVER_DIR}/dlz_drivers.c - -sdlz_helper.@O@: ${DLZ_DRIVER_DIR}/sdlz_helper.c ${DLZ_DRIVER_DIR}/include/dlz/sdlz_helper.h - ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} -c ${DLZ_DRIVER_DIR}/sdlz_helper.c - - -dlz_bdb_driver.@O@: ${DLZ_DRIVER_DIR}/dlz_bdb_driver.c ${DLZ_DRIVER_DIR}/include/dlz/dlz_bdb_driver.h - ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} -c ${DLZ_DRIVER_DIR}/dlz_bdb_driver.c - -dlz_bdbhpt_driver.@O@: ${DLZ_DRIVER_DIR}/dlz_bdbhpt_driver.c ${DLZ_DRIVER_DIR}/include/dlz/dlz_bdbhpt_driver.h - ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} -c ${DLZ_DRIVER_DIR}/dlz_bdbhpt_driver.c - -dlz_filesystem_driver.@O@: ${DLZ_DRIVER_DIR}/dlz_filesystem_driver.c ${DLZ_DRIVER_DIR}/include/dlz/dlz_filesystem_driver.h - ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} -c ${DLZ_DRIVER_DIR}/dlz_filesystem_driver.c - -dlz_ldap_driver.@O@: ${DLZ_DRIVER_DIR}/dlz_ldap_driver.c ${DLZ_DRIVER_DIR}/include/dlz/dlz_ldap_driver.h - ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} -c ${DLZ_DRIVER_DIR}/dlz_ldap_driver.c - -dlz_mysql_driver.@O@: ${DLZ_DRIVER_DIR}/dlz_mysql_driver.c ${DLZ_DRIVER_DIR}/include/dlz/dlz_mysql_driver.h - ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} -c ${DLZ_DRIVER_DIR}/dlz_mysql_driver.c - -dlz_odbc_driver.@O@: ${DLZ_DRIVER_DIR}/dlz_odbc_driver.c ${DLZ_DRIVER_DIR}/include/dlz/dlz_odbc_driver.h - ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} -c ${DLZ_DRIVER_DIR}/dlz_odbc_driver.c - -dlz_postgres_driver.@O@: ${DLZ_DRIVER_DIR}/dlz_postgres_driver.c ${DLZ_DRIVER_DIR}/include/dlz/dlz_postgres_driver.h - ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} -c ${DLZ_DRIVER_DIR}/dlz_postgres_driver.c - -dlz_dlopen_driver.@O@: ${DLZ_DRIVER_DIR}/dlz_dlopen_driver.c ${DLZ_DRIVER_DIR}/include/dlz/dlz_dlopen_driver.h - ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} -c ${DLZ_DRIVER_DIR}/dlz_dlopen_driver.c - -dlz_stub_driver.@O@: ${DLZ_DRIVER_DIR}/dlz_stub_driver.c ${DLZ_DRIVER_DIR}/include/dlz/dlz_stub_driver.h - ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} -c ${DLZ_DRIVER_DIR}/dlz_stub_driver.c - diff --git a/contrib/dlz/drivers/sdlz_helper.c b/contrib/dlz/drivers/sdlz_helper.c deleted file mode 100644 index e496587f51..0000000000 --- a/contrib/dlz/drivers/sdlz_helper.c +++ /dev/null @@ -1,489 +0,0 @@ -/* - * Copyright (C) 2002 Stichting NLnet, Netherlands, stichting@nlnet.nl. - * - * Permission to use, copy, modify, and 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 STICHTING NLNET - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * STICHTING NLNET 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. - * - * The development of Dynamically Loadable Zones (DLZ) for Bind 9 was - * conceived and contributed by Rob Butler. - * - * Permission to use, copy, modify, and 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 ROB BUTLER - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * ROB BUTLER 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. - */ - -/* - * Copyright (C) 1999-2001, 2016 Internet Systems Consortium, Inc. ("ISC") - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -#include - -#include -#include -#include -#include - -#include -#include - -#include - -/* - * sdlz helper methods - */ - -/*% - * properly destroys a querylist by de-allocating the - * memory for each query segment, and then the list itself - */ - -static void -destroy_querylist(isc_mem_t *mctx, query_list_t **querylist) { - query_segment_t *tseg = NULL; - query_segment_t *nseg = NULL; - - REQUIRE(mctx != NULL); - - /* if query list is null, nothing to do */ - if (*querylist == NULL) { - return; - } - - /* start at the top of the list */ - nseg = ISC_LIST_HEAD(**querylist); - while (nseg != NULL) { /* loop, until end of list */ - tseg = nseg; - /* - * free the query segment's text string but only if it - * was really a query segment, and not a pointer to - * %zone%, or %record%, or %client% - */ - if (tseg->sql != NULL && tseg->direct) { - isc_mem_free(mctx, tseg->sql); - } - /* get the next query segment, before we destroy this one. */ - nseg = ISC_LIST_NEXT(nseg, link); - /* deallocate this query segment. */ - isc_mem_put(mctx, tseg, sizeof(query_segment_t)); - } - /* deallocate the query segment list */ - isc_mem_put(mctx, *querylist, sizeof(query_list_t)); -} - -/*% constructs a query list by parsing a string into query segments */ -static isc_result_t -build_querylist(isc_mem_t *mctx, const char *query_str, char **zone, - char **record, char **client, query_list_t **querylist, - unsigned int flags) { - isc_result_t result; - bool foundzone = false; - bool foundrecord = false; - bool foundclient = false; - char *free_me = NULL; - char *temp_str = NULL; - query_list_t *tql; - query_segment_t *tseg = NULL; - char *last = NULL; - - REQUIRE(querylist != NULL && *querylist == NULL); - REQUIRE(mctx != NULL); - - /* if query string is null, or zero length */ - if (query_str == NULL || strlen(query_str) < 1) { - if ((flags & SDLZH_REQUIRE_QUERY) == 0) { - /* we don't need it were ok. */ - return (ISC_R_SUCCESS); - } else { - /* we did need it, PROBLEM!!! */ - return (ISC_R_FAILURE); - } - } - - /* allocate memory for query list */ - tql = isc_mem_get(mctx, sizeof(query_list_t)); - - /* initialize the query segment list */ - ISC_LIST_INIT(*tql); - - /* make a copy of query_str so we can chop it up */ - free_me = temp_str = isc_mem_strdup(mctx, query_str); - /* couldn't make a copy, problem!! */ - if (temp_str == NULL) { - result = ISC_R_NOMEMORY; - goto cleanup; - } - - /* loop through the string and chop it up */ - for (;;) { - /* - * Split string into tokens at '$'. - */ - const char *sql = strtok_r(temp_str, "$", &last); - if (sql == NULL) { - break; - } - temp_str = NULL; - - /* allocate memory for tseg */ - tseg = isc_mem_get(mctx, sizeof(query_segment_t)); - tseg->sql = NULL; - tseg->direct = false; - /* initialize the query segment link */ - ISC_LINK_INIT(tseg, link); - /* append the query segment to the list */ - ISC_LIST_APPEND(*tql, tseg, link); - - tseg->sql = isc_mem_strdup(mctx, sql); - /* tseg->sql points directly to a string. */ - tseg->direct = true; - tseg->strlen = strlen(tseg->sql); - - /* check if we encountered "$zone$" token */ - if (strcasecmp(tseg->sql, "zone") == 0) { - /* - * we don't really need, or want the "zone" - * text, so get rid of it. - */ - isc_mem_free(mctx, tseg->sql); - /* set tseg->sql to in-direct zone string */ - tseg->sql = zone; - tseg->strlen = 0; - /* tseg->sql points in-directly to a string */ - tseg->direct = false; - foundzone = true; - /* check if we encountered "$record$" token */ - } else if (strcasecmp(tseg->sql, "record") == 0) { - /* - * we don't really need, or want the "record" - * text, so get rid of it. - */ - isc_mem_free(mctx, tseg->sql); - /* set tseg->sql to in-direct record string */ - tseg->sql = record; - tseg->strlen = 0; - /* tseg->sql points in-directly points to a string */ - tseg->direct = false; - foundrecord = true; - /* check if we encountered "$client$" token */ - } else if (strcasecmp(tseg->sql, "client") == 0) { - /* - * we don't really need, or want the "client" - * text, so get rid of it. - */ - isc_mem_free(mctx, tseg->sql); - /* set tseg->sql to in-direct record string */ - tseg->sql = client; - tseg->strlen = 0; - /* tseg->sql points in-directly points to a string */ - tseg->direct = false; - foundclient = true; - } - } - - /* we don't need temp_str any more */ - isc_mem_free(mctx, free_me); - /* - * add checks later to verify zone and record are found if - * necessary. - */ - - /* if this query requires %client%, make sure we found it */ - if (((flags & SDLZH_REQUIRE_CLIENT) != 0) && (!foundclient)) { - /* Write error message to log */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Required token $client$ not found."); - result = ISC_R_FAILURE; - goto flag_fail; - } - - /* if this query requires %record%, make sure we found it */ - if (((flags & SDLZH_REQUIRE_RECORD) != 0) && (!foundrecord)) { - /* Write error message to log */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Required token $record$ not found."); - result = ISC_R_FAILURE; - goto flag_fail; - } - - /* if this query requires %zone%, make sure we found it */ - if (((flags & SDLZH_REQUIRE_ZONE) != 0) && (!foundzone)) { - /* Write error message to log */ - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Required token $zone$ not found."); - result = ISC_R_FAILURE; - goto flag_fail; - } - - /* pass back the query list */ - *querylist = (query_list_t *)tql; - - /* return success */ - return (ISC_R_SUCCESS); - -cleanup: - /* get rid of free_me */ - if (free_me != NULL) { - isc_mem_free(mctx, free_me); - } - -flag_fail: - /* get rid of what was build of the query list */ - destroy_querylist(mctx, &tql); - return (result); -} - -/*% - * build a query string from query segments, and dynamic segments - * dynamic segments replace where the tokens %zone%, %record%, %client% - * used to be in our queries from named.conf - */ -char * -sdlzh_build_querystring(isc_mem_t *mctx, query_list_t *querylist) { - query_segment_t *tseg = NULL; - unsigned int length = 0; - char *qs = NULL; - - REQUIRE(mctx != NULL); - REQUIRE(querylist != NULL); - - /* start at the top of the list */ - tseg = ISC_LIST_HEAD(*querylist); - while (tseg != NULL) { - /* - * if this is a query segment, use the - * precalculated string length - */ - if (tseg->direct) { - length += tseg->strlen; - } else { /* calculate string length for dynamic segments. */ - length += strlen(*(char **)tseg->sql); - } - /* get the next segment */ - tseg = ISC_LIST_NEXT(tseg, link); - } - - /* allocate memory for the string */ - qs = isc_mem_allocate(mctx, length + 1); - - *qs = 0; - /* start at the top of the list again */ - tseg = ISC_LIST_HEAD(*querylist); - while (tseg != NULL) { - if (tseg->direct) { - /* query segments */ - strcat(qs, tseg->sql); - } else { - /* dynamic segments */ - strcat(qs, *(char **)tseg->sql); - } - /* get the next segment */ - tseg = ISC_LIST_NEXT(tseg, link); - } - - return (qs); -} - -/*% constructs a sql dbinstance (DBI) */ -isc_result_t -sdlzh_build_sqldbinstance(isc_mem_t *mctx, const char *allnodes_str, - const char *allowxfr_str, const char *authority_str, - const char *findzone_str, const char *lookup_str, - const char *countzone_str, dbinstance_t **dbi) { - isc_result_t result; - dbinstance_t *db = NULL; - - REQUIRE(dbi != NULL && *dbi == NULL); - REQUIRE(mctx != NULL); - - /* allocate and zero memory for driver structure */ - db = isc_mem_get(mctx, sizeof(dbinstance_t)); - memset(db, 0, sizeof(dbinstance_t)); - db->dbconn = NULL; - db->client = NULL; - db->record = NULL; - db->zone = NULL; - db->mctx = NULL; - db->query_buf = NULL; - db->allnodes_q = NULL; - db->allowxfr_q = NULL; - db->authority_q = NULL; - db->findzone_q = NULL; - db->countzone_q = NULL; - db->lookup_q = NULL; - - /* attach to the memory context */ - isc_mem_attach(mctx, &db->mctx); - - /* initialize the reference count mutex */ - isc_mutex_init(&db->instance_lock); - - /* build the all nodes query list */ - result = build_querylist(mctx, allnodes_str, &db->zone, &db->record, - &db->client, &db->allnodes_q, - SDLZH_REQUIRE_ZONE); - /* if unsuccessful, log err msg and cleanup */ - if (result != ISC_R_SUCCESS) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Could not build all nodes query list"); - goto cleanup; - } - - /* build the allow zone transfer query list */ - result = build_querylist(mctx, allowxfr_str, &db->zone, &db->record, - &db->client, &db->allowxfr_q, - SDLZH_REQUIRE_ZONE | SDLZH_REQUIRE_CLIENT); - /* if unsuccessful, log err msg and cleanup */ - if (result != ISC_R_SUCCESS) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Could not build allow xfr query list"); - goto cleanup; - } - - /* build the authority query, query list */ - result = build_querylist(mctx, authority_str, &db->zone, &db->record, - &db->client, &db->authority_q, - SDLZH_REQUIRE_ZONE); - /* if unsuccessful, log err msg and cleanup */ - if (result != ISC_R_SUCCESS) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Could not build authority query list"); - goto cleanup; - } - - /* build findzone query, query list */ - result = build_querylist(mctx, findzone_str, &db->zone, &db->record, - &db->client, &db->findzone_q, - SDLZH_REQUIRE_ZONE); - /* if unsuccessful, log err msg and cleanup */ - if (result != ISC_R_SUCCESS) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Could not build find zone query list"); - goto cleanup; - } - - /* build countzone query, query list */ - result = build_querylist(mctx, countzone_str, &db->zone, &db->record, - &db->client, &db->countzone_q, - SDLZH_REQUIRE_ZONE); - /* if unsuccessful, log err msg and cleanup */ - if (result != ISC_R_SUCCESS) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Could not build count zone query list"); - goto cleanup; - } - - /* build lookup query, query list */ - result = build_querylist(mctx, lookup_str, &db->zone, &db->record, - &db->client, &db->lookup_q, - SDLZH_REQUIRE_RECORD); - /* if unsuccessful, log err msg and cleanup */ - if (result != ISC_R_SUCCESS) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, - DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, - "Could not build lookup query list"); - goto cleanup; - } - - /* pass back the db instance */ - *dbi = (dbinstance_t *)db; - - /* return success */ - return (ISC_R_SUCCESS); - -cleanup: - /* destroy whatever was build of the db instance */ - destroy_sqldbinstance(db); - /* return failure */ - return (ISC_R_FAILURE); -} - -void -sdlzh_destroy_sqldbinstance(dbinstance_t *dbi) { - isc_mem_t *mctx; - - /* save mctx for later */ - mctx = dbi->mctx; - - /* destroy any query lists we created */ - destroy_querylist(mctx, &dbi->allnodes_q); - destroy_querylist(mctx, &dbi->allowxfr_q); - destroy_querylist(mctx, &dbi->authority_q); - destroy_querylist(mctx, &dbi->findzone_q); - destroy_querylist(mctx, &dbi->countzone_q); - destroy_querylist(mctx, &dbi->lookup_q); - - /* get rid of the mutex */ - (void)isc_mutex_destroy(&dbi->instance_lock); - - /* return, and detach the memory */ - isc_mem_putanddetach(&mctx, dbi, sizeof(dbinstance_t)); -} - -char * -sdlzh_get_parameter_value(isc_mem_t *mctx, const char *input, const char *key) { - int keylen; - char *keystart; - char value[255]; - int i; - - if (key == NULL || input == NULL || strlen(input) < 1) { - return (NULL); - } - - keylen = strlen(key); - - if (keylen < 1) { - return (NULL); - } - - keystart = strstr(input, key); - - if (keystart == NULL) { - return (NULL); - } - - REQUIRE(mctx != NULL); - - for (i = 0; i < 255; i++) { - value[i] = keystart[keylen + i]; - if (value[i] == ' ' || value[i] == '\0') { - value[i] = '\0'; - break; - } - } - - return (isc_mem_strdup(mctx, value)); -} diff --git a/util/copyrights b/util/copyrights index 36a01736f3..b14f01f903 100644 --- a/util/copyrights +++ b/util/copyrights @@ -229,17 +229,6 @@ ./bin/tests/system/digdelv/tests.sh SH 2015,2016,2017,2018,2019,2020,2021 ./bin/tests/system/digdelv/yamlget.py PYTHON 2019,2020,2021 ./bin/tests/system/ditch.pl PERL 2015,2016,2018,2019,2020,2021 -./bin/tests/system/dlz/clean.sh SH 2010,2012,2014,2016,2018,2019,2020,2021 -./bin/tests/system/dlz/ns1/dns-root/com/broken/dns.d/@/DNAME=10=example.net.= TXT.BRIEF 2015,2016,2018,2019,2020,2021 -./bin/tests/system/dlz/ns1/dns-root/com/broken/dns.d/@/NS=10=example.com.= TXT.BRIEF 2015,2016,2018,2019,2020,2021 -./bin/tests/system/dlz/ns1/dns-root/com/broken/dns.d/@/SOA=10=ns.example.com.=root.example.com.=None=None=None=None=None= TXT.BRIEF 2015,2016,2018,2019,2020,2021 -./bin/tests/system/dlz/ns1/dns-root/com/example/dns.d/@/DNAME=10=example.net.= TXT.BRIEF 2010,2016,2018,2019,2020,2021 -./bin/tests/system/dlz/ns1/dns-root/com/example/dns.d/@/NS=10=example.com.= TXT.BRIEF 2010,2016,2018,2019,2020,2021 -./bin/tests/system/dlz/ns1/dns-root/com/example/dns.d/@/SOA=10=ns.example.com.=root.example.com.=2010062900=0=0=0=10= TXT.BRIEF 2010,2016,2018,2019,2020,2021 -./bin/tests/system/dlz/ns1/dns-root/com/example/xfr.d/10.53.0.1 TXT.BRIEF 2010,2016,2018,2019,2020,2021 -./bin/tests/system/dlz/prereq.sh SH 2011,2012,2016,2018,2019,2020,2021 -./bin/tests/system/dlz/setup.sh SH 2018,2019,2020,2021 -./bin/tests/system/dlz/tests.sh SH 2010,2011,2012,2013,2015,2016,2018,2019,2020,2021 ./bin/tests/system/dlzexternal/clean.sh SH 2010,2012,2014,2015,2016,2018,2019,2020,2021 ./bin/tests/system/dlzexternal/driver/driver.c C 2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021 ./bin/tests/system/dlzexternal/driver/driver.h C 2011,2016,2018,2019,2020,2021 @@ -936,31 +925,6 @@ ./contrib/README X 2014,2015,2016,2017,2018,2019,2020,2021 ./contrib/dane/mkdane.sh X 2012,2018,2019,2020,2021 ./contrib/dane/tlsa6698.pem X 2012,2018,2019,2020,2021 -./contrib/dlz/bin/dlzbdb/dlzbdb.c X 2005,2016,2018,2019,2020,2021 -./contrib/dlz/config.dlz.in X 2005,2006,2008,2010,2011,2014,2016,2017,2018,2019,2020 -./contrib/dlz/drivers/dlz_bdb_driver.c X 2005,2008,2010,2011,2012,2016,2017,2018,2019,2020,2021 -./contrib/dlz/drivers/dlz_bdbhpt_driver.c X 2005,2010,2011,2012,2016,2017,2018,2019,2020,2021 -./contrib/dlz/drivers/dlz_dlopen_driver.c X 2010,2011,2018,2019,2020,2021 -./contrib/dlz/drivers/dlz_drivers.c X 2005,2010,2011,2018,2019,2020,2021 -./contrib/dlz/drivers/dlz_filesystem_driver.c X 2005,2010,2011,2012,2016,2017,2018,2019,2020,2021 -./contrib/dlz/drivers/dlz_ldap_driver.c X 2005,2010,2011,2012,2016,2017,2018,2019,2020,2021 -./contrib/dlz/drivers/dlz_mysql_driver.c X 2005,2007,2009,2010,2011,2012,2016,2017,2018,2019,2020,2021 -./contrib/dlz/drivers/dlz_odbc_driver.c X 2005,2010,2011,2012,2014,2016,2017,2018,2019,2020,2021 -./contrib/dlz/drivers/dlz_postgres_driver.c X 2005,2007,2010,2011,2012,2014,2016,2017,2018,2019,2020,2021 -./contrib/dlz/drivers/dlz_stub_driver.c X 2005,2010,2011,2012,2016,2017,2018,2019,2020,2021 -./contrib/dlz/drivers/include/dlz/dlz_bdb_driver.h X 2005,2018,2019,2020,2021 -./contrib/dlz/drivers/include/dlz/dlz_bdbhpt_driver.h X 2005,2018,2019,2020,2021 -./contrib/dlz/drivers/include/dlz/dlz_dlopen_driver.h X 2010,2011,2018,2019,2020,2021 -./contrib/dlz/drivers/include/dlz/dlz_drivers.h X 2005,2018,2019,2020,2021 -./contrib/dlz/drivers/include/dlz/dlz_filesystem_driver.h X 2005,2018,2019,2020,2021 -./contrib/dlz/drivers/include/dlz/dlz_ldap_driver.h X 2005,2018,2019,2020,2021 -./contrib/dlz/drivers/include/dlz/dlz_mysql_driver.h X 2005,2018,2019,2020,2021 -./contrib/dlz/drivers/include/dlz/dlz_odbc_driver.h X 2005,2018,2019,2020,2021 -./contrib/dlz/drivers/include/dlz/dlz_postgres_driver.h X 2005,2018,2019,2020,2021 -./contrib/dlz/drivers/include/dlz/dlz_stub_driver.h X 2005,2018,2019,2020,2021 -./contrib/dlz/drivers/include/dlz/sdlz_helper.h X 2005,2017,2018,2019,2020,2021 -./contrib/dlz/drivers/rules.in X 2005,2010,2018,2019,2020 -./contrib/dlz/drivers/sdlz_helper.c X 2005,2010,2011,2012,2016,2018,2019,2020,2021 ./contrib/dlz/example/Makefile X 2010,2013,2018,2019,2020,2021 ./contrib/dlz/example/README X 2011,2012,2013,2014,2018,2019,2020,2021 ./contrib/dlz/example/dlz_example.c X 2010,2011,2012,2013,2014,2018,2019,2020,2021 From 67f76b126900d313b343f563353f8237a6a264d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Mon, 20 Sep 2021 13:38:54 +0200 Subject: [PATCH 2/7] Add static Makefile to mysql and mysqldyn DLZ modules Previously, the Makefiles for mysql and mysqldyn DLZ modules were generated from autoconf to get CFLAGS and LIBS for MariaDB or MySQL libraries. The static Makefiles uses a simpler method by calling `mysql_config` directly from the Makefile. --- contrib/dlz/modules/mysql/Makefile | 21 +++++++++++++++++++++ contrib/dlz/modules/mysqldyn/Makefile | 21 +++++++++++++++++++++ util/copyrights | 2 ++ 3 files changed, 44 insertions(+) create mode 100644 contrib/dlz/modules/mysql/Makefile create mode 100644 contrib/dlz/modules/mysqldyn/Makefile diff --git a/contrib/dlz/modules/mysql/Makefile b/contrib/dlz/modules/mysql/Makefile new file mode 100644 index 0000000000..5c1df7042a --- /dev/null +++ b/contrib/dlz/modules/mysql/Makefile @@ -0,0 +1,21 @@ +prefix = /usr +libdir = $(prefix)/lib/bind9 + +CFLAGS=-fPIC -g -I../include $(shell mysql_config --cflags) +LDAP_LIBS=$(shell mysql_config --libs) + +all: dlz_mysql_dynamic.so + +dlz_dbi.o: ../common/dlz_dbi.c + $(CC) $(CFLAGS) -c ../common/dlz_dbi.c + +dlz_mysql_dynamic.so: dlz_mysql_dynamic.c dlz_dbi.o + $(CC) $(CFLAGS) -shared -o dlz_mysql_dynamic.so \ + dlz_mysql_dynamic.c dlz_dbi.o $(MYSQL_LIBS) + +clean: + rm -f dlz_mysql_dynamic.so *.o + +install: dlz_mysql_dynamic.so + mkdir -p $(DESTDIR)$(libdir) + install dlz_mysql_dynamic.so $(DESTDIR)$(libdir) diff --git a/contrib/dlz/modules/mysqldyn/Makefile b/contrib/dlz/modules/mysqldyn/Makefile new file mode 100644 index 0000000000..bb5643d2a0 --- /dev/null +++ b/contrib/dlz/modules/mysqldyn/Makefile @@ -0,0 +1,21 @@ +prefix = /usr +libdir = $(prefix)/lib/bind9 + +CFLAGS=-fPIC -g -I../include $(shell mysql_config --cflags) +LDAP_LIBS=$(shell mysql_config --libs) + +all: dlz_mysqldyn_mod.so + +dlz_dbi.o: ../common/dlz_dbi.c + $(CC) $(CFLAGS) -c ../common/dlz_dbi.c + +dlz_mysqldyn_mod.so: dlz_mysqldyn_mod.c dlz_dbi.o + $(CC) $(CFLAGS) -shared -o dlz_mysqldyn_mod.so \ + dlz_mysqldyn_mod.c dlz_dbi.o $(MYSQL_LIBS) + +clean: + rm -f dlz_mysqldyn_mod.so *.o + +install: dlz_mysqldyn_mod.so + mkdir -p $(DESTDIR)$(libdir) + install dlz_mysqldyn_mod.so $(DESTDIR)$(libdir) diff --git a/util/copyrights b/util/copyrights index b14f01f903..3ffa566d40 100644 --- a/util/copyrights +++ b/util/copyrights @@ -951,11 +951,13 @@ ./contrib/dlz/modules/ldap/testing/example.ldif X 2013,2018,2019,2020,2021 ./contrib/dlz/modules/ldap/testing/named.conf X 2013,2018,2019 ./contrib/dlz/modules/ldap/testing/slapd.conf X 2013,2018,2019 +./contrib/dlz/modules/mysql/Makefile X 2021 ./contrib/dlz/modules/mysql/dlz_mysql_dynamic.c X 2013,2016,2018,2019,2020,2021 ./contrib/dlz/modules/mysql/testing/README X 2013,2018,2019,2020,2021 ./contrib/dlz/modules/mysql/testing/dlz.data X 2013,2017,2018,2019 ./contrib/dlz/modules/mysql/testing/dlz.schema X 2013,2018,2019,2020,2021 ./contrib/dlz/modules/mysql/testing/named.conf X 2013,2018,2019 +./contrib/dlz/modules/mysqldyn/Makefile X 2021 ./contrib/dlz/modules/mysqldyn/README X 2014,2018,2019,2020,2021 ./contrib/dlz/modules/mysqldyn/dlz_mysqldyn_mod.c X 2014,2015,2018,2019,2020,2021 ./contrib/dlz/modules/mysqldyn/testing/README X 2014,2018,2019,2020,2021 From 354c5a358ba5d3c24076220a60ec970894af8c05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Mon, 20 Sep 2021 12:43:29 +0200 Subject: [PATCH 3/7] Remove the mkdane.sh script from contrib directory Better and maintained alternatives exists, f.e. sshfp package contains a dane tool: https://github.com/xelerance/sshfp/ --- contrib/README | 5 -- contrib/dane/mkdane.sh | 137 -------------------------------------- contrib/dane/tlsa6698.pem | 26 -------- util/copyrights | 2 - 4 files changed, 170 deletions(-) delete mode 100755 contrib/dane/mkdane.sh delete mode 100644 contrib/dane/tlsa6698.pem diff --git a/contrib/README b/contrib/README index 115b05b7db..d02717b036 100644 --- a/contrib/README +++ b/contrib/README @@ -8,11 +8,6 @@ be fixed as time permits. named and restarts it in the event of a crash, 'zone-edit' which enables editing of a dynamic zone, and others. - - dane/ - - mkdane.sh generates TLSA records for use with DNS-based - Authentication of Named Entities (DANE). - - dnspriv/ Sample configuration for setting up a DNS-over-TLS server diff --git a/contrib/dane/mkdane.sh b/contrib/dane/mkdane.sh deleted file mode 100755 index fbae4aadeb..0000000000 --- a/contrib/dane/mkdane.sh +++ /dev/null @@ -1,137 +0,0 @@ -#!/bin/sh -# Copyright (C) 2010, 2012 Internet Systems Consortium, Inc. ("ISC") -# -# 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 ISC DISCLAIMS ALL WARRANTIES WITH -# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -# AND FITNESS. IN NO EVENT SHALL ISC 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. -# -# Generate a DNS RR from an x.509 certificate -# Currently only supports TLSA, but can be extended to support -# other DANE types such as SMIMEA in the future. -# -# Requires: openssl - -USAGE="$BASENAME [options] -Options: - -f : PEM | DLR - -n : record name (default: _443._tcp) - -o : zone origin (default: none; name will be relative) - -m : NONE (0) | SHA256 (1) | SHA512 (2) - -r : TLSA - -s : FULL (0) | PK (1) - -t : TTL of the TLSA record (default: none) - -u : CA (0) | SERVICE (1) | TA (2) | DOMAIN (3)" - -NM="_443._tcp" -CU=2 -SELECTOR=0 -MTYPE=1 -IN= -FORM=PEM -TTL= -RRTYPE=TLSA -BASENAME=`basename $0`; - -while getopts "xn:o:u:s:t:m:i:f:r:" c; do - case $c in - x) set -x; DEBUG=-x;; - m) MTYPE="$OPTARG";; - n) NM="$OPTARG";; - o) ORIGIN="$OPTARG";; - r) RRTYPE="$OPTARG";; - s) SELECTOR="$OPTARG";; - t) TTL="$OPTARG";; - u) CU="$OPTARG";; - *) echo "$USAGE" 1>&2; exit 1;; - esac -done -shift `expr $OPTIND - 1 || true` - -if test "$#" -eq 1; then - IN=$1 -else - echo "$USAGE" 1>&2; exit 1 -fi - -ORIGIN=`echo $ORIGIN | sed 's/\([^.]$\)/\1./'` -if [ -n "$ORIGIN" ]; then - NM=`echo $NM | sed 's/\.$//'` - NM="$NM.$ORIGIN" -fi - -case "$CU" in - [Cc][Aa]) CU=0;; - [Ss][Ee][Rr][Vv]*) CU=1;; - [Tt][Aa]) CU=2;; - [Dd][Oo][Mm]*) CU=3;; - [0123]) ;; - *) echo "bad certificate usage -u \"$CU\"" 1>&2; exit 1;; -esac - -case "$SELECTOR" in - [Ff][Uu][Ll][Ll]) SELECTOR=0;; - [Pp][Kk]) SELECTOR=1;; - [01]) ;; - *) echo "bad selector -s \"$SELECTOR\"" 1>&2; exit 1;; -esac - -case "$MTYPE" in - 0|[Nn][Oo][Nn][Ee]) HASH='od -A n -v -t xC';; - 1|[Ss][Hh][Aa]256) HASH='openssl dgst -sha256';; - 2|[Ss][Hh][Aa]512) HASH='openssl dgst -sha512';; - *) echo "bad matching type -m \"$MTYPE\"" 1>&2; exit 1;; -esac - -case "$FORM" in - [Pp][Ee][Mm]) FORM=PEM;; - [Dd][Ll][Rr]) FORM=DLR;; - *) echo "bad input file format -f \"$FORM\"" 1>&2; exit 1 -esac - -case "$RRTYPE" in - [Tt][Ll][Ss][Aa]) RRTYPE=TLSA;; - *) echo "invalid RR type" 1>&2; exit 1 -esac - -if test -z "$IN" -o ! -s "$IN"; then - echo "bad input file -i \"$IN\"" 1>&2; exit 1 -fi - -echo "; $BASENAME -o$NM -u$CU -s$SELECTOR -m$MTYPE -f$FORM $IN" - -(if test "$SELECTOR" = 0; then - openssl x509 -in "$IN" -inform "$FORM" -outform DER -else - openssl x509 -in "$IN" -inform "$FORM" -noout -pubkey \ - | sed -e '/PUBLIC KEY/d' \ - | openssl base64 -d -fi) \ - | $HASH \ - | awk ' - # format Association Data as in Appendix C of the DANE RFC - BEGIN { - print "'"$NM\t\t$TTL\tIN TLSA\t$CU $SELECTOR $MTYPE"' ("; - leader = "\t\t\t\t\t"; - } - /.+/ { - gsub(/ +/, "", $0); - buf = buf $0; - while (length(buf) >= 36) { - print leader substr(buf, 1, 36); - buf = substr(buf, 37); - } - } - END { - if (length(buf) > 34) - print leader buf "\n" leader ")"; - else - print leader buf " )"; - }' diff --git a/contrib/dane/tlsa6698.pem b/contrib/dane/tlsa6698.pem deleted file mode 100644 index 9b9c1eeb44..0000000000 --- a/contrib/dane/tlsa6698.pem +++ /dev/null @@ -1,26 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIEVDCCArwCCQCrWNJOd60q9jANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQGEwJO -TDEWMBQGA1UECBMNTm9vcmQtSG9sbGFuZDESMBAGA1UEBxMJQW1zdGVyZGFtMQww -CgYDVQQKEwNPUzMxIzAhBgNVBAMTGmRhbmUua2lldi5wcmFjdGljdW0ub3MzLm5s -MB4XDTEyMDExNjE2NTcwM1oXDTIyMDExMzE2NTcwM1owbDELMAkGA1UEBhMCTkwx -FjAUBgNVBAgTDU5vb3JkLUhvbGxhbmQxEjAQBgNVBAcTCUFtc3RlcmRhbTEMMAoG -A1UEChMDT1MzMSMwIQYDVQQDExpkYW5lLmtpZXYucHJhY3RpY3VtLm9zMy5ubDCC -AaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAOYshKWv5Z8KKmslDe5oesjF -xgT1fSbOshGRQP+sOMS5y76JIwguf4Fia2rV3qDIdxx048qn9hMFSu+jZz5I/+R7 -P3r5h94oGmgjCyS52hqY3L5RGVtg5C/XUXwyjZg+JqgnyHerkU7kwb/erUi9Jb5f -LEc7qcHLvd2gw3TQ1Yw4nMPW2MIGYuGc92jzJEG399FK6olmznwyoXIqs4Yj0AgC -mp5HAog/i5d6Gh5Skr+K1yI51AOTN7hqOsYPoAEpBFIXe/F5hgmgWhMPAzRXpSEm -KfvduOcOKp5lVoc8T3ykauSosXjwX7MZAF4cHH1L1336NANVY8EmqiwzKLkA55kK -yXh/AdqC90w9S2Z0zOzh/Uxu+eZkT0Y17e2jnYsOL3yOBtrndWITvT1ggxF1vikE -QrSvxa5vRrdphVoGfBCX5heWJSnhZvIq7hDduYG4zW/xfT1wcjFpA42/vBpEnI0N -MbxoPF884mFI5C7Ju9TZ8mFWmyW1PB1/wt3/a0ysBQIDAQABMA0GCSqGSIb3DQEB -BQUAA4IBgQArKr4GPpyGrEofeDU3IJEHnIJ2qcLF0exXZN5SP92r3qs/005v5sug -VFgKZ4WmY1ldkBMrk9Rzkp6B+giH0v/3ioHH0BS5d3irasnl5pD29anpK7X7q3G4 -V65ptuGL3MsLpvzZ1LCEo082NRSMSV1I/mNZA7iI7B3rJhBUjt1I1j+GUTpFYkaY -MUjA1duC1zpMNQpCu2YddjQw/GyOX50T6ht2qlKkw1jl6gQAD3lGGDA6ts7qTpqO -nHTXPBsLe68W3t52lrXi8gb3dxAPVyfhaE1BMvXmkvR69nVuqLQhAAvgMbXY8CIO -Q2tR+xVP6VlTM8E6JAP53gjl3cWiL9YYLjOVk+JjdEUCILwU8+QP8z8IRSawnDQl -BwLoo1KzMszLD53izysziCO5KvxhwLa4q9ta9xjtjdqXwpjka4KgGxSBSGjPpPLD -Ymi//0pZH0Jli/dZGJAtPkJt/h1f8PxqISBx9tqL2DP+LlYNh3dejukzPAW2+461 -ZYnZENteqQM= ------END CERTIFICATE----- diff --git a/util/copyrights b/util/copyrights index 3ffa566d40..4d098720b6 100644 --- a/util/copyrights +++ b/util/copyrights @@ -923,8 +923,6 @@ ./conftools/perllib/dnsconf/Makefile.PL PERL 2000,2001,2004,2007,2012,2016,2018,2019,2020,2021 ./conftools/perllib/dnsconf/test.pl PERL 2000,2001,2004,2007,2012,2016,2018,2019,2020,2021 ./contrib/README X 2014,2015,2016,2017,2018,2019,2020,2021 -./contrib/dane/mkdane.sh X 2012,2018,2019,2020,2021 -./contrib/dane/tlsa6698.pem X 2012,2018,2019,2020,2021 ./contrib/dlz/example/Makefile X 2010,2013,2018,2019,2020,2021 ./contrib/dlz/example/README X 2011,2012,2013,2014,2018,2019,2020,2021 ./contrib/dlz/example/dlz_example.c X 2010,2011,2012,2013,2014,2018,2019,2020,2021 From b964e7882be02403160ff859772c7f31de1a8835 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Mon, 20 Sep 2021 12:44:49 +0200 Subject: [PATCH 4/7] Remove dnspriv example from the contrib directory BIND 9 has now native DoH support, so there's no need to have nginx proxy example in the contrib/ directory. --- contrib/README | 5 ----- contrib/dnspriv/README.md | 23 --------------------- contrib/dnspriv/named.conf | 18 ----------------- contrib/dnspriv/nginx.conf | 41 -------------------------------------- util/copyrights | 1 - 5 files changed, 88 deletions(-) delete mode 100644 contrib/dnspriv/README.md delete mode 100644 contrib/dnspriv/named.conf delete mode 100644 contrib/dnspriv/nginx.conf diff --git a/contrib/README b/contrib/README index d02717b036..0cdedc74a9 100644 --- a/contrib/README +++ b/contrib/README @@ -8,11 +8,6 @@ be fixed as time permits. named and restarts it in the event of a crash, 'zone-edit' which enables editing of a dynamic zone, and others. - - dnspriv/ - - Sample configuration for setting up a DNS-over-TLS server - using BIND with Nginx as a TLS proxy. - - kasp/ Scripts for converting key and signature policies from OpenDNSSEC diff --git a/contrib/dnspriv/README.md b/contrib/dnspriv/README.md deleted file mode 100644 index 8fa6795208..0000000000 --- a/contrib/dnspriv/README.md +++ /dev/null @@ -1,23 +0,0 @@ - -### DNS Privacy in BIND - -This directory contains sample configuration files to enable BIND, -with Nginx as a TLS proxy, to provide DNS over TLS. - -`named.conf` configures a validating recursive name server to listen -on the localhost address at port 8853. - -`nginx.conf` configures a TLS proxy to listen on port 853 and -forward queries and responses to `named`. - -For more information, please see -[https://dnsprivacy.org/wiki/](https://dnsprivacy.org/wiki/) diff --git a/contrib/dnspriv/named.conf b/contrib/dnspriv/named.conf deleted file mode 100644 index 12d07a389b..0000000000 --- a/contrib/dnspriv/named.conf +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (C) Internet Systems Consortium, Inc. ("ISC") - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * See the COPYRIGHT file distributed with this work for additional - * information regarding copyright ownership. - */ - -options { - listen-on port 8853 { 127.0.0.1; }; - allow-query { localhost; }; - recursion yes; - dnssec-validation auto; - tcp-clients 1024; -}; diff --git a/contrib/dnspriv/nginx.conf b/contrib/dnspriv/nginx.conf deleted file mode 100644 index 763ff35f30..0000000000 --- a/contrib/dnspriv/nginx.conf +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright (C) Internet Systems Consortium, Inc. ("ISC") -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, you can obtain one at https://mozilla.org/MPL/2.0/. -# -# See the COPYRIGHT file distributed with this work for additional -# information regarding copyright ownership. - -# uncomment to choose an appropriate UID/GID; default is 'nobody' -# user bind bind; - -worker_processes auto; -pid /var/run/nginx.pid; - -events { - worker_connections 1024; - multi_accept on; -} - -stream { - upstream dns_tcp_servers { - server 127.0.0.1:8853; - } - - server { - listen 853 ssl; - proxy_pass dns_tcp_servers; - - # update to a suitable SSL certificate (e.g. from LetsEncrypt), - # and uncomment the following lines: - # ssl_certificate /etc/nginx/lego/certificates/.crt; - # ssl_certificate_key /etc/nginx/lego/certificates/.key; - - ssl_protocols TLSv1.2; - ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; - ssl_session_tickets on; - ssl_session_timeout 4h; - ssl_handshake_timeout 30s; - } -} diff --git a/util/copyrights b/util/copyrights index 4d098720b6..1e81d475e7 100644 --- a/util/copyrights +++ b/util/copyrights @@ -980,7 +980,6 @@ ./contrib/dlz/modules/wildcard/README X 2013,2018,2019,2020,2021 ./contrib/dlz/modules/wildcard/dlz_wildcard_dynamic.c X 2013,2015,2016,2018,2019,2020,2021 ./contrib/dlz/modules/wildcard/testing/named.conf X 2013,2018,2019 -./contrib/dnspriv/nginx.conf SH 2017,2018,2019 ./contrib/kasp/README X 2020,2021 ./contrib/kasp/kasp.xml X 2020,2021 ./contrib/kasp/policy.good X 2020,2021 From 57b8a1273427b9410b618277ce6f9422ca351d3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Mon, 20 Sep 2021 12:45:46 +0200 Subject: [PATCH 5/7] Remove scripts to convert KASP to old dnssec-keymgr policy The dnssec-keymgr has been replaces with dnssec-policy in the named, so there's no need to carry the conversion script in the contrib/ anymore. --- contrib/README | 5 -- contrib/kasp/README | 11 ---- contrib/kasp/kasp.xml | 134 --------------------------------------- contrib/kasp/policy.good | 24 ------- util/copyrights | 3 - 5 files changed, 177 deletions(-) delete mode 100644 contrib/kasp/README delete mode 100644 contrib/kasp/kasp.xml delete mode 100644 contrib/kasp/policy.good diff --git a/contrib/README b/contrib/README index 0cdedc74a9..f3811b9c1b 100644 --- a/contrib/README +++ b/contrib/README @@ -8,11 +8,6 @@ be fixed as time permits. named and restarts it in the event of a crash, 'zone-edit' which enables editing of a dynamic zone, and others. - - kasp/ - - Scripts for converting key and signature policies from OpenDNSSEC - KASP format to the policy.conf format used by dnssec-keymgr. - - dlz/modules Dynamically linkable DLZ modules that can be configured into diff --git a/contrib/kasp/README b/contrib/kasp/README deleted file mode 100644 index fb897f1073..0000000000 --- a/contrib/kasp/README +++ /dev/null @@ -1,11 +0,0 @@ -This directory is for tools and scripts related to the OpenDNSSEC KASP -("key and signature policy") format. Currently it only contains -"kasp2policy.py", a python script for converting KASP key policy -to the "dnssec.policy" format that is used by dnssec-keymgr. - -This depends on PLY (python lex/yacc) and on the "isc.dnskey" module in -bin/python/isc. - -Basic test: -$ python kasp2policy.py kasp.xml > policy.out -$ diff policy.out policy.good diff --git a/contrib/kasp/kasp.xml b/contrib/kasp/kasp.xml deleted file mode 100644 index d94b0843ec..0000000000 --- a/contrib/kasp/kasp.xml +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - A default policy that will - amaze you and your friends - - PT5M - PT5M - - PT15M - PT15M - - PT2M - PT1M - - - - - - - - - - PT1M - PT0S - PT0S - - - - 5 - PT40M - softHSM - 1 - - - - - 5 - PT25M - softHSM - 1 - - - - - PT0S - - PT0S - PT0S - unixtime - - - - - PT8M - - PT0S - - - PT0S - PT0S - - - - - A default policy that will amaze you and your friends - - PT7M - PT7M - - PT15M - PT16M - - PT2M - PT1M - - - - - P120D - - 1 - 5 - - - - - - - - PT15M - PT0S - PT0S - - - - 7 - PT45M - softHSM - 1 - - - - - 7 - PT25M - softHSM - 1 - - - - - PT0S - - PT0S - PT0S - unixtime - - - - - PT12M - - PT0S - - - PT0S - PT0S - - - - diff --git a/contrib/kasp/policy.good b/contrib/kasp/policy.good deleted file mode 100644 index 18c636083c..0000000000 --- a/contrib/kasp/policy.good +++ /dev/null @@ -1,24 +0,0 @@ -# A default policy that will -# amaze you and your friends -policy Policy1 { - algorithm RSASHA1; - keyttl 60; - key-size ksk 2048; - key-size zsk 2048; - roll-period ksk 2400; - roll-period zsk 1500; - standby ksk 1; - standby zsk 1; -}; - -# A default policy that will amaze you and your friends -policy Policy2 { - algorithm NSEC3RSASHA1; - keyttl 900; - key-size ksk 2048; - key-size zsk 2048; - roll-period ksk 2700; - roll-period zsk 1500; - standby ksk 1; - standby zsk 1; -}; diff --git a/util/copyrights b/util/copyrights index 1e81d475e7..e0b70326eb 100644 --- a/util/copyrights +++ b/util/copyrights @@ -980,9 +980,6 @@ ./contrib/dlz/modules/wildcard/README X 2013,2018,2019,2020,2021 ./contrib/dlz/modules/wildcard/dlz_wildcard_dynamic.c X 2013,2015,2016,2018,2019,2020,2021 ./contrib/dlz/modules/wildcard/testing/named.conf X 2013,2018,2019 -./contrib/kasp/README X 2020,2021 -./contrib/kasp/kasp.xml X 2020,2021 -./contrib/kasp/policy.good X 2020,2021 ./contrib/scripts/catzhash.py X 2020,2021 ./contrib/scripts/check-secure-delegation.pl.in PERL 2010,2012,2014,2016,2018,2019,2020 ./contrib/scripts/check5011.pl X 2013,2014,2017,2018,2019,2020,2021 From b9319fc9983d99fc5abb9cc032ea6c452a171447 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Mon, 20 Sep 2021 13:47:19 +0200 Subject: [PATCH 6/7] Remove couple old and rusty scripts from contrib/ * dnssec-keyset.sh - obsoleted by dnssec-policy * named-bootconf.sh - unmaintained script from NetBSD that would generate named.conf --- contrib/scripts/dnssec-keyset.sh | 210 --------------------- contrib/scripts/named-bootconf.sh | 299 ------------------------------ util/copyrights | 2 - 3 files changed, 511 deletions(-) delete mode 100644 contrib/scripts/dnssec-keyset.sh delete mode 100644 contrib/scripts/named-bootconf.sh diff --git a/contrib/scripts/dnssec-keyset.sh b/contrib/scripts/dnssec-keyset.sh deleted file mode 100644 index f93ac9ff47..0000000000 --- a/contrib/scripts/dnssec-keyset.sh +++ /dev/null @@ -1,210 +0,0 @@ -#!/bin/sh -# Copyright (C) 2015 Internet Systems Consortium, Inc. ("ISC") -# -# 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 ISC DISCLAIMS ALL WARRANTIES WITH -# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -# AND FITNESS. IN NO EVENT SHALL ISC 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. -# -# Original script contributed by Jeffry A. Spain - -HELP=" -Generates a set of successive DNSSEC keys for -Key timings are based on a pre-publication rollover strategy - - (lifetime) is the key active lifetime in days [default 180] - (introduction time) is the number of days from publication - to activation of a key [default 30] - (retirement time) is the number of days from inactivation - to deletion of a key [default 30] - -Options: - -a Cryptographic algorithm. See man dnssec-keygen for defaults. - -b Number of bits in the key. See man dnssec-keygen for defaults. - -k if present, generate Key Signing Keys (KSKs). Otherwise, - generate Zone Signing Keys (ZSKs). - -3 If present and if -a is not specified, use an NSEC3- - capable algorithm. See man dnssec-keygen for defaults. - -i Inception date of the set of keys, in 'mm/dd/yyyy' format. - The first two keys will be published by this date, and the - first one will be activated. Default is today. - -f Index of first key generated. Defaults to 0. - -K Key repository: write keys to this directory. Defaults to CWD. - -d Dry run. No actual keys generated if present." - -USAGE="Usage: -`basename $0` [-a ] [-b ] [-k] [-3] [-i ] - [-f ] [-d] [] [] []" - -ALGFLAG='' -BITSFLAG='' -KSKFLAG='' -NSEC3FLAG='' -KEYREPO='' -DRYRUN=false -OPTKSK=false -K=0 -INCEP=`date +%m/%d/%Y` - -# Parse command line options -while getopts ":a:b:df:hkK:3i:" thisOpt -do - case $thisOpt in - a) - ALGFLAG=" -a $OPTARG" - ;; - b) - BITSFLAG=" -b $OPTARG" - ;; - d) - DRYRUN=true - ;; - f) - OPTKSK=true - K=$OPTARG - ;; - h) - echo "$USAGE" - echo "$HELP" - exit 0 - ;; - k) - KSKFLAG=" -f KSK" - ;; - K) - KEYREPO=$OPTARG - ;; - 3) - NSEC3FLAG=" -3" - ;; - i) - INCEP=$OPTARG - ;; - *) - echo 'Unrecognized option.' - echo "$USAGE" - exit 1 - ;; - esac -done -shift `expr $OPTIND - 1` - -# Check that required arguments are present -if [ $# -gt 5 -o $# -lt 2 ]; then - echo "$USAGE" - exit 1 -fi - -# Remaining arguments: -# DNS zone name -ZONE=$1 -shift - -# Number of keys to be generated -COUNT=$1 -shift - -# Key active lifetime -LIFE=${1:-180} -[ $# -ne 0 ] && shift - -# Key introduction time (publication to activation) -INTRO=${1:-30} -[ $# -ne 0 ] && shift - -# Key retirement time (inactivation to deletion) -RET=${1:-30} - -# Today's date in dnssec-keygen format (YYYYMMDD) -TODAY=`date +%Y%m%d` - -# Key repository defaults to CWD -if [ -z "$KEYREPO" ]; then - KEYREPO="." -fi - -if $DRYRUN; then - echo 'Dry Run (no key files generated)' -elif [ ! -d "$KEYREPO" ]; then - # Create the key repository if it does not currently exist - mkdir -p "$KEYREPO" -fi - -# Iterate through the key set. K is the index, zero-based. -KLAST=`expr $K + $COUNT` -while [ $K -lt $KLAST ]; do - KEYLABEL="Key `printf \"%02d\" $K`:" - # Epoch of the current key - # (zero for the first key, increments of key lifetime) - # The epoch is in days relative to the inception date of the key set - EPOCH=`expr $LIFE \* $K` - # Activation date in days is the same as the epoch - ACTIVATE=$EPOCH - # Publication date in days relative to the key epoch - PUBLISH=`expr $EPOCH - $LIFE - $INTRO` - # Inactivation date in days relative to the key epoch - INACTIVE=`expr $EPOCH + $LIFE` - # Deletion date in days relative to the key epoch - DELETE=`expr $EPOCH + $LIFE + $RET` - - # ... these values should not precede the key epoch - [ $ACTIVATE -lt 0 ] && ACTIVATE=0 - [ $PUBLISH -lt 0 ] && PUBLISH=0 - [ $INACTIVE -lt 0 ] && INACTIVE=0 - [ $DELETE -lt 0 ] && DELETE=0 - - # Key timing dates in dnssec-keygen format (YYYYMMDD): - # publication, activation, inactivation, deletion - PDATE=`date -d "$INCEP +$PUBLISH day" +%Y%m%d` - ADATE=`date -d "$INCEP +$ACTIVATE day" +%Y%m%d` - IDATE=`date -d "$INCEP +$INACTIVE day" +%Y%m%d` - DDATE=`date -d "$INCEP +$DELETE day" +%Y%m%d` - - # Construct the dnssec-keygen command including all the specified options. - # Suppress key generation progress information, and save the key in - # the $KEYREPO directory. - KEYGENCMD="dnssec-keygen -q$ALGFLAG$BITSFLAG$NSEC3FLAG$KSKFLAG -P $PDATE -A $ADATE -I $IDATE -D $DDATE -K $KEYREPO $ZONE" - echo "$KEYLABEL $KEYGENCMD" - - # Generate the key and retrieve its name - if $DRYRUN; then - KEYNAME="DryRunKey-`printf \"%02d\" $K`" - else - KEYNAME=`$KEYGENCMD` - fi - - # Indicate the key status based on key timing dates relative to today - if [ $TODAY -ge $DDATE ]; then - echo "$KEYLABEL $KEYNAME is obsolete post deletion date." - elif [ $TODAY -ge $IDATE ]; then - echo "$KEYLABEL $KEYNAME is published and inactive prior to deletion date." - elif [ $TODAY -ge $ADATE ]; then - echo "$KEYLABEL $KEYNAME is published and active." - elif [ $TODAY -ge $PDATE ]; then - echo "$KEYLABEL $KEYNAME is published prior to activation date." - else - echo "$KEYLABEL $KEYNAME is pending publication." - fi - - # For published KSKs, generate the required DS records, - # saving them to the file $KEYREPO/DS-$KEYNAME - if $OPTKSK && [ $TODAY -ge $PDATE -a $TODAY -lt $DDATE ]; then - echo "$KEYLABEL $KEYNAME (KSK) requires the publication of DS records in the parent zone." - if $DRYRUN; then - echo "$KEYLABEL No DS-$KEYNAME file created." - else - dnssec-dsfromkey "$KEYREPO/$KEYNAME" > "$KEYREPO/DS-$KEYNAME" - echo "$KEYLABEL See $KEYREPO/DS-$KEYNAME." - fi - fi - K=`expr $K + 1` -done - -exit 0 diff --git a/contrib/scripts/named-bootconf.sh b/contrib/scripts/named-bootconf.sh deleted file mode 100644 index cef5f8af1a..0000000000 --- a/contrib/scripts/named-bootconf.sh +++ /dev/null @@ -1,299 +0,0 @@ -#!/bin/sh -# -# Portions Copyright (C) Internet Systems Consortium, Inc. ("ISC") -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, you can obtain one at https://mozilla.org/MPL/2.0/. -# -# See the COPYRIGHT file distributed with this work for additional -# information regarding copyright ownership. - -# $NetBSD: named-bootconf.sh,v 1.5 1998/12/15 01:00:53 tron Exp $ -# -# Copyright (c) 1995, 1998 The NetBSD Foundation, Inc. -# All rights reserved. -# -# This code is derived from software contributed to The NetBSD Foundation -# by Matthias Scheler. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS -# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS -# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. - -if [ ${OPTIONFILE-X} = X ]; then - WORKDIR=/tmp/`date +%s`.$$ - ( umask 077 ; mkdir $WORKDIR ) || { - echo "unable to create work directory '$WORKDIR'" >&2 - exit 1 - } - OPTIONFILE=$WORKDIR/options - ZONEFILE=$WORKDIR/zones - COMMENTFILE=$WORKDIR/comments - export OPTIONFILE ZONEFILE COMMENTFILE - touch $OPTIONFILE $ZONEFILE $COMMENTFILE - DUMP=1 -else - DUMP=0 -fi - -while read CMD ARGS; do - class= - CMD=`echo "${CMD}" | tr '[A-Z]' '[a-z]'` - case $CMD in - \; ) - echo \# $ARGS >>$COMMENTFILE - ;; - cache ) - set - X $ARGS - shift - if [ $# -eq 2 ]; then - (echo "" - cat $COMMENTFILE - echo "zone \"$1\" {" - echo " type hint;" - echo " file \"$2\";" - echo "};") >>$ZONEFILE - rm -f $COMMENTFILE - touch $COMMENTFILE - fi - ;; - directory ) - set - X $ARGS - shift - if [ $# -eq 1 ]; then - (cat $COMMENTFILE - echo " directory \"$1\";") >>$OPTIONFILE - rm -f $COMMENTFILE - touch $COMMENTFILE - - DIRECTORY=$1 - export DIRECTORY - fi - ;; - forwarders ) - (cat $COMMENTFILE - echo " forwarders {" - for ARG in $ARGS; do - echo " $ARG;" - done - echo " };") >>$OPTIONFILE - rm -f $COMMENTFILE - touch $COMMENTFILE - ;; - include ) - if [ "$ARGS" != "" ]; then - (cd ${DIRECTORY-.}; cat $ARGS) | $0 - fi - ;; - limit ) - ARGS=`echo "${ARGS}" | tr '[A-Z]' '[a-z]'` - set - X $ARGS - shift - if [ $# -eq 2 ]; then - cat $COMMENTFILE >>$OPTIONFILE - case $1 in - datasize | files | transfers-in | transfers-per-ns ) - echo " $1 $2;" >>$OPTIONFILE - ;; - esac - rm -f $COMMENTFILE - touch $COMMENTFILE - fi - ;; - options ) - ARGS=`echo "${ARGS}" | tr '[A-Z]' '[a-z]'` - cat $COMMENTFILE >>$OPTIONFILE - for ARG in $ARGS; do - case $ARG in - fake-iquery ) - echo " fake-iquery yes;" >>$OPTIONFILE - ;; - forward-only ) - echo " forward only;" >>$OPTIONFILE - ;; - no-fetch-glue ) - echo " fetch-glue no;" >>$OPTIONFILE - ;; - no-recursion ) - echo " recursion no;" >>$OPTIONFILE - ;; - esac - done - rm -f $COMMENTFILE - touch $COMMENTFILE - ;; - primary|primary/* ) - case $CMD in - primary/chaos ) - class="chaos " - ;; - primary/hs ) - class="hesiod " - ;; - esac - set - X $ARGS - shift - if [ $# -eq 2 ]; then - (echo "" - cat $COMMENTFILE - echo "zone \"$1\" ${class}{" - echo " type master;" - echo " file \"$2\";" - echo "};") >>$ZONEFILE - rm -f $COMMENTFILE - touch $COMMENTFILE - fi - ;; - secondary|secondary/* ) - case $CMD in - secondary/chaos ) - class="chaos " - ;; - secondary/hs ) - class="hesiod " - ;; - esac - set - X $ARGS - shift - if [ $# -gt 2 ]; then - ZONE=$1 - shift - PRIMARIES=$1 - while [ $# -gt 2 ]; do - shift - PRIMARIES="$PRIMARIES $1" - done - (echo "" - cat $COMMENTFILE - echo "zone \"$ZONE\" ${class}{" - echo " type slave;" - echo " file \"$2\";" - echo " masters {" - for PRIMARY in $PRIMARIES; do - echo " $PRIMARY;" - done - echo " };" - echo "};") >>$ZONEFILE - rm -f $COMMENTFILE - touch $COMMENTFILE - fi - ;; - stub|stub/* ) - case $CMD in - stub/chaos ) - class="chaos " - ;; - stub/hs ) - class="hesiod " - ;; - esac - set - X $ARGS - shift - if [ $# -gt 2 ]; then - ZONE=$1 - shift - PRIMARIES=$1 - while [ $# -gt 2 ]; do - shift - PRIMARIES="$PRIMARIES $1" - done - (echo "" - cat $COMMENTFILE - echo "zone \"$ZONE\" ${class}{" - echo " type stub;" - echo " file \"$2\";" - echo " masters {" - for PRIMARY in $PRIMARIES; do - echo " $PRIMARY;" - done - echo " };" - echo "};") >>$ZONEFILE - rm -f $COMMENTFILE - touch $COMMENTFILE - fi - ;; - slave ) - cat $COMMENTFILE >>$OPTIONFILE - echo " forward only;" >>$OPTIONFILE - rm -f $COMMENTFILE - touch $COMMENTFILE - ;; - sortlist ) - (cat $COMMENTFILE - echo " topology {" - for ARG in $ARGS; do - case $ARG in - *.0.0.0 ) - echo " $ARG/8;" - ;; - *.0.0 ) - echo " $ARG/16;" - ;; - *.0 ) - echo " $ARG/24;" - ;; - * ) - echo " $ARG;" - ;; - esac - done - echo " };") >>$OPTIONFILE - rm -f $COMMENTFILE - touch $COMMENTFILE - ;; - tcplist | xfrnets ) - (cat $COMMENTFILE - echo " allow-transfer {" - for ARG in $ARGS; do - case $ARG in - *.0.0.0 ) - echo " $ARG/8;" - ;; - *.0.0 ) - echo " $ARG/16;" - ;; - *.0 ) - echo " $ARG/24;" - ;; - * ) - echo " $ARG;" - ;; - esac - done - echo " };") >>$OPTIONFILE - rm -f $COMMENTFILE - touch $COMMENTFILE - ;; - esac -done - -if [ $DUMP -eq 1 ]; then - echo "" - echo "options {" - cat $OPTIONFILE - echo "};" - cat $ZONEFILE $COMMENTFILE - - rm -f $OPTIONFILE $ZONEFILE $COMMENTFILE - rmdir $WORKDIR -fi - -exit 0 diff --git a/util/copyrights b/util/copyrights index e0b70326eb..2d0d2faf53 100644 --- a/util/copyrights +++ b/util/copyrights @@ -983,8 +983,6 @@ ./contrib/scripts/catzhash.py X 2020,2021 ./contrib/scripts/check-secure-delegation.pl.in PERL 2010,2012,2014,2016,2018,2019,2020 ./contrib/scripts/check5011.pl X 2013,2014,2017,2018,2019,2020,2021 -./contrib/scripts/dnssec-keyset.sh X 2015,2018,2019,2020,2021 -./contrib/scripts/named-bootconf.sh SH.PORTION 1999,2000,2001,2004,2006,2007,2012,2014,2016,2018,2019,2020,2021 ./contrib/scripts/nanny.pl PERL 2000,2001,2004,2007,2012,2014,2016,2018,2019,2020,2021 ./contrib/scripts/zone-edit.sh.in SH 2010,2012,2014,2016,2018,2019,2020 ./dangerfile.py PYTHON 2020,2021 From e543054d5695949cb92dad6ee33f35dcd6f59d11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Mon, 20 Sep 2021 13:35:10 +0200 Subject: [PATCH 7/7] Add CHANGES and release note for [GL #2814] --- CHANGES | 3 +++ doc/notes/notes-current.rst | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/CHANGES b/CHANGES index 6734103c29..f527025ed9 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +5720. [contrib] Remove old-style DLZ drivers that had to be enabled + during compile time. [GL #2814] + 5719. [func] The "masterfile-format" format "map" has been removed. [GL #2882] diff --git a/doc/notes/notes-current.rst b/doc/notes/notes-current.rst index 91d666e96c..cfa98cedde 100644 --- a/doc/notes/notes-current.rst +++ b/doc/notes/notes-current.rst @@ -37,6 +37,10 @@ Removed Features ``named-compilezone`` and change the configuration prior to BIND 9 upgrade. :gl:`#2882` +- Remove old-style DLZ drivers that had to be enabled in ``named`` during the + compile time. The new-style dynamically loaded DLZ modules should be used + as a replacement. :gl:`#2814` + Feature Changes ~~~~~~~~~~~~~~~