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/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..f3811b9c1b 100644 --- a/contrib/README +++ b/contrib/README @@ -8,32 +8,11 @@ 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 - using BIND with Nginx as a TLS proxy. - - - 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 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/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/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/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/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/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/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/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 ~~~~~~~~~~~~~~~ diff --git a/util/copyrights b/util/copyrights index 36a01736f3..2d0d2faf53 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 @@ -934,33 +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/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 @@ -987,11 +949,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 @@ -1016,15 +980,9 @@ ./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 ./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