# 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.

dnl
AC_DIVERT_PUSH(1)dnl
esyscmd([sed -e 's/^/# /' -e '/Portions of this code/,$d' COPYRIGHT])dnl
AC_DIVERT_POP()dnl

AC_INIT(BIND, [9.11], [info@isc.org], [], [https://www.isc.org/downloads/BIND/])
AC_PREREQ(2.59)

AC_CONFIG_HEADER(config.h)
AC_CONFIG_MACRO_DIR([libtool.m4])

AC_CANONICAL_HOST

AC_PROG_MAKE_SET

#
# GNU libtool support
#
case $build_os in
sunos*)
    # Just set the maximum command line length for sunos as it otherwise
    # takes a exceptionally long time to work it out. Required for libtool.

    lt_cv_sys_max_cmd_len=4096;
    ;;
esac

AC_PROG_LIBTOOL
AC_PROG_INSTALL
AC_PROG_LN_S

AC_SUBST(STD_CINCLUDES)
AC_SUBST(STD_CDEFINES)
AC_SUBST(STD_CWARNINGS)
AC_SUBST(CCOPT)
AC_SUBST(CCNOOPT)
AC_SUBST(BACKTRACECFLAGS)

#
# Use pkg-config
#

PKG_PROG_PKG_CONFIG

# Warn if the user specified libbind, which is now deprecated
AC_ARG_ENABLE(libbind, AS_HELP_STRING([--enable-libbind], [deprecated]))

case "$enable_libbind" in
	yes)
		AC_MSG_ERROR(['libbind' is no longer part of the BIND 9 distribution.
It is available from http://www.isc.org as a separate download.])
		;;
	no|'')
		;;
esac

AC_ARG_ENABLE(buffer_useinline, AS_HELP_STRING([--enable-buffer-useinline],
	      [define ISC_BUFFER_USEINLINE when compiling [[default=yes]]]),
	      if test yes = "${enable}"
	      then
		      AC_DEFINE([ISC_BUFFER_USEINLINE], [1],
			        [Define if you want to use inline buffers])
	      fi,
	      AC_DEFINE([ISC_BUFFER_USEINLINE], [1]))

AC_ARG_ENABLE(warn_shadow,
	      AS_HELP_STRING([--enable-warn-shadow],
			     [turn on -Wshadow when compiling]))

AC_ARG_ENABLE(warn_error,
	      AS_HELP_STRING([--enable-warn-error],
			    [turn on -Werror when compiling]))

AC_ARG_ENABLE(developer,
	      AS_HELP_STRING([--enable-developer],
			     [enable developer build settings]))
XTARGETS=
case "$enable_developer" in
yes)
	STD_CDEFINES="$STD_CDEFINES -DISC_LIST_CHECKINIT=1"
	test "${enable_fixed_rrset+set}" = set || enable_fixed_rrset=yes
	test "${enable_querytrace+set}" = set || enable_querytrace=yes
	test "${enable_filter_aaaa+set}" = set || enable_filter_aaaa=yes
	test "${with_cmocka+set}" = set || with_cmocka=yes
	test "${with_dlz_filesystem+set}" = set || with_dlz_filesystem=yes
	test "${enable_symtable+set}" = set || enable_symtable=all
	test "${enable_warn_error+set}" = set || enable_warn_error=yes
	test "${enable_warn_shadow+set}" = set || enable_warn_shadow=yes
	test "${with_zlib+set}" = set || with_zlib=yes
	XTARGETS='${XTARGETS}'
	;;
esac
AC_SUBST(XTARGETS)

# American Fuzzy Lop
AC_ARG_ENABLE(afl,
	      AS_HELP_STRING([--enable-afl],
			     [enable American Fuzzy Lop test harness
				[default=no]]),
	      [AC_DEFINE([ENABLE_AFL], [1],
			 [Define to enable American Fuzzy Lop test harness])])
case "$enable_afl" in
yes)
	LIBS="$LIBS -lpthread"
	;;
esac


#libseccomp sandboxing
AC_CHECK_FUNCS(getrandom)
AC_ARG_ENABLE(seccomp,
	      AS_HELP_STRING([--enable-seccomp],
			     [enable support for libseccomp system call
				 filtering [default=no]]))
case "$enable_seccomp" in
	yes)
	case $host_os in
	linux*)
		;;
	*)
		AC_MSG_WARN([seccomp is not supported on non-linux platforms; disabling it])
		enable_seccomp=no
		;;
	esac
	AC_SEARCH_LIBS(seccomp_init, [seccomp])
	if test "X$ac_cv_search_seccomp_init" = "X-lseccomp" ; then
		AC_TRY_RUN([
		#include <stdio.h>
		#include <stdlib.h>
		#include <errno.h>
		#include <sys/prctl.h>
		#include <linux/seccomp.h>

		int main(void)
		{
			int ret;

			ret = prctl(PR_GET_SECCOMP, 0, 0, 0, 0);
			if (ret < 0) {
				switch (errno) {
				case ENOSYS:
					return 1;
				case EINVAL:
					return 1;
				default:
					return 1;
				}
			}
			ret =
			prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, NULL, 0, 0);
			if (ret < 0) {
				switch (errno) {
				case EINVAL:
					return 1;
				case EFAULT:
					return 0;
				default:
					return 1;
			}
		}
	return 1;
	}
	]
	, AC_DEFINE([HAVE_LIBSECCOMP], 1,
	[Define to use libseccomp system call filtering.])
	, []
	)
	fi
		;;
	*)
		;;
esac

#
# Make very sure that these are the first files processed by
# config.status, since we use the processed output as the input for
# AC_SUBST_FILE() substitutions in other files.
#
AC_CONFIG_FILES([make/rules make/includes])

AC_PATH_PROG(AR, ar)
ARFLAGS="cruv"
AC_SUBST(AR)
AC_SUBST(ARFLAGS)

# The POSIX ln(1) program.  Non-POSIX systems may substitute
# "copy" or something.
LN=ln
AC_SUBST(LN)

case "$AR" in
	"")
		AC_MSG_ERROR([
ar program not found.  Please fix your PATH to include the directory in
which ar resides, or set AR in the environment with the full path to ar.
])

		;;
esac

#
# Etags.
#
AC_PATH_PROGS(ETAGS, etags emacs-etags)

#
# Some systems, e.g. RH7, have the Exuberant Ctags etags instead of
# GNU emacs etags, and it requires the -L flag.
#
if test "X$ETAGS" != "X"; then
	AC_MSG_CHECKING(for Exuberant Ctags etags)
	if $ETAGS --version 2>&1 | grep 'Exuberant Ctags' >/dev/null 2>&1; then
		AC_MSG_RESULT(yes)
		ETAGS="$ETAGS -L"
	else
		AC_MSG_RESULT(no)
	fi
fi
AC_SUBST(ETAGS)

#
# Perl is optional; it is used only by some of the system test scripts.
# Note: the backtrace feature (see below) uses perl to build the symbol table,
# but it still compiles without perl, in which case an empty table will be used.
#
AC_PATH_PROGS(PERL, perl5 perl)
AC_SUBST(PERL)

#
# Python is also optional but required by default so that dnssec-keymgr gets
# installed unless explicitly prevented by the user using --without-python.
#
testminvers='import sys
if (sys.version_info < (2,7)) or (sys.version_info < (3,2) and sys.version_info >= (3,0)):
   exit(1)'

testargparse='try: import argparse
except: exit(1)'

testply='try: import ply
except: exit(1)'

default_with_python="python python3 python3.7 python3.6 python3.5 python3.4 python3.3 python3.2 python2 python2.7"

AC_ARG_WITH([python],
	    AS_HELP_STRING([--with-python=PATH],
			   [specify path to Python interpreter]),
	    [], [with_python=$default_with_python])
AC_ARG_WITH([python-install-dir],
	    AS_HELP_STRING([--with-python-install-dir=PATH],
			   [installation directory for Python modules]),
	    [], with_python_install_dir="")

AS_IF([test "$with_python" = "yes"],
      [with_python=$default_with_python])

AS_IF([test "$with_python" = "no"],
      [AC_MSG_CHECKING([for Python support])
       AC_MSG_RESULT([disabled])],
      [for p in $with_python
       do
	 AS_CASE([$p],
		 [/*],[PYTHON="$p"])

	 AC_PATH_PROG([PYTHON], [$p])
	 # Do not cache the result of the check from the previous line.  If the
	 # first found Python interpreter has missing module dependencies and
	 # the result of the above check is cached, subsequent module checks
	 # will erroneously keep on using the cached path to the first found
	 # Python interpreter instead of different ones.
	 unset ac_cv_path_PYTHON

	 AS_IF([test -z "$PYTHON"], [continue])

	 AC_MSG_CHECKING([if $PYTHON is python2 version >= 2.7 or python3 version >= 3.2])
	 AS_IF(["$PYTHON" -c "$testminvers" 2>/dev/null],
	       [AC_MSG_RESULT([yes])],
	       [AC_MSG_RESULT([no])
		unset PYTHON
		continue])

	 AC_MSG_CHECKING([Python module 'argparse'])
	 AS_IF(["$PYTHON" -c "$testargparse" 2>/dev/null],
	       [AC_MSG_RESULT([yes])],
	       [AC_MSG_RESULT([no])
		unset PYTHON
		continue])

	 AC_MSG_CHECKING([Python module 'ply'])
	 AS_IF(["$PYTHON" -c "$testply" 2>/dev/null],
	       [AC_MSG_RESULT([yes])],
	       [AC_MSG_RESULT([no])
		unset PYTHON
		continue])

	 # Stop looking any further once we find a Python interpreter
	 # satisfying all requirements.
	 break
       done

       AS_IF([test "X$PYTHON" = "X"],
	     [AC_MSG_CHECKING([for Python support])
	      AC_MSG_RESULT([no])
	      AC_MSG_ERROR([Python required for dnssec-keymgr])])])

PYTHON_TOOLS=''
CHECKDS=''
COVERAGE=''
KEYMGR=''
AS_IF([test "X$PYTHON" != "X"],
      [PYTHON_TOOLS=python
       CHECKDS=checkds
       COVERAGE=coverage
       KEYMGR=keymgr
       PYTHON_INSTALL_DIR="$with_python_install_dir"
       AS_IF([test -n "$with_python_install_dir"],
	     [PYTHON_INSTALL_LIB="--install-lib=$with_python_install_dir"])])
AC_SUBST(CHECKDS)
AC_SUBST(COVERAGE)
AC_SUBST(KEYMGR)
AC_SUBST(PYTHON_TOOLS)
AC_SUBST(PYTHON_INSTALL_DIR)
AC_SUBST(PYTHON_INSTALL_LIB)

#
# Special processing of paths depending on whether --prefix,
# --sysconfdir or --localstatedir arguments were given.  What's
# desired is some compatibility with the way previous versions
# of BIND built; they defaulted to /usr/local for most parts of
# the installation, but named.boot/named.conf was in /etc
# and named.pid was in /var/run.
#
# So ... if none of --prefix, --sysconfdir or --localstatedir are
# specified, set things up that way.  If --prefix is given, use
# it for sysconfdir and localstatedir the way configure normally
# would.  To change the prefix for everything but leave named.conf
# in /etc or named.pid in /var/run, then do this the usual configure way:
# ./configure --prefix=/somewhere --sysconfdir=/etc
# ./configure --prefix=/somewhere --localstatedir=/var
#
# To put named.conf and named.pid in /usr/local with everything else,
# set the prefix explicitly to /usr/local even though that's the default:
# ./configure --prefix=/usr/local
#
case "$prefix" in
	NONE)
		case "$sysconfdir" in
			'${prefix}/etc')
				sysconfdir=/etc
				;;
		esac
		case "$localstatedir" in
			'${prefix}/var')
				localstatedir=/var
				;;
		esac
		;;
esac
expanded_sysconfdir=`eval echo $sysconfdir`
AC_SUBST(expanded_sysconfdir)

#
# Make sure INSTALL uses an absolute path, else it will be wrong in all
# Makefiles, since they use make/rules.in and INSTALL will be adjusted by
# configure based on the location of the file where it is substituted.
# Since in BIND9 INSTALL is only substituted into make/rules.in, an immediate
# subdirectory of install-sh, This relative path will be wrong for all
# directories more than one level down from install-sh.
#
case "$INSTALL" in
	/*)
		;;
	*)
		#
		# Not all systems have dirname.
		#
		changequote({, })
		ac_dir="`echo $INSTALL | sed 's%/[^/]*$%%'`"
		changequote([, ])

		ac_prog="`echo $INSTALL | sed 's%.*/%%'`"
		test "X$ac_dir" = "X$ac_prog" && ac_dir=.
		test -d "$ac_dir" && ac_dir="`(cd \"$ac_dir\" && pwd)`"
		INSTALL="$ac_dir/$ac_prog"
		;;
esac

AC_PROG_CC
AC_PROG_CC_C99

#
# OS dependent CC flags
#
case "$host" in
	# OSF 5.0: recv/send are only available with -D_POSIX_PII_SOCKET or
	# -D_XOPEN_SOURCE_EXTENDED.
	*-dec-osf*)
		STD_CDEFINES="$STD_CDEFINES -D_POSIX_PII_SOCKET"
		CPPFLAGS="$CPPFLAGS -D_POSIX_PII_SOCKET"
		;;
	#HP-UX: need -D_XOPEN_SOURCE_EXTENDED and -lxnet for CMSG macros
	*-hp-hpux*)
		STD_CDEFINES="$STD_CDEFINES -D_XOPEN_SOURCE_EXTENDED"
		CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED"
		LIBS="-lxnet $LIBS"
		;;
	# Solaris: need -D_XPG4_2 and -D__EXTENSIONS__ for CMSG macros
	*-solaris*)
		STD_CDEFINES="$STD_CDEFINES -D_XPG4_2 -D__EXTENSIONS__"
		CPPFLAGS="$CPPFLAGS -D_XPG4_2 -D__EXTENSIONS__"
		;;
	# POSIX doesn't include the IPv6 Advanced Socket API and glibc hides
	# parts of the IPv6 Advanced Socket API as a result.  This is stupid
	# as it breaks how the two halves (Basic and Advanced) of the IPv6
	# Socket API were designed to be used but we have to live with it.
	# Define _GNU_SOURCE to pull in the IPv6 Advanced Socket API.
	*-linux* | *-kfreebsd*-gnu*)
		STD_CDEFINES="$STD_CDEFINES -D_GNU_SOURCE"
		CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE"
		;;
	#
	# Starting with OSX 10.7 (Lion) we must choose which IPv6 API to use.
	# Setting this is sufficient to select the correct behavior for BIND 9.
	#
	*-darwin*)
	  STD_CDEFINES="$STD_CDEFINES -D__APPLE_USE_RFC_3542"
	  CPPFLAGS="$CPPFLAGS -D__APPLE_USE_RFC_3542"
	  ;;
esac

#
# CCNOOPT defaults to -O0 on gcc and disables optimization when is last
#
if test "X$CCNOOPT" = "X" -a "X$GCC" = "Xyes"; then
	CCNOOPT="-O0"
fi

AC_HEADER_STDC

AC_CHECK_HEADERS(fcntl.h regex.h sys/time.h unistd.h sys/mman.h sys/sockio.h sys/select.h sys/param.h sys/sysctl.h net/if6.h sys/socket.h net/route.h linux/netlink.h linux/rtnetlink.h,,,
[$ac_includes_default
#ifdef HAVE_SYS_PARAM_H
# include <sys/param.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
# include <sys/socket.h>
#endif
])

AC_C_CONST
AC_C_INLINE
AC_C_VOLATILE
AC_CHECK_FUNC(sysctlbyname, AC_DEFINE(HAVE_SYSCTLBYNAME))
AC_C_FLEXIBLE_ARRAY_MEMBER

#
# Check for the existence of mmap to enable the fast format zones
#
AC_CHECK_FUNCS(mmap)

#
# Older versions of HP/UX don't define seteuid() and setegid()
#
AC_CHECK_FUNCS(seteuid setresuid)
AC_CHECK_FUNCS(setegid setresgid)

# BSDI doesn't have ftello fseeko
AC_CHECK_FUNCS(ftello fseeko)

#
# UnixWare 7.1.1 with the feature supplement to the UDK compiler
# is reported to not support "static inline" (RT #1212).
#
AC_MSG_CHECKING(for static inline breakage)
AC_TRY_COMPILE([
	static inline int foo1() {
		return 0;
	}

	static inline int foo2() {
		return foo1();
	}
	], [foo1();],
	[AC_MSG_RESULT(no)],
	[AC_MSG_RESULT(yes)
	 AC_DEFINE(inline, ,[Define to empty if your compiler does not support "static inline".])])

AC_TYPE_SIZE_T
AC_TYPE_SSIZE_T
AC_TYPE_UINTPTR_T

AC_CHECK_TYPE(socklen_t,
[AC_DEFINE(ISC_SOCKADDR_LEN_T, socklen_t)],
[
AC_TRY_COMPILE(
[
#include <sys/types.h>
#include <sys/socket.h>
int getsockname(int, struct sockaddr *, size_t *);
],[],
[AC_DEFINE(ISC_SOCKADDR_LEN_T, size_t)],
[AC_DEFINE(ISC_SOCKADDR_LEN_T, int)])
],
[
#include <sys/types.h>
#include <sys/socket.h>
])
AC_SUBST(ISC_SOCKADDR_LEN_T)
AC_HEADER_TIME
AC_MSG_CHECKING(for long long)
AC_TRY_COMPILE([],[long long i = 0; return (0);],
	[AC_MSG_RESULT(yes)
		ISC_PLATFORM_HAVELONGLONG="#define ISC_PLATFORM_HAVELONGLONG 1"],
	[AC_MSG_RESULT(no)
		ISC_PLATFORM_HAVELONGLONG="#undef ISC_PLATFORM_HAVELONGLONG"])
AC_SUBST(ISC_PLATFORM_HAVELONGLONG)

#
# check for uname library routine
#
AC_MSG_CHECKING(for uname)
AC_TRY_COMPILE([
#include <sys/utsname.h>
#include <stdio.h>
],
[
struct utsname uts;
uname(&uts);
printf("running on %s %s %s for %s\n",
       uts.sysname, uts.release, uts.version, uts.machine);
],
	[AC_MSG_RESULT(yes)
	 AC_DEFINE(HAVE_UNAME)],
	[AC_MSG_RESULT(no)
	 AC_MSG_WARN([uname is not correctly supported])])

#
# check for GCC noreturn attribute
#
AC_MSG_CHECKING(for GCC noreturn attribute)
AC_TRY_COMPILE([],[void foo() __attribute__((noreturn));],
	[AC_MSG_RESULT(yes)
		ISC_PLATFORM_NORETURN_PRE="#define ISC_PLATFORM_NORETURN_PRE"
		ISC_PLATFORM_NORETURN_POST="#define ISC_PLATFORM_NORETURN_POST __attribute__((noreturn))"],
	[AC_MSG_RESULT(no)
		ISC_PLATFORM_NORETURN_PRE="#define ISC_PLATFORM_NORETURN_PRE"
		ISC_PLATFORM_NORETURN_POST="#define ISC_PLATFORM_NORETURN_POST"])
AC_SUBST(ISC_PLATFORM_NORETURN_PRE)
AC_SUBST(ISC_PLATFORM_NORETURN_POST)

#
# check if we have lifconf
#
AC_MSG_CHECKING(for struct lifconf)
AC_TRY_COMPILE([
#include <sys/types.h>
#include <sys/socket.h>
#include <net/if.h>
],
[
struct lifconf lifconf;
lifconf.lifc_len = 0;
]
,
	[AC_MSG_RESULT(yes)
		ISC_PLATFORM_HAVELIFCONF="#define ISC_PLATFORM_HAVELIFCONF 1"],
	[AC_MSG_RESULT(no)
		ISC_PLATFORM_HAVELIFCONF="#undef ISC_PLATFORM_HAVELIFCONF"])
AC_SUBST(ISC_PLATFORM_HAVELIFCONF)

#
# check if we have kqueue
#
AC_ARG_ENABLE(kqueue,
	      AS_HELP_STRING([--enable-kqueue],
			     [use BSD kqueue when available [default=yes]]),
	      want_kqueue="$enableval",  want_kqueue="yes")
case $want_kqueue in
yes)
	AC_CHECK_FUNC(kqueue, ac_cv_have_kqueue=yes, ac_cv_have_kqueue=no)
	case $ac_cv_have_kqueue in
	yes)
		ISC_PLATFORM_HAVEKQUEUE="#define ISC_PLATFORM_HAVEKQUEUE 1"
		;;
	*)
		ISC_PLATFORM_HAVEKQUEUE="#undef ISC_PLATFORM_HAVEKQUEUE"
		;;
	esac
	;;
*)
	ISC_PLATFORM_HAVEKQUEUE="#undef ISC_PLATFORM_HAVEKQUEUE"
	;;
esac
AC_SUBST(ISC_PLATFORM_HAVEKQUEUE)

#
# check if we have epoll.  Linux kernel 2.4 has epoll_create() which fails,
# so we need to try running the code, not just test its existence.
#
AC_ARG_ENABLE(epoll,
	      AS_HELP_STRING([--enable-epoll],
			     [use Linux epoll when available [default=auto]]),
	      want_epoll="$enableval",  want_epoll="auto")
case $want_epoll in
auto)
	AC_MSG_CHECKING(epoll support)
	AC_TRY_RUN([
#include <sys/epoll.h>
int main() {
	if (epoll_create(1) < 0)
		return (1);
	return (0);
}
],
	[AC_MSG_RESULT(yes)
	ISC_PLATFORM_HAVEEPOLL="#define ISC_PLATFORM_HAVEEPOLL 1"],
	[AC_MSG_RESULT(no)
	ISC_PLATFORM_HAVEEPOLL="#undef ISC_PLATFORM_HAVEEPOLL"],
	[AC_MSG_RESULT(no)
	ISC_PLATFORM_HAVEEPOLL="#undef ISC_PLATFORM_HAVEEPOLL"])
	;;
yes)
	ISC_PLATFORM_HAVEEPOLL="#define ISC_PLATFORM_HAVEEPOLL 1"
	;;
*)
	ISC_PLATFORM_HAVEEPOLL="#undef ISC_PLATFORM_HAVEEPOLL"
	;;
esac
AC_SUBST(ISC_PLATFORM_HAVEEPOLL)

#
# check if we support /dev/poll
#
AC_ARG_ENABLE(devpoll,
	      AS_HELP_STRING([--enable-devpoll],
			     [use /dev/poll when available [default=yes]]),
	      want_devpoll="$enableval",  want_devpoll="yes")
case $want_devpoll in
yes)
	AC_CHECK_HEADERS(sys/devpoll.h devpoll.h,
	ISC_PLATFORM_HAVEDEVPOLL="#define ISC_PLATFORM_HAVEDEVPOLL 1"
	,
	ISC_PLATFORM_HAVEDEVPOLL="#undef ISC_PLATFORM_HAVEDEVPOLL"
	)
	;;
*)
	ISC_PLATFORM_HAVEDEVPOLL="#undef ISC_PLATFORM_HAVEDEVPOLL"
	;;
esac
AC_SUBST(ISC_PLATFORM_HAVEDEVPOLL)

#
# check if we need to #include sys/select.h explicitly
#
case $ac_cv_header_unistd_h in
yes)
AC_MSG_CHECKING(if unistd.h or sys/types.h defines fd_set)
AC_TRY_COMPILE([
#include <sys/types.h> /* Ultrix */
#include <unistd.h>],
[fd_set read_set; return (0);],
	[AC_MSG_RESULT(yes)
	 ISC_PLATFORM_NEEDSYSSELECTH="#undef ISC_PLATFORM_NEEDSYSSELECTH"
	 LWRES_PLATFORM_NEEDSYSSELECTH="#undef LWRES_PLATFORM_NEEDSYSSELECTH"],
	[AC_MSG_RESULT(no)
	case $ac_cv_header_sys_select_h in
	yes)
	 ISC_PLATFORM_NEEDSYSSELECTH="#define ISC_PLATFORM_NEEDSYSSELECTH 1"
	 LWRES_PLATFORM_NEEDSYSSELECTH="#define LWRES_PLATFORM_NEEDSYSSELECTH 1"
		;;
	no)
		AC_MSG_ERROR([need either working unistd.h or sys/select.h])
		;;
	esac
	])
	;;
no)
	case $ac_cv_header_sys_select_h in
	yes)
	     ISC_PLATFORM_NEEDSYSSELECTH="#define ISC_PLATFORM_NEEDSYSSELECTH 1"
	     LWRES_PLATFORM_NEEDSYSSELECTH="#define LWRES_PLATFORM_NEEDSYSSELECTH 1"
		;;
	no)
		AC_MSG_ERROR([need either unistd.h or sys/select.h])
		;;
	esac
	;;
esac
AC_SUBST(ISC_PLATFORM_NEEDSYSSELECTH)
AC_SUBST(LWRES_PLATFORM_NEEDSYSSELECTH)

#
# Find the machine's endian flavor.
#
AC_C_BIGENDIAN

#
# GeoIP support?
#
GEOIPLINKSRCS=
GEOIPLINKOBJS=
AC_ARG_WITH(geoip,
	    AS_HELP_STRING([--with-geoip=PATH],
			   [Build with GeoIP support (yes|no|path)]),
	    use_geoip="$withval", use_geoip="no")

if test "yes" = "$use_geoip"
then
	for d in /usr /usr/local /opt/local
	do
		if test -f $d/include/GeoIP.h
		then
			use_geoip=$d
			break
		fi
	done
fi

case "$use_geoip" in
	no|'')
		AC_MSG_CHECKING([for GeoIP support])
		AC_MSG_RESULT([disabled])
		;;
	*)
		if test -d "$use_geoip" -o -L "$use_geoip"
		then
			CFLAGS="$CFLAGS -I$use_geoip/include"
			CPPFLAGS="$CPPFLAGS -I$use_geoip/include"
			LIBS="$LIBS -L$use_geoip/lib"
			case "$host_os" in
				netbsd*|openbsd*|solaris*)
					LIBS="$LIBS -Wl,-rpath=$use_geoip/lib"
					;;
			esac
		elif test "yes" = "$use_geoip"
		then
			AC_MSG_ERROR([GeoIP path not found])
		else
			AC_MSG_ERROR([GeoIP path $use_geoip does not exist])
		fi
		AC_CHECK_HEADER(GeoIP.h, [],
			[AC_MSG_ERROR([GeoIP header file not found])]
		)
		AC_SEARCH_LIBS(GeoIP_id_by_addr_gl, GeoIP, [],
			[AC_MSG_ERROR([suitable GeoIP library not found])]
		)
		AC_SEARCH_LIBS(fabsf, m, [],
			[AC_MSG_ERROR([Math library not found])]
		)
		AC_DEFINE(HAVE_GEOIP, 1, Build with GeoIP support)
		GEOIPLINKSRCS='${GEOIPLINKSRCS}'
		GEOIPLINKOBJS='${GEOIPLINKOBJS}'
		AC_MSG_CHECKING([for GeoIP support])
		AC_MSG_RESULT([yes])

		AC_MSG_CHECKING([for GeoIP Country IPv6 support])
		AC_COMPILE_IFELSE(
			[AC_LANG_PROGRAM([
				#include <GeoIP.h>
				#include <netinet/in.h>
			], [
				struct in6_addr in6;
				GeoIP_country_name_by_ipnum_v6(NULL, in6);
			])],
			[
				AC_MSG_RESULT([yes])
				AC_DEFINE(HAVE_GEOIP_V6, 1, Build with GeoIP Country IPv6 support)
			],
			[AC_MSG_RESULT([no])]
		)

		AC_MSG_CHECKING([for GeoIP City IPv6 support])
		AC_COMPILE_IFELSE(
			[AC_LANG_PROGRAM([
				#include <GeoIP.h>
				#include <GeoIPCity.h>
				#include <netinet/in.h>
			], [
				struct in6_addr in6;
				int i = GEOIP_CITY_EDITION_REV0_V6;
				GeoIP_record_by_ipnum_v6(NULL, in6);
			])],
			[
				AC_MSG_RESULT([yes])
				AC_DEFINE(HAVE_GEOIP_CITY_V6, 1, Build with GeoIP City IPv6 support)
			],
			[AC_MSG_RESULT([no])]
		)
		;;
esac
AC_SUBST(GEOIPLINKSRCS)
AC_SUBST(GEOIPLINKOBJS)

AC_MSG_CHECKING(for GSSAPI library)
AC_ARG_WITH(gssapi,
	    AS_HELP_STRING([--with-gssapi=[PATH|[/path/]krb5-config]],
			   [Specify path for system-supplied GSSAPI
				[default=yes]]),
	    use_gssapi="$withval", use_gssapi="yes")

# first try using krb5-config, if that does not work then fall back to "yes" method.

case "$use_gssapi" in
*/krb5-config|krb5-config)
    AC_MSG_RESULT(trying $use_gssapi)
    if test krb5-config = "$use_gssapi"
    then
	AC_PATH_PROG(KRB5_CONFIG, $use_gssapi)
    else
	KRB5_CONFIG="$use_gssapi"
    fi
    gssapi_cflags=`$KRB5_CONFIG --cflags gssapi`
    gssapi_libs=`$KRB5_CONFIG --libs gssapi`
    saved_cppflags="$CPPFLAGS"
    CPPFLAGS="$gssapi_cflags $CPPFLAGS"
    AC_CHECK_HEADERS(gssapi.h gssapi/gssapi.h,
	[ISC_PLATFORM_GSSAPIHEADER="#define ISC_PLATFORM_GSSAPIHEADER <$ac_header>"])
    if test "" = "$ISC_PLATFORM_GSSAPIHEADER"; then
	AC_MSG_RESULT([krb5-config: gssapi.h not found])
	CPPFLAGS="$saved_cppflags"
	use_gssapi="yes"
    else
	AC_CHECK_HEADERS(krb5/krb5.h krb5.h,
	    [ISC_PLATFORM_KRB5HEADER="#define ISC_PLATFORM_KRB5HEADER <$ac_header>"])
	if test "" = "$ISC_PLATFORM_KRB5HEADER"; then
	    AC_MSG_RESULT([krb5-config: krb5.h not found])
	    CPPFLAGS="$saved_cppflags"
	    use_gssapi="yes"
	else
	    CPPFLAGS="$saved_cppflags"
	    saved_libs="$LIBS"
	    LIBS=$gssapi_libs
	    AC_MSG_CHECKING([krb5-config linking as $LIBS])
	    AC_TRY_LINK( , [gss_acquire_cred();krb5_init_context()],
		gssapi_linked=yes, gssapi_linked=no)
	    case $gssapi_linked in
		yes) AC_MSG_RESULT([krb5-config: linked]);;
		no)  AC_MSG_RESULT([krb5-config: could not determine proper GSSAPI linkage])
		    use_gssapi="yes"
		    ;;
	    esac
	    LIBS=$saved_libs
	fi
    fi
    if test "yes" = "$use_gssapi"; then
	AC_MSG_CHECKING([for GSSAPI library, non krb5-config method])
    fi
    ;;
esac

case "$host" in
*darwin*)
	if test "yes" = "$use_gssapi"
	then
		use_gssapi=framework
	fi
	;;
esac

# gssapi is just the framework, we really require kerberos v5, so
# look for those headers (the gssapi headers must be there, too)
# The problem with this implementation is that it doesn't allow
# for the specification of gssapi and krb5 headers in different locations,
# which probably ought to be fixed although fixing might raise the issue of
# trying to build with incompatible versions of gssapi and krb5.
if test "yes" = "$use_gssapi"
then
	# first, deal with the obvious
	if test \( -f /usr/include/kerberosv5/krb5.h -o \
		   -f /usr/include/krb5/krb5.h -o \
		   -f /usr/include/krb5.h \)   -a \
		\( -f /usr/include/gssapi.h -o \
		   -f /usr/include/gssapi/gssapi.h \)
	then
		use_gssapi=/usr
	else
	    krb5dirs="/usr/local /usr/local/krb5 /usr/local/kerberosv5 /usr/local/kerberos /usr/pkg /usr/krb5 /usr/kerberosv5 /usr/kerberos /usr"
	    for d in $krb5dirs
	    do
		if test -f $d/include/gssapi/gssapi_krb5.h -o \
			-f $d/include/krb5.h
		then
			if test -f $d/include/gssapi/gssapi.h -o \
				-f $d/include/gssapi.h
			then
				use_gssapi=$d
				break
			fi
		fi
		use_gssapi="no"
	    done
	fi
fi

case "$use_gssapi" in
	no)
		AC_MSG_RESULT(disabled)
		USE_GSSAPI=''
		;;
	yes)
		AC_MSG_ERROR([--with-gssapi must specify a path])
		;;
	*/krb5-config|krb5-config)
		USE_GSSAPI='-DGSSAPI'
		DST_GSSAPI_INC="$gssapi_cflags"
		DNS_GSSAPI_LIBS="$gssapi_libs"
		;;
	framework)
		USE_GSSAPI='-DGSSAPI'
		ISC_PLATFORM_GSSAPIHEADER="#define ISC_PLATFORM_GSSAPIHEADER <Kerberos/Kerberos.h>"
		ISC_PLATFORM_KRB5HEADER="#define ISC_PLATFORM_KRB5HEADER <Kerberos/Kerberos.h>"
		DNS_GSSAPI_LIBS="-framework Kerberos"
		AC_MSG_RESULT(framework)
		;;

	*)
		AC_MSG_RESULT(looking in $use_gssapi/lib)
		USE_GSSAPI='-DGSSAPI'
		saved_cppflags="$CPPFLAGS"
		CPPFLAGS="-I$use_gssapi/include $CPPFLAGS"
		AC_CHECK_HEADERS(gssapi.h gssapi/gssapi.h,
		    [ISC_PLATFORM_GSSAPIHEADER="#define ISC_PLATFORM_GSSAPIHEADER <$ac_header>"
		     gssapi_hack="#include <$ac_header>"])

		if test "" = "$ISC_PLATFORM_GSSAPIHEADER"; then
		    AC_MSG_ERROR([gssapi.h not found])
		fi

		AC_CHECK_HEADERS(gssapi_krb5.h gssapi/gssapi_krb5.h,
		    [ISC_PLATFORM_GSSAPI_KRB5_HEADER="#define ISC_PLATFORM_GSSAPI_KRB5_HEADER <$ac_header>"
		     gssapi_krb5_hack="#include <$ac_header>"])

		AC_CHECK_HEADERS(krb5.h krb5/krb5.h kerberosv5/krb5.h,
		    [ISC_PLATFORM_KRB5HEADER="#define ISC_PLATFORM_KRB5HEADER <$ac_header>"
		    krb5_hack="#include <$ac_header>"])

		if test "" = "$ISC_PLATFORM_KRB5HEADER"; then
		    AC_MSG_ERROR([krb5.h not found])
		fi

		#
		# XXXDCL This probably doesn't work right on all systems.
		# It will need to be worked on as problems become evident.
		#
		# Essentially the problems here relate to two different
		# areas.  The first area is building with either KTH
		# or MIT Kerberos, particularly when both are present on
		# the machine.  The other is static versus dynamic linking.
		#
		# On the KTH vs MIT issue, Both have libkrb5 that can mess
		# up the works if one implementation ends up trying to
		# use the other's krb.  This is unfortunately a situation
		# that very easily arises.
		#
		# Dynamic linking when the dependency information is built
		# into MIT's libgssapi_krb5 or KTH's libgssapi magically makes
		# all such problems go away, but when that setup is not
		# present, because either the dynamic libraries lack
		# dependencies or static linking is being done, then the
		# problems start to show up.
		saved_libs="$LIBS"
		for TRY_LIBS in \
		    "-lgssapi_krb5" \
		    "-lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err" \
		    "-lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -lresolv" \
		    "-lgssapi" \
		    "-lgssapi -lkrb5 -ldes -lcrypt -lasn1 -lroken -lcom_err" \
		    "-lgssapi -lkrb5 -lcrypto -lcrypt -lasn1 -lroken -lcom_err" \
		    "-lgssapi -lkrb5 -lgssapi_krb5 -lcrypto -lcrypt -lasn1 -lroken -lcom_err" \
		    "-lgssapi -lkrb5 -lhx509 -lcrypto -lcrypt -lasn1 -lroken -lcom_err" \
		    "-lgss -lkrb5"
		do
		    # Note that this does not include $saved_libs, because
		    # on FreeBSD machines this configure script has added
		    # -L/usr/local/lib to LIBS, which can make the
		    # -lgssapi_krb5 test succeed with shared libraries even
		    # when you are trying to build with KTH in /usr/lib.
		    if test "/usr" = "$use_gssapi"
		    then
			    LIBS="$TRY_LIBS"
		    else
			    LIBS="-L$use_gssapi/lib $TRY_LIBS"
		    fi
		    AC_MSG_CHECKING(linking as $TRY_LIBS)
		    AC_TRY_LINK([
#include <sys/types.h>
$gssapi_hack
$gssapi_krb5_hack
$krb5_hack
				] , [gss_acquire_cred(NULL, NULL, 0, NULL, 0, NULL, NULL, NULL);krb5_init_context(NULL);
#if defined(HAVE_GSSAPI_KRB5_H) || defined(HAVE_GSSAPI_GSSAPI_KRB5_H)
gsskrb5_register_acceptor_identity(NULL);
#endif],
				gssapi_linked=yes, gssapi_linked=no)
		    case $gssapi_linked in
		    yes) AC_MSG_RESULT(yes); break ;;
		    no)  AC_MSG_RESULT(no) ;;
		    esac
		done

		CPPFLAGS="$saved_cppflags"

		case $gssapi_linked in
		no) AC_MSG_ERROR(could not determine proper GSSAPI linkage) ;;
		esac

		#
		# XXXDCL Major kludge.  Tries to cope with KTH in /usr/lib
		# but MIT in /usr/local/lib and trying to build with KTH.
		# /usr/local/lib can end up earlier on the link lines.
		# Like most kludges, this one is not only inelegant it
		# is also likely to be the wrong thing to do at least as
		# many times as it is the right thing.  Something better
		# needs to be done.
		#
		if test "/usr" = "$use_gssapi" -a \
			-f /usr/local/lib/libkrb5.a; then
		    FIX_KTH_VS_MIT=yes
		fi

		case "$FIX_KTH_VS_MIT" in
		yes)
		    case "$enable_static_linking" in
		    yes) gssapi_lib_suffix=".a"  ;;
		    *)   gssapi_lib_suffix=".so" ;;
		    esac

		    for lib in $LIBS; do
			case $lib in
			-L*)
			    ;;
			-l*)
			    new_lib=`echo $lib |
				     sed -e s%^-l%$use_gssapi/lib/lib% \
					 -e s%$%$gssapi_lib_suffix%`
			    NEW_LIBS="$NEW_LIBS $new_lib"
			    ;;
			*)
			   AC_MSG_ERROR([KTH vs MIT Kerberos confusion!])
			    ;;
			esac
		    done
		    LIBS="$NEW_LIBS"
		    ;;
		esac

		DST_GSSAPI_INC="-I$use_gssapi/include"
		DNS_GSSAPI_LIBS="$LIBS"

		AC_MSG_RESULT(using GSSAPI from $use_gssapi/lib and $use_gssapi/include)
		LIBS="$saved_libs"
		;;
esac

AC_SUBST(ISC_PLATFORM_HAVEGSSAPI)
AC_SUBST(ISC_PLATFORM_GSSAPIHEADER)
AC_SUBST(ISC_PLATFORM_GSSAPI_KRB5_HEADER)
AC_SUBST(ISC_PLATFORM_KRB5HEADER)

AC_SUBST(USE_GSSAPI)
AC_SUBST(DST_GSSAPI_INC)
AC_SUBST(DNS_GSSAPI_LIBS)
DNS_CRYPTO_LIBS="$DNS_GSSAPI_LIBS $DNS_CRYPTO_LIBS"

#
# Applications linking with libdns also need to link with these libraries.
#

AC_SUBST(DNS_CRYPTO_LIBS)

#
# was --with-randomdev specified?
#
AC_MSG_CHECKING(for random device)
AC_ARG_WITH(randomdev,
	    AS_HELP_STRING([--with-randomdev=PATH],
			   [Specify path for random device]),
	    use_randomdev="$withval", use_randomdev="unspec")

case "$use_randomdev" in
	unspec)
		case "$cross_compiling" in
		yes)
			AC_MSG_RESULT(unspecified)
			AC_MSG_ERROR([ need --with-randomdev=PATH or --with-randomdev=no])
		esac
		case "$host" in
			*-openbsd*)
				devrandom=/dev/arandom
				;;
			*)
				devrandom=/dev/random
				;;
		esac
		AC_MSG_RESULT($devrandom)
		AC_CHECK_FILE($devrandom,
			      AC_DEFINE_UNQUOTED(PATH_RANDOMDEV,
						 "$devrandom"),)

		;;
	yes)
		AC_MSG_ERROR([--with-randomdev must specify a path])
		;;
	no)
		AC_MSG_RESULT(disabled)
		;;
	*)
		AC_DEFINE_UNQUOTED(PATH_RANDOMDEV, "$use_randomdev")
		AC_MSG_RESULT(using "$use_randomdev")
		;;
esac

#
# Only check dsa signature generation on these platforms when performing
# system tests.
#
CHECK_DSA=0
if grep "#define PATH_RANDOMDEV " confdefs.h > /dev/null
then
	case "$host" in
	*darwin*|*freebsd*)
		CHECK_DSA=1
		;;
	esac
fi
AC_SUBST(CHECK_DSA)

#
# Do we have arc4random(), etc ?
# Will use stir and if not exist addrandom
#
AC_CHECK_FUNCS(arc4random)
AC_CHECK_FUNCS(arc4random_stir)
AC_CHECK_FUNCS(arc4random_addrandom)

sinclude(config.threads.in)dnl

if $use_threads
then
	if test "X$GCC" = "Xyes"; then
		case "$host" in
		*-freebsd*)
			CC="$CC -pthread"
			CCOPT="$CCOPT -pthread"
			CCNOOPT="$CCNOOPT -pthread"
			STD_CDEFINES="$STD_CDEFINES -D_THREAD_SAFE"
			;;
		*-openbsd*)
			CC="$CC -pthread"
			CCOPT="$CCOPT -pthread"
			CCNOOPT="$CCNOOPT -pthread"
			;;
		*-solaris*)
			LIBS="$LIBS -lthread"
			;;
		*-ibm-aix*)
			STD_CDEFINES="$STD_CDEFINES -D_THREAD_SAFE"
			;;
		esac
	else
		case $host in
		*-dec-osf*)
			CC="$CC -pthread"
			CCOPT="$CCOPT -pthread"
			CCNOOPT="$CCNOOPT -pthread"
			;;
		*-solaris*)
			CC="$CC -mt"
			CCOPT="$CCOPT -mt"
			CCNOOPT="$CCNOOPT -mt"
			;;
		*-ibm-aix*)
			STD_CDEFINES="$STD_CDEFINES -D_THREAD_SAFE"
			;;
		*-sco-sysv*uw*|*-*-sysv*UnixWare*)
			CC="$CC -Kthread"
			CCOPT="$CCOPT -Kthread"
			CCNOOPT="$CCNOOPT -Kthread"
			;;
		*-*-sysv*OpenUNIX*)
			CC="$CC -Kpthread"
			CCOPT="$CCOPT -Kpthread"
			CCNOOPT="$CCNOOPT -Kpthread"
			;;
		esac
	fi
	ALWAYS_DEFINES="-D_REENTRANT"
	ISC_PLATFORM_USETHREADS="#define ISC_PLATFORM_USETHREADS 1"
	THREADOPTOBJS='${THREADOPTOBJS}'
	THREADOPTSRCS='${THREADOPTSRCS}'
	thread_dir=pthreads
	#
	# We'd like to use sigwait() too
	#
	AC_CHECK_FUNC(sigwait,
		      AC_DEFINE(HAVE_SIGWAIT),
		      AC_CHECK_LIB(c, sigwait,
		      AC_DEFINE(HAVE_SIGWAIT),
		      AC_CHECK_LIB(pthread, sigwait,
				   AC_DEFINE(HAVE_SIGWAIT),
				   AC_CHECK_LIB(pthread, _Psigwait,
						AC_DEFINE(HAVE_SIGWAIT),))))

	AC_CHECK_FUNC(pthread_attr_getstacksize,
		      AC_DEFINE(HAVE_PTHREAD_ATTR_GETSTACKSIZE),)

	AC_CHECK_FUNC(pthread_attr_setstacksize,
		      AC_DEFINE(HAVE_PTHREAD_ATTR_SETSTACKSIZE),)

	AC_ARG_WITH(locktype,
		    AS_HELP_STRING([--with-locktype=ARG],
				   [Specify mutex lock type
					(adaptive or standard)]),
		    locktype="$withval", locktype="adaptive")

	case "$locktype" in
		adaptive)
			AC_MSG_CHECKING([for PTHREAD_MUTEX_ADAPTIVE_NP])

			AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
			  #ifndef _GNU_SOURCE
			  #define _GNU_SOURCE
			  #endif
			  #include <pthread.h>
			]], [[
			  return (PTHREAD_MUTEX_ADAPTIVE_NP);
			]])],
			[ AC_MSG_RESULT(using adaptive lock type)
			  AC_DEFINE([HAVE_PTHREAD_MUTEX_ADAPTIVE_NP], 1,
				    [Support for PTHREAD_MUTEX_ADAPTIVE_NP]) ],
			[ AC_MSG_RESULT(using standard lock type) ])
			;;
		standard)
			AC_MSG_RESULT(using standard lock type)
			;;
		*)
			AC_MSG_ERROR([You must specify "adaptive" or "standard" for --with-locktype.])
			;;
	esac

	AC_CHECK_HEADERS(sched.h)

	case "$host" in
	*solaris-*)
		AC_CHECK_LIB(rt, sched_yield)
		;;
	esac

	AC_CHECK_FUNCS(sched_yield pthread_yield pthread_yield_np)

	#
	# Additional OS-specific issues related to pthreads and sigwait.
	#
	case "$host" in
		#
		# One more place to look for sigwait.
		#
		*-freebsd*)
			AC_CHECK_LIB(c_r, sigwait, AC_DEFINE(HAVE_SIGWAIT),)
			case $host in
			*-freebsd5.[[012]]|*-freebsd5.[[012]].*);;
			*-freebsd5.[[3456789]]|*-freebsd5.[[3456789]].*)
				AC_DEFINE(NEED_PTHREAD_SCOPE_SYSTEM)
				;;
			*-freebsd6.*)
				AC_DEFINE(NEED_PTHREAD_SCOPE_SYSTEM)
				;;
			esac
			;;
		#
		# BSDI 3.0 through 4.0.1 needs pthread_init() to be
		# called before certain pthreads calls.	 This is deprecated
		# in BSD/OS 4.1.
		#
		*-bsdi3.*|*-bsdi4.0*)
			AC_DEFINE(NEED_PTHREAD_INIT)
			;;
		#
		# LinuxThreads requires some changes to the way we
		# deal with signals.
		#
		*-linux*)
			AC_DEFINE(HAVE_LINUXTHREADS)
			;;
		#
		# Ensure the right sigwait() semantics on Solaris and make
		# sure we call pthread_setconcurrency.
		#
		*-solaris*)
			AC_DEFINE(_POSIX_PTHREAD_SEMANTICS)
			AC_CHECK_FUNC(pthread_setconcurrency,
				      AC_DEFINE(CALL_PTHREAD_SETCONCURRENCY))
			;;
		#
		# UnixWare does things its own way.
		#
		*-sco-sysv*uw*|*-*-sysv*UnixWare*|*-*-sysv*OpenUNIX*)
			AC_DEFINE(HAVE_UNIXWARE_SIGWAIT)
			;;
	esac

	# Look for functions relating to thread naming
	AC_CHECK_FUNCS(pthread_setname_np pthread_set_name_np)
	AC_CHECK_HEADERS([pthread_np.h], [], [], [#include <pthread.h>])

	#
	# Look for sysconf to allow detection of the number of processors.
	#
	AC_CHECK_FUNC(sysconf, AC_DEFINE(HAVE_SYSCONF),)

else
	ISC_PLATFORM_USETHREADS="#undef ISC_PLATFORM_USETHREADS"
	thread_dir=nothreads
	THREADOPTOBJS=""
	THREADOPTSRCS=""
	ALWAYS_DEFINES=""
fi

AC_SUBST(ALWAYS_DEFINES)
AC_SUBST(ISC_PLATFORM_USETHREADS)
AC_SUBST(THREADOPTOBJS)
AC_SUBST(THREADOPTSRCS)
ISC_THREAD_DIR=$thread_dir
AC_SUBST(ISC_THREAD_DIR)

AC_MSG_CHECKING(for libtool)
AC_ARG_WITH(libtool, AS_HELP_STRING([--with-libtool], [use GNU libtool]),
	    use_libtool="$withval", use_libtool="no")

case $use_libtool in
	yes)
		AC_MSG_RESULT(yes)
		AM_PROG_LIBTOOL
		O=lo
		A=la
		LIBTOOL_MKDEP_SED='s;\.o;\.lo;'
		LIBTOOL_MODE_COMPILE='--mode=compile --tag=CC'
		LIBTOOL_MODE_INSTALL='--mode=install --tag=CC'
		LIBTOOL_MODE_LINK='--mode=link --tag=CC'
		LIBTOOL_MODE_UNINSTALL='--mode=uninstall --tag=CC'
		INSTALL_LIBRARY='${INSTALL_PROGRAM}'
		case "$host" in
		*) LIBTOOL_ALLOW_UNDEFINED= ;;
		esac
		case "$host" in
		*-ibm-aix*) LIBTOOL_IN_MAIN="-Wl,-bI:T_testlist.imp" ;;
		*) LIBTOOL_IN_MAIN= ;;
		esac;
		;;
	*)
		AC_MSG_RESULT(no)
		O=o
		A=a
		LIBTOOL=
		AC_SUBST(LIBTOOL)
		LIBTOOL_MKDEP_SED=
		LIBTOOL_MODE_COMPILE=
		LIBTOOL_MODE_INSTALL=
		LIBTOOL_MODE_LINK=
		LIBTOOL_MODE_UNINSTALL=
		LIBTOOL_ALLOW_UNDEFINED=
		LIBTOOL_IN_MAIN=
		INSTALL_LIBRARY='${INSTALL_DATA}'
		;;
esac
AC_SUBST(INSTALL_LIBRARY)

#
# was --enable-native-pkcs11 specified?
#  (note it implies both --without-openssl and --with-pkcs11)
#
AC_ARG_ENABLE(native-pkcs11,
	      AS_HELP_STRING([--enable-native-pkcs11],
			     [use native PKCS11 for all crypto [default=no]]),
	      want_native_pkcs11="$enableval", want_native_pkcs11="no")

#
# was --with-openssl specified?
#
AC_ARG_WITH(openssl,
	    AS_HELP_STRING([--with-openssl[=PATH]],
			   [Build with OpenSSL [yes|no|path].
				(Crypto is required for DNSSEC)]),
	    use_openssl="$withval", use_openssl="auto")

#
# was --with-pkcs11 specified?
#
AC_ARG_WITH(pkcs11,
	    AS_HELP_STRING([--with-pkcs11[=PATH]],
			   [Build with PKCS11 support [yes|no|path]
				(PATH is for the PKCS11 provider)]),
	    use_pkcs11="$withval", use_pkcs11="auto")

#
# were --with-ecdsa, --with-gost, --with-eddsa, --with-aes specified
#
AC_ARG_WITH(ecdsa, AS_HELP_STRING([--with-ecdsa], [Crypto ECDSA]),
	    with_ecdsa="$withval", with_ecdsa="auto")
AC_ARG_WITH(gost,
	    AS_HELP_STRING([--with-gost], [Crypto GOST [yes|no|raw|asn1].]),
	    with_gost="$withval", with_gost="auto")
AC_ARG_WITH(eddsa, AS_HELP_STRING([--with-eddsa], [Crypto EDDSA [yes|all|no].]),
	    with_eddsa="$withval", with_eddsa="auto")
AC_ARG_WITH(aes, AS_HELP_STRING([--with-aes], [Crypto AES]),
	    with_aes="$withval", with_aes="checkcc")

#
# was --enable-openssl-hash specified?
#
AC_ARG_ENABLE(openssl-hash,
	      AS_HELP_STRING([--enable-openssl-hash],
			     [use OpenSSL for hash functions [default=no]]),
	      want_openssl_hash="$enableval", want_openssl_hash="checkcc")

#
# Client Cookie algorithm choice
#
AC_ARG_WITH(cc-alg,
	    AS_HELP_STRING([--with-cc-alg=ALG],
			   [choose the algorithm for Client Cookie
				[aes|sha1|sha256]]),
	with_cc_alg="$withval", with_cc_alg="auto")

case $with_cc_alg in
	*1)
		with_cc_alg="sha1"
		;;
	*2*)
		with_cc_alg="sha256"
		;;
	auto)
		if test "no" != "$with_aes"
		then
			with_aes="yes"
		fi
		;;
	*)
		with_cc_alg="aes"
		if test "no" != "$with_aes"
		then
			with_aes="yes"
		fi
		;;
esac
if test "checkcc" = "with_aes"
then
	with_aes="no"
fi

AC_MSG_CHECKING(for OpenSSL library)
OPENSSL_WARNING=
openssldirs="/usr /usr/local /usr/local/ssl /usr/pkg /usr/sfw"
if test "yes" = "$want_native_pkcs11"
then
	use_openssl="native_pkcs11"
	AC_MSG_RESULT(use of native PKCS11 instead)
fi

if test "auto" = "$use_openssl"
then
	for d in $openssldirs
	do
		if test -f $d/include/openssl/opensslv.h
		then
			use_openssl=$d
			break
		fi
	done
fi
OPENSSL_ECDSA=""
OPENSSL_GOST=""
OPENSSL_ED25519=""
gosttype="raw"
case "$with_gost" in
	raw)
		with_gost="yes"
		;;
	asn1)
		AC_DEFINE(PREFER_GOSTASN1, 1,
			  [Define if GOST private keys are encoded in ASN.1.])
		gosttype="asn1"
		with_gost="yes"
		;;
	auto|yes|no)
		;;
	*)
		AC_MSG_ERROR(unknown GOST private key encoding)
		;;
esac

case "$use_openssl" in
	native_pkcs11)
		AC_MSG_RESULT(disabled because of native PKCS11)
		DST_OPENSSL_INC=""
		CRYPTO="-DPKCS11CRYPTO"
		OPENSSLECDSALINKOBJS=""
		OPENSSLECDSALINKSRCS=""
		OPENSSLEDDSALINKOBJS=""
		OPENSSLEDDSALINKSRCS=""
		OPENSSLGOSTLINKOBJS=""
		OPENSSLGOSTLINKSRCS=""
		OPENSSLLINKOBJS=""
		OPENSSLLINKSRCS=""
		;;
	no)
		AC_MSG_RESULT(no)
		DST_OPENSSL_INC=""
		CRYPTO=""
		OPENSSLECDSALINKOBJS=""
		OPENSSLECDSALINKSRCS=""
		OPENSSLEDDSALINKOBJS=""
		OPENSSLEDDSALINKSRCS=""
		OPENSSLGOSTLINKOBJS=""
		OPENSSLGOSTLINKSRCS=""
		OPENSSLLINKOBJS=""
		OPENSSLLINKSRCS=""
		;;
	auto)
		DST_OPENSSL_INC=""
		CRYPTO=""
		OPENSSLECDSALINKOBJS=""
		OPENSSLECDSALINKSRCS=""
		OPENSSLEDDSALINKOBJS=""
		OPENSSLEDDSALINKSRCS=""
		OPENSSLGOSTLINKOBJS=""
		OPENSSLGOSTLINKSRCS=""
		OPENSSLLINKOBJS=""
		OPENSSLLINKSRCS=""
		AC_MSG_ERROR(
[OpenSSL was not found in any of $openssldirs; use --with-openssl=/path
If you don't want OpenSSL, use --without-openssl])
		;;
	*)
		if test "yes" = "$want_native_pkcs11"
		then
			AC_MSG_RESULT()
			AC_MSG_ERROR([OpenSSL and native PKCS11 cannot be used together.])
		fi
		if test "yes" = "$use_openssl"
		then
			# User did not specify a path - guess it
			for d in $openssldirs
			do
				if test -f $d/include/openssl/opensslv.h
				then
					use_openssl=$d
					break
				fi
			done
			if test "yes" = "$use_openssl"
			then
				AC_MSG_RESULT(not found)
				AC_MSG_ERROR(
[OpenSSL was not found in any of $openssldirs; use --with-openssl=/path])
			fi
		elif ! test -f "$use_openssl"/include/openssl/opensslv.h
		then
			AC_MSG_ERROR(["$use_openssl/include/openssl/opensslv.h" not found])
		fi
		CRYPTO='-DOPENSSL'
		if test "/usr" = "$use_openssl"
		then
			DST_OPENSSL_INC=""
			DST_OPENSSL_LIBS="-lcrypto"
		else
			DST_OPENSSL_INC="-I$use_openssl/include"
			case $host in
			*-solaris*)
				DST_OPENSSL_LIBS="-L$use_openssl/lib -R$use_openssl/lib -lcrypto"
				;;
			*-hp-hpux*)
				DST_OPENSSL_LIBS="-L$use_openssl/lib -Wl,+b: -lcrypto"
				;;
			*-apple-darwin*)
				#
				# Apple's ld seaches for serially for dynamic
				# then static libraries.  This means you can't
				# use -L to override dynamic system libraries
				# with static ones when linking.  Instead
				# we specify a absolute path.
				#
				if test -f "$use_openssl/lib/libcrypto.dylib"
				then
					DST_OPENSSL_LIBS="-L$use_openssl/lib -lcrypto"
				else
					DST_OPENSSL_LIBS="$use_openssl/lib/libcrypto.a"
				fi
				;;
			*)
				DST_OPENSSL_LIBS="-L$use_openssl/lib -lcrypto"
				;;
			esac
		fi
		AC_MSG_RESULT(using OpenSSL from $use_openssl/lib and $use_openssl/include)

		saved_cc="$CC"
		saved_cflags="$CFLAGS"
		saved_libs="$LIBS"
		CFLAGS="$DST_OPENSSL_INC $CFLAGS"
		LIBS="$DST_OPENSSL_LIBS $LIBS"
		AC_MSG_CHECKING(whether linking with OpenSSL works)
		AC_TRY_RUN([
#include <openssl/err.h>
int main() {
	ERR_clear_error();
	return (0);
}
],
		[AC_MSG_RESULT(yes)],
		[AC_MSG_RESULT(no)
		 AC_MSG_ERROR(Could not run test program using OpenSSL from
$use_openssl/lib and $use_openssl/include.
Please check the argument to --with-openssl and your
shared library configuration (e.g., LD_LIBRARY_PATH).)],
		[AC_MSG_RESULT(assuming it does work on target platform)])

		AC_MSG_CHECKING(whether linking with OpenSSL requires -ldl)
		AC_TRY_LINK([
#include <openssl/opensslv.h>
#if !defined(LIBRESSL_VERSION_NUMBER) && (OPENSSL_VERSION_NUMBER >= 0x10100004L)
#include <openssl/crypto.h>
#else
#include <openssl/err.h>
#include <openssl/dso.h>
#endif
],
[
#if !defined(LIBRESSL_VERSION_NUMBER) && (OPENSSL_VERSION_NUMBER >= 0x10100004L)
OPENSSL_init_crypto(OPENSSL_INIT_ENGINE_ALL_BUILTIN, NULL);
#else
DSO_METHOD_dlfcn();
#endif
],
		[AC_MSG_RESULT(no)],
		[LIBS="$LIBS -ldl"
		AC_TRY_LINK([
#if !defined(LIBRESSL_VERSION_NUMBER) && (OPENSSL_VERSION_NUMBER >= 0x10100004L)
#include <openssl/crypto.h>
#else
#include <openssl/err.h>
#include <openssl/dso.h>
#endif
],
[
#if !defined(LIBRESSL_VERSION_NUMBER) && (OPENSSL_VERSION_NUMBER >= 0x10100004L)
OPENSSL_init_crypto(OPENSSL_INIT_ENGINE_ALL_BUILTIN, NULL);
#else
DSO_METHOD_dlfcn();
#endif
],
		[AC_MSG_RESULT(yes)
		DST_OPENSSL_LIBS="$DST_OPENSSL_LIBS -ldl"
		],
		 [AC_MSG_RESULT(unknown)
		 AC_MSG_ERROR(OpenSSL has unsupported dynamic loading)],
		[AC_MSG_RESULT(assuming it does work on target platform)])
		],
		[AC_MSG_RESULT(assuming it does work on target platform)]
		)

	AC_MSG_CHECKING(for OpenSSL FIPS mode support)
	have_fips_mode=""
	AC_TRY_LINK([#include <openssl/crypto.h>],
		    [FIPS_mode();],
		    have_fips_mode=yes,
		    have_fips_mode=no)
	if test "x$have_fips_mode" = "xyes"
	then
		AC_DEFINE([HAVE_FIPS_MODE], [1],
			  [Define if OpenSSL provides FIPS_mode()])
		AC_MSG_RESULT(yes)
	else
		AC_MSG_RESULT(no)
	fi

	AC_MSG_CHECKING(for OpenSSL DSA support)
	if test -f $use_openssl/include/openssl/dsa.h
	then
		AC_DEFINE(HAVE_OPENSSL_DSA)
		AC_MSG_RESULT(yes)
	else
		AC_MSG_RESULT(no)
	fi

	AC_CHECK_FUNCS(EVP_sha256 EVP_sha384 EVP_sha512)

	AC_CHECK_FUNCS([DH_get0_key ECDSA_SIG_get0 RSA_set0_key DSA_get0_pqg])

	AC_MSG_CHECKING(for OpenSSL ECDSA support)
	have_ecdsa=""
	AC_TRY_RUN([
#include <openssl/ecdsa.h>
#include <openssl/objects.h>
int main() {
	EC_KEY *ec256, *ec384;

#if !defined(HAVE_EVP_SHA256) || !defined(HAVE_EVP_SHA384)
	return (1);
#endif
	ec256 = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
	ec384 = EC_KEY_new_by_curve_name(NID_secp384r1);
	if (ec256 == NULL || ec384 == NULL)
		return (2);
	return (0);
}
],
	[AC_MSG_RESULT(yes)
	have_ecdsa="yes"],
	[AC_MSG_RESULT(no)
	have_ecdsa="no"],
	[AC_MSG_RESULT(using --with-ecdsa)])
	case "$with_ecdsa" in
	yes)
	    case "$have_ecdsa" in
	    no)  AC_MSG_ERROR([ecdsa not supported]) ;;
	    *)  have_ecdsa=yes ;;
	    esac
	    ;;
	no)
	    have_ecdsa=no ;;
	*)
	    case "$have_ecdsa" in
	    yes|no) ;;
	    *) AC_MSG_ERROR([need --with-ecdsa=[[yes or no]]]) ;;
	    esac
	    ;;
	esac
	case $have_ecdsa in
	yes)
		OPENSSL_ECDSA="yes"
		OPENSSLECDSALINKOBJS='${OPENSSLECDSALINKOBJS}'
		OPENSSLECDSALINKSRCS='${OPENSSLECDSALINKSRCS}'
		AC_DEFINE(HAVE_OPENSSL_ECDSA, 1,
			  [Define if your OpenSSL version supports ECDSA.])
		;;
	*)
		;;
	esac

	AC_MSG_CHECKING(for OpenSSL GOST support)
	have_gost=""
	case "$use_pkcs11" in
		auto|no)
			;;
		*)
			if $use_threads; then
				CC="$CC -pthread"
			fi
			;;
	esac
	AC_TRY_RUN([
#include <openssl/conf.h>
#include <openssl/engine.h>
int main() {
#if !defined(LIBRESSL_VERSION_NUMBER) && (OPENSSL_VERSION_NUMBER >= 0x10000000L)
	ENGINE *e;
	EC_KEY *ek;

	ek = NULL;
	OPENSSL_config(NULL);

	e = ENGINE_by_id("gost");
	if (e == NULL)
		return (1);
	if (ENGINE_init(e) <= 0)
		return (1);
	return (0);
#else
	return (1);
#endif
}
],
	[AC_MSG_RESULT(yes)
	have_gost="yes"],
	[AC_MSG_RESULT(no)
	have_gost="no"],
	[AC_MSG_RESULT(using --with-gost)])
	case "$with_gost" in
	yes)
	    case "$have_gost" in
	    no)  AC_MSG_ERROR([gost not supported]) ;;
	    *)  have_gost=yes ;;
	    esac
	    ;;
	no)
	    have_gost=no ;;
	*)
	    case "$have_gost" in
	    yes|no) ;;
	    *) AC_MSG_ERROR([need --with-gost=[[yes, no, raw or asn1]]]) ;;
	    esac
	    ;;
	esac
	case $have_gost in
	yes)
		OPENSSL_GOST="yes"
		OPENSSLGOSTLINKOBJS='${OPENSSLGOSTLINKOBJS}'
		OPENSSLGOSTLINKSRCS='${OPENSSLGOSTLINKSRCS}'
		AC_DEFINE(HAVE_OPENSSL_GOST, 1,
			  [Define if your OpenSSL version supports GOST.])
		;;
	*)
		;;
	esac

	AC_MSG_CHECKING(for OpenSSL Ed25519 support)
	have_ed25519=""
	have_ed448=""
	AC_TRY_RUN([
#include <openssl/evp.h>
#include <openssl/objects.h>
int main() {
	EVP_PKEY_CTX *ctx;

	ctx = EVP_PKEY_CTX_new_id(NID_ED25519, NULL);
	if (ctx == NULL)
		return (2);
	return (0);
}
],
	[AC_MSG_RESULT(yes)
	have_ed25519="yes"],
	[AC_MSG_RESULT(no)
	have_ed25519="no"],
	[AC_MSG_RESULT(using --with-eddsa)])
	case "$with_eddsa" in
	yes|all)
	    case "$have_ed25519" in
	    no)  AC_MSG_ERROR([eddsa not supported]) ;;
	    *)  have_ed25519=yes ;;
	    esac
	    ;;
	no)
	    have_ed25519=no ;;
	*)
	    case "$have_ed25519" in
	    yes|no) ;;
	    *) AC_MSG_ERROR([need --with-eddsa=[[yes, all or no]]]) ;;
	    esac
	    ;;
	esac
	case $have_ed25519 in
	yes)
		OPENSSL_ED25519="yes"
		OPENSSLEDDSALINKOBJS='${OPENSSLEDDSALINKOBJS}'
		OPENSSLEDDSALINKSRCS='${OPENSSLEDDSALINKSRCS}'
		AC_DEFINE(HAVE_OPENSSL_ED25519, 1,
			  [Define if your OpenSSL version supports Ed25519.])
		AC_MSG_CHECKING(for OpenSSL Ed448 support)
		AC_TRY_RUN([
#include <openssl/evp.h>
#include <openssl/objects.h>
int main() {
	EVP_PKEY_CTX *ctx;

	ctx = EVP_PKEY_CTX_new_id(NID_ED448, NULL);
	if (ctx == NULL)
		return (2);
	return (0);
}
],
		[AC_MSG_RESULT([broken])
		have_ed448="no"],
		[AC_MSG_RESULT([no])
		have_ed448="no"],
		[AC_MSG_RESULT(using --with-eddsa)])
		case $with_eddsa in
		all)
			have_ed448=yes ;;
		*)
			;;
		esac
		case $have_ed448 in
		yes)
			AC_DEFINE(HAVE_OPENSSL_ED448, 1,
				  [Define if your OpenSSL version supports Ed448.])
			;;
		*)
			;;
		esac
		;;
	*)
		;;
	esac

	have_aes="no"
	AC_MSG_CHECKING(for OpenSSL AES support)
	AC_TRY_RUN([
#include <openssl/evp.h>
int main() {
	const EVP_CIPHER *aes128, *aes192, *aes256;

	aes128 = EVP_aes_128_ecb();
	aes192 = EVP_aes_192_ecb();
	aes256 = EVP_aes_256_ecb();
	if (aes128 == NULL || aes192 == NULL || aes256 == NULL)
		return (1);
	return (0);
}
],
	[AC_MSG_RESULT(yes)
	 have_aes="evp"],
	[AC_CHECK_FUNC(AES_encrypt,
	[AC_MSG_RESULT(yes)
	 have_aes="yes"],
	[AC_MSG_RESULT(no)])],
	[AC_MSG_RESULT(using --with-aes)
	 # Expect cross-compiling with a modern OpenSSL
	 have_aes="evp"])

	ISC_OPENSSL_INC=""
	ISC_OPENSSL_LIBS=""
	if test "yes" = "$with_aes"
	then
		case "$have_aes" in
		evp)
			AC_DEFINE(HAVE_OPENSSL_EVP_AES, 1,
				  [Define if your OpenSSL version supports EVP AES])
			ISC_OPENSSL_INC="$DST_OPENSSL_INC"
			ISC_OPENSSL_LIBS="$DST_OPENSSL_LIBS"
			;;
		yes)
			AC_DEFINE(HAVE_OPENSSL_AES, 1,
				  [Define if your OpenSSL version supports AES])
			ISC_OPENSSL_INC="$DST_OPENSSL_INC"
			ISC_OPENSSL_LIBS="$DST_OPENSSL_LIBS"
			;;
		*)
			;;
		esac
	fi

	CC="$saved_cc"
	CFLAGS="$saved_cflags"
	LIBS="$saved_libs"
	OPENSSLLINKOBJS='${OPENSSLLINKOBJS}'
	OPENSSLLINKSRCS='${OPENSSLLINKSRCS}'

	;;
esac

#
# This would include the system openssl path (and linker options to use
# it as needed) if it is found.
#

AC_SUBST(DST_OPENSSL_INC)
AC_SUBST(OPENSSLECDSALINKOBJS)
AC_SUBST(OPENSSLECDSALINKSRCS)
AC_SUBST(OPENSSLEDDSALINKOBJS)
AC_SUBST(OPENSSLEDDSALINKSRCS)
AC_SUBST(OPENSSLGOSTLINKOBJS)
AC_SUBST(OPENSSLGOSTLINKSRCS)
AC_SUBST(OPENSSLLINKOBJS)
AC_SUBST(OPENSSLLINKSRCS)
AC_SUBST(OPENSSL_ECDSA)
AC_SUBST(OPENSSL_ED25519)
AC_SUBST(OPENSSL_GOST)

DNS_CRYPTO_LIBS="$DNS_CRYPTO_LIBS $DST_OPENSSL_LIBS"

ISC_PLATFORM_WANTAES="#undef ISC_PLATFORM_WANTAES"
if test "yes" = "$with_aes"
then
	if test "X$CRYPTO" = "X"
	then
		with_aes="no"
	fi
fi
if test "yes" = "$with_aes"
then
	ISC_PLATFORM_WANTAES="#define ISC_PLATFORM_WANTAES 1"
fi
AC_SUBST(ISC_PLATFORM_WANTAES)

#
# Choose Client Cookie algorithm
#

AC_MSG_CHECKING(for the Algorithm for Client Cookie)
if test "auto" = "$with_cc_alg"
then
	if test "yes" = "$with_aes"
	then
		with_cc_alg="aes"
	else
		with_cc_alg="sha256"
	fi
fi
case $with_cc_alg in
	sha1)
		AC_MSG_RESULT(sha1)
		if test "X$CRYPTO" = "X-DOPENSSL"
		then
			if test "checkcc" = "$want_openssl_hash"
			then
				want_openssl_hash="yes"
			fi
		fi
		AC_DEFINE(HMAC_SHA1_CC, 1,
			  [Use HMAC-SHA1 for Client Cookie generation])
		;;
	sha256)
		AC_MSG_RESULT(sha256)
		if test "X$CRYPTO" = "X-DOPENSSL"
		then
			if test "checkcc" = "$want_openssl_hash"
			then
				want_openssl_hash="yes"
			fi
		fi
		AC_DEFINE(HMAC_SHA256_CC, 1,
			  [Use HMAC-SHA256 for Client Cookie generation])
		;;
	aes)
		AC_MSG_RESULT(aes)
		if test "yes" != "$with_aes"
		then
			AC_MSG_ERROR("Client Cookie wants to use unavailable AES");
		fi
		AC_DEFINE(AES_CC, 1,
			  [Use AES for Client Cookie generation])
		;;
esac
if test "checkcc" = "$want_openssl_hash"
then
	want_openssl_hash="no"
fi

#
# Use OpenSSL for hash functions
#

AC_MSG_CHECKING(for using OpenSSL for hash functions)
ISC_PLATFORM_OPENSSLHASH="#undef ISC_PLATFORM_OPENSSLHASH"
case $want_openssl_hash in
	yes)
		if test "$CRYPTO" != "-DOPENSSL"
		then
			AC_MSG_ERROR([No OpenSSL for hash functions])
		fi
		AC_MSG_RESULT(yes)
		ISC_PLATFORM_OPENSSLHASH="#define ISC_PLATFORM_OPENSSLHASH 1"
		ISC_OPENSSL_INC="$DST_OPENSSL_INC"
		ISC_OPENSSL_LIBS="$DST_OPENSSL_LIBS"
		;;
	no)
		AC_MSG_RESULT(no)
		;;
esac
AC_SUBST(ISC_PLATFORM_OPENSSLHASH)
AC_SUBST(ISC_OPENSSL_INC)
AC_SUBST(ISC_OPENSSL_LIBS)

#
# PKCS11 (aka crypto hardware) support (--with moved just after openssl)
#
AC_MSG_CHECKING(for PKCS11 support)

if test "auto" = "$use_pkcs11"
then
	if test "yes" = "$want_native_pkcs11"
	then
		use_pkcs11="yes"
	else
		use_pkcs11="no"
	fi
fi

case "$use_pkcs11" in
	no)
		AC_MSG_RESULT(no)
		USE_PKCS11=""
		PKCS11_TEST=""
		PKCS11_TOOLS=""
		ISC_PK11_C=""
		ISC_PK11_O=""
		ISC_PK11_API_C=""
		ISC_PK11_API_O=""
		ISC_PK11_RESULT_C=""
		ISC_PK11_RESULT_O=""
		ISC_ISCPK11_API_C=""
		ISC_ISCPK11_API_O=""
		;;
	yes|*)
		AC_MSG_RESULT(yes)
		if ! $use_threads; then
			AC_MSG_ERROR([PKCS11 requires thread support])
		fi
		if test "X$CRYPTO" = "X-DOPENSSL"
		then
			AC_MSG_CHECKING(for OpenSSL with PKCS11 support)
			saved_cc="$CC"
			saved_cflags="$CFLAGS"
			saved_libs="$LIBS"
			CC="$CC -pthread"
			CFLAGS="$CFLAGS $DST_OPENSSL_INC"
			LIBS="$LIBS $DST_OPENSSL_LIBS"
			AC_TRY_RUN([
#include <openssl/conf.h>
#include <openssl/engine.h>
int main() {
	ENGINE *e;

	OPENSSL_config(NULL);
	e = ENGINE_by_id("pkcs11");
	if (e == NULL)
		return (1);
	if (ENGINE_init(e) <= 0)
		return (1);
	return (0);
}
],
			[AC_MSG_RESULT(yes)
			PKCS11_TEST=pkcs11ssl
			PKCS11_ENGINE='-DPKCS11_ENGINE="\"pkcs11\""'],
			[AC_MSG_RESULT(no)
			PKCS11_TEST=''
			PKCS11_ENGINE='-DPKCS11_ENGINE=NULL'],
			[AC_MSG_RESULT(cross compile, defaulting to no)
			PKCS11_TEST=''
			PKCS11_ENGINE='-DPKCS11_ENGINE=NULL'])
			CC="$saved_cc"
			CFLAGS="$saved_cflags"
			LIBS="$saved_libs"
		else
			PKCS11_TEST=''
			PKCS11_ENGINE='-DPKCS11_ENGINE=NULL'

		fi
		USE_PKCS11='-DUSE_PKCS11'
		PKCS11_TOOLS=pkcs11
		AC_CHECK_FUNC(getpassphrase, AC_DEFINE(HAVE_GETPASSPHRASE),)
		ISC_PK11_C="pk11.c"
		ISC_PK11_O="pk11.$O"
		ISC_PK11_API_C="pk11_api.c"
		ISC_PK11_API_O="pk11_api.$O"
		ISC_PK11_RESULT_C="pk11_result.c"
		ISC_PK11_RESULT_O="pk11_result.$O"
		ISC_ISCPK11_API_C="unix/pk11_api.c"
		ISC_ISCPK11_API_O="unix/pk11_api.$O"
		;;
esac
AC_SUBST(USE_PKCS11)
AC_SUBST(PKCS11_TOOLS)
AC_SUBST(PKCS11_ENGINE)
AC_SUBST(ISC_PK11_C)
AC_SUBST(ISC_PK11_O)
AC_SUBST(ISC_PK11_API_C)
AC_SUBST(ISC_PK11_API_O)
AC_SUBST(ISC_PK11_RESULT_C)
AC_SUBST(ISC_PK11_RESULT_O)
AC_SUBST(ISC_ISCPK11_API_C)
AC_SUBST(ISC_ISCPK11_API_O)

AC_MSG_CHECKING(for PKCS11 tools)
case "$use_pkcs11" in
	no)
		PKCS11_PROVIDER="undefined"
		AC_MSG_RESULT(disabled)
		;;
	yes|'')
		PKCS11_PROVIDER="undefined"
		AC_MSG_RESULT(enabled)
		;;
	*)
		PKCS11_PROVIDER="$use_pkcs11"
		AC_MSG_RESULT([enabled, PKCS11 provider is $PKCS11_PROVIDER])
		;;
esac

AC_SUBST(PKCS11_PROVIDER)

PKCS11_ECDSA=""
PKCS11_GOST=""
PKCS11_ED25519=""
set_pk11_flavor="no"
AC_MSG_CHECKING(for native PKCS11)

case "$want_native_pkcs11" in
	yes)
		AC_MSG_RESULT(using native PKCS11 crypto)
		PKCS11LINKOBJS='${PKCS11LINKOBJS}'
		PKCS11LINKSRCS='${PKCS11LINKSRCS}'
		PKCS11_TEST=pkcs11
		AC_MSG_CHECKING(for PKCS11 ECDSA)
		case "$with_ecdsa" in
		no)
			AC_MSG_RESULT(disabled)
			;;
		*)
			AC_MSG_RESULT(enabled)
			PKCS11_ECDSA="yes"
			AC_DEFINE(HAVE_PKCS11_ECDSA, 1,
				  [Define if your PKCS11 provider supports ECDSA.])
			;;
		esac
		AC_MSG_CHECKING(for PKCS11 GOST)
		case "$with_gost" in
		yes)
			AC_MSG_RESULT(enabled)
			PKCS11_GOST="yes"
			AC_DEFINE(HAVE_PKCS11_GOST, 1,
				  [Define if your PKCS11 provider supports GOST.])
			;;
		*)
			AC_MSG_RESULT(disabled)
			;;
		esac
		AC_MSG_CHECKING(for PKCS11 Ed25519)
		case "$with_eddsa" in
		yes|all)
			AC_MSG_RESULT(enabled)
			PKCS11_ED25519="yes"
			AC_DEFINE(HAVE_PKCS11_ED25519, 1,
				  [Define if your PKCS11 provider supports Ed25519.])
			AC_MSG_CHECKING(for PKCS11 Ed448)
			case "$with_eddsa" in
			all)
				AC_MSG_RESULT(enabled)
				AC_DEFINE(HAVE_PKCS11_ED448, 1,
					  [Define if your PKCS11 provider supports Ed448.])
				;;
			*)
				AC_MSG_RESULT(disabled)
				;;
			esac
			;;
		*)
			AC_MSG_RESULT(disabled)
			;;
		esac
		AC_MSG_CHECKING(for PKCS11 flavor)
		case "$PKCS11_PROVIDER" in
			*nfast*)
				AC_MSG_RESULT(Thales nCipher)
				# default
				pk11_flavor="PK11_THALES_FLAVOR"
				set_pk11_flavor="yes"
				;;
			*libsofthsm2*)
				AC_MSG_RESULT(SoftHSMv2)
				pk11_flavor="PK11_SOFTHSMV2_FLAVOR"
				set_pk11_flavor="yes"
				;;
			*libsofthsm*)
				AC_MSG_RESULT(SoftHSM)
				pk11_flavor="PK11_SOFTHSMV1_FLAVOR"
				set_pk11_flavor="yes"
				;;
			*cryptech*)
				AC_MSG_RESULT(Cryptech)
				pk11_flavor="PK11_CRYPTECH_FLAVOR"
				set_pk11_flavor="yes"
				;;
			*Keyper*)
				AC_MSG_RESULT(AEP Keyper)
				pk11_flavor="PK11_AEP_FLAVOR"
				set_pk11_flavor="yes"
				;;
			*libcs*)
				AC_MSG_RESULT(Utimaco HSM)
				pk11_flavor="PK11_UTIMACO_FLAVOR"
				set_pk11_flavor="yes"
				;;
			undefined)
				AC_MSG_RESULT(undefined provider?)
				;;
			*)
				AC_MSG_RESULT(unknown provider: tweaks are in lib/isc/include/pk11/site.h)
				;;
		esac
		if test "yes" = "$set_pk11_flavor" ; then
			CFLAGS="$CFLAGS -DPK11_FLAVOR=$pk11_flavor"
		fi
		;;
	no|'')
		AC_MSG_RESULT(disabled)
		;;
esac

AC_SUBST(PKCS11LINKOBJS)
AC_SUBST(PKCS11LINKSRCS)
AC_SUBST(CRYPTO)
AC_SUBST(PKCS11_ECDSA)
AC_SUBST(PKCS11_GOST)
AC_SUBST(PKCS11_ED25519)
AC_SUBST(PKCS11_TEST)

# for PKCS11 benchmarks

have_clock_gt=no
AC_CHECK_FUNC(clock_gettime,have_clock_gt=yes,)
if test "no" = "$have_clock_gt"; then
	AC_CHECK_LIB(rt,clock_gettime,have_clock_gt=rt,)
fi

if test "no" != "$have_clock_gt"; then
	AC_DEFINE(HAVE_CLOCK_GETTIME, 1, [Define if clock_gettime is available.])
fi

if test "rt" = "$have_clock_gt"; then
	LIBS="-lrt $LIBS"
fi

#
# was --with-lmdb specified?
#
AC_MSG_CHECKING(for lmdb library)
AC_ARG_WITH(lmdb,
	    AS_HELP_STRING([--with-lmdb[=PATH]],
			   [build with LMDB library [yes|no|path]]),
	    use_lmdb="$withval", use_lmdb="auto")

have_lmdb=""
case "$use_lmdb" in
	no)
		lmdb_libs=""
		;;
	auto|yes)
		for d in /usr /usr/local /opt/local
		do
			if test -f "${d}/include/lmdb.h"
			then
				if test ${d} != /usr
				then
					lmdb_cflags="-I ${d}/include"
					LIBS="$LIBS -L${d}/lib"
				fi
				have_lmdb="yes"
			fi
		done
		;;
	*)
		if test -f "${use_lmdb}/include/lmdb.h"
		then
			lmdb_cflags="-I${use_lmdb}/include"
			LIBS="$LIBS -L${use_lmdb}/lib"
			have_lmdb="yes"
		else
			AC_MSG_ERROR([$use_lmdb/include/lmdb.h not found.])
		fi
		;;
esac

if test "X${have_lmdb}" != "X"
then
	AC_MSG_RESULT(yes)
	AC_SEARCH_LIBS([mdb_env_create], [lmdb], [],
		       [AC_MSG_ERROR([found lmdb include but not library.])
			have_lmdb=""])
elif test "X$use_lmdb" = Xyes
then
	AC_MSG_ERROR([include/lmdb.h not found.])
else
	AC_MSG_RESULT(no)
fi

NZD_TOOLS=""
NZDSRCS=
NZDTARGETS=
if test "X${have_lmdb}" != "X"
then
	CFLAGS="$CFLAGS $lmdb_cflags"
	AC_DEFINE(HAVE_LMDB, 1, [Define if lmdb was found])
	NZD_TOOLS="nzd"
	NZDSRCS='${NZDSRCS}'
	NZDTARGETS='${NZDTARGETS}'
fi
AC_SUBST(NZD_TOOLS)
AC_SUBST(NZDSRCS)
AC_SUBST(NZDTARGETS)

#
# was --with-libxml2 specified?
#
AC_MSG_CHECKING(for libxml2 library)
AC_ARG_WITH(libxml2,
	    AS_HELP_STRING([--with-libxml2[=PATH]],
			   [build with libxml2 library [yes|no|path]]),
	    use_libxml2="$withval", use_libxml2="auto")

case "$use_libxml2" in
	no)
		DST_LIBXML2_INC=""
		;;
	auto|yes)
		case X`(xml2-config --version) 2>/dev/null` in
		X2.[[6789]].*)
			libxml2_libs=`xml2-config --libs`
			libxml2_cflags=`xml2-config --cflags`
			;;
		*)
			if test "yes" = "$use_libxml2" ; then
				AC_MSG_RESULT(no)
				AC_MSG_ERROR(required libxml2 version not available)
			else
				libxml2_libs=
				libxml2_cflags=
			fi
			;;
		esac
		;;
	*)
		if test -f "$use_libxml2/bin/xml2-config" ; then
			libxml2_libs=`$use_libxml2/bin/xml2-config --libs`
			libxml2_cflags=`$use_libxml2/bin/xml2-config --cflags`
		fi
		;;
esac

if test "X$libxml2_libs" != "X"
then
	CFLAGS="$CFLAGS $libxml2_cflags"
	LIBS="$LIBS $libxml2_libs"
	#
	# Sanity check xml2-config output.
	#
	AC_TRY_LINK([#include <libxml/xmlwriter.h>],
		    [return(xmlTextWriterStartElement(NULL, NULL));],
		    AC_MSG_RESULT(yes),
		    AC_MSG_ERROR(xml2-config returns badness))
	AC_DEFINE(HAVE_LIBXML2, 1, [Define if libxml2 was found])
	XMLSTATS=1
else
	AC_MSG_RESULT(no)
fi
AC_SUBST(XMLSTATS)

#
# was --with-libjson specified?
#
AC_MSG_CHECKING(for json library)
AC_ARG_WITH(libjson,
	    AS_HELP_STRING([--with-libjson[=PATH]],
			   [build with libjson0 library [yes|no|path]]),
	    use_libjson="$withval", use_libjson="auto")

have_libjson=""
have_libjson_c=""
case "$use_libjson" in
	no)
		libjson_libs=""
		;;
	auto|yes)
		for d in /usr /usr/local /opt/local
		do
			if test -f "${d}/include/json/json.h"
			then
				if test ${d} != /usr
				then
					libjson_cflags="-I ${d}/include"
					LIBS="$LIBS -L${d}/lib"
				fi
				have_libjson="yes"
			elif test -f "${d}/include/json-c/json.h"
			then
				if test ${d} != /usr
				then
					libjson_cflags="-I ${d}/include"
					LIBS="$LIBS -L${d}/lib"
				fi
				have_libjson="yes"
				have_libjson_c="yes"
			fi
		done
		;;
	*)
		if test -f "${use_libjson}/include/json/json.h"
		then
			libjson_cflags="-I${use_libjson}/include"
			LIBS="$LIBS -L${use_libjson}/lib"
			have_libjson="yes"
		elif test -f "${use_libjson}/include/json-c/json.h"
		then
			libjson_cflags="-I${use_libjson}/include"
			LIBS="$LIBS -L${use_libjson}/lib"
			have_libjson="yes"
			have_libjson_c="yes"
		else
			AC_MSG_ERROR([$use_libjson/include/json{,-c}/json.h not found.])
		fi
		;;
esac

if test "X${have_libjson}" != "X"
then
	AC_MSG_RESULT(yes)
	AC_SEARCH_LIBS([json_object_new_int64], [json json-c], [],
		       [AC_MSG_ERROR([found libjson include but not library.])
			have_libjson=""])
elif test "X$use_libjson" = Xyes
then
	AC_MSG_ERROR([include/json{,-c}/json.h not found.])
else
	AC_MSG_RESULT(no)
fi

if test "X${have_libjson}" != "X"
then
	CFLAGS="$CFLAGS $libjson_cflags"
	AC_DEFINE(HAVE_JSON, 1, [Define if libjson was found])
	if test "X${have_libjson_c}" = Xyes
	then
		AC_DEFINE(HAVE_JSON_C, 1, [Define if json-c was found])
	fi
	JSONSTATS=1
fi
AC_SUBST(JSONSTATS)

#
# was --with-zlib specified?
#
AC_MSG_CHECKING(for zlib library)
AC_ARG_WITH(zlib,
	    AS_HELP_STRING([--with-zlib[=PATH]],
			   [build with zlib for HTTP compression
				[default=yes]]),
	    with_zlib="$withval", with_zlib="auto")

have_zlib=""
case "$with_zlib" in
	no)
		zlib_libs=""
		;;
	auto|yes)
		for d in /usr /usr/local /opt/local
		do
			if test -f "${d}/include/zlib.h"
			then
				if test ${d} != /usr
				then
					zlib_cflags="-I ${d}/include"
					LIBS="$LIBS -L${d}/lib"
				fi
				have_zlib="yes"
			fi
		done
		;;
	*)
		if test -f "${with_zlib}/include/zlib.h"
		then
			zlib_cflags="-I${with_zlib}/include"
			LIBS="$LIBS -L${with_zlib}/lib"
			have_zlib="yes"
		else
			AC_MSG_ERROR([$with_zlib/include/zlib.h not found.])
		fi
		;;
esac

if test "X${have_zlib}" != "X"
then
	AC_MSG_RESULT(yes)
	AC_SEARCH_LIBS([deflate], [z], [],
		       [AC_MSG_ERROR([found zlib include but not library.])
			have_zlib=""])
elif test "X$with_zlib" = Xyes
then
	AC_MSG_ERROR([include/zlib.h not found.])
else
	AC_MSG_RESULT(no)
fi

ZLIB=
if test "X${have_zlib}" != "X"
then
	CFLAGS="$CFLAGS $zlib_cflags"
	AC_DEFINE(HAVE_ZLIB, 1, [Define if zlib was found])
	ZLIB=1
fi
AC_SUBST(ZLIB)


#
# In solaris 10, SMF can manage named service
#
AC_CHECK_LIB(scf, smf_enable_instance)

#
# flockfile is usually provided by pthreads, but we may want to use it
# even if compiled with --disable-threads.  getc_unlocked might also not
# be defined.
#
AC_CHECK_FUNC(flockfile, AC_DEFINE(HAVE_FLOCKFILE),)
AC_CHECK_FUNC(getc_unlocked, AC_DEFINE(HAVE_GETCUNLOCKED),)

#
# Indicate what the final decision was regarding threads.
#
AC_MSG_CHECKING(whether to build with threads)
if $use_threads; then
	AC_MSG_RESULT(yes)
else
	AC_MSG_RESULT(no)
fi

#
# End of pthreads stuff.
#

#
# Large File
#
AC_ARG_ENABLE(largefile,
	      AS_HELP_STRING([--enable-largefile], [64-bit file support]),
	      want_largefile="yes", want_largefile="no")
case $want_largefile in
	yes)
		ALWAYS_DEFINES="$ALWAYS_DEFINES -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
		;;
	*)
		;;
esac

#
# Additional compiler settings.
#
MKDEPCC="$CC"
MKDEPCFLAGS="-M"
IRIX_DNSSEC_WARNINGS_HACK=""

if test "X$GCC" = "Xyes"; then
	STD_CWARNINGS="$STD_CWARNINGS -W -Wall -Wmissing-prototypes -Wcast-qual -Wwrite-strings -Wformat -Wpointer-arith"
	AC_MSG_CHECKING(if "$CC" supports -fno-strict-aliasing)
	SAVE_CFLAGS="$CFLAGS"
	CFLAGS="$CFLAGS -Werror -fno-strict-aliasing"
	AC_TRY_COMPILE(,, [FNOSTRICTALIASING=yes],[FNOSTRICTALIASING=no])
	CFLAGS="$SAVE_CFLAGS"
	if test "yes" = "$FNOSTRICTALIASING"; then
		AC_MSG_RESULT(yes)
		STD_CWARNINGS="$STD_CWARNINGS -fno-strict-aliasing"
	else
		AC_MSG_RESULT(no)
	fi
	#
	# turn off delete null pointer checks
	#
	AC_MSG_CHECKING(if "$CC" supports -fno-delete-null-pointer-checks)
	SAVE_CFLAGS="$CFLAGS"
	CFLAGS="$CFLAGS -Werror -fno-delete-null-pointer-checks"
	AC_TRY_COMPILE(,, [FNODELETENULLPOINTERCHECKS=yes],
			  [FNODELETENULLPOINTERCHECKS=no])
	CFLAGS="$SAVE_CFLAGS"
	if test "yes" = "$FNODELETENULLPOINTERCHECKS"; then
		AC_MSG_RESULT(yes)
		STD_CWARNINGS="$STD_CWARNINGS -fno-delete-null-pointer-checks"
	else
		AC_MSG_RESULT(no)
	fi
	case "$host" in
	*-hp-hpux*)
		CFLAGS="$CFLAGS -Wl,+vnocompatwarnings"
		BACKTRACECFLAGS="$BACKTRACECFLAGS -Wl,+vnocompatwarnings"
		;;
	esac
	if test "X$enable_warn_shadow" = Xyes; then
		STD_CWARNINGS="$STD_CWARNINGS -Wshadow"
	fi
	if test "X$enable_warn_error" = Xyes; then
		STD_CWARNINGS="$STD_CWARNINGS -Werror"
	fi
else
	case $host in
	*-dec-osf*)
		CC="$CC -std"
		CCOPT="$CCOPT -std"
		CCNOOPT="$CCNOOPT -std"
		MKDEPCC="$CC"
		;;
	*-hp-hpux*)
		CC="$CC -Ae -z"
		# The version of the C compiler that constantly warns about
		# 'const' as well as alignment issues is unfortunately not
		# able to be discerned via the version of the operating
		# system, nor does cc have a version flag.
		case "`$CC +W 123 2>&1`" in
		*Unknown?option*)
			STD_CWARNINGS="+w1"
			;;
		*)
			# Turn off the pointlessly noisy warnings.
			STD_CWARNINGS="+w1 +W 474,530,2193,2236"
			;;
		esac
		CCOPT="$CCOPT -Ae -z"
		CCNOOPT="$CCNOOPT -Ae -z"
		CFLAGS="$CFLAGS -Wl,+vnocompatwarnings"
		BACKTRACECFLAGS="$BACKTRACECFLAGS -Wl,+vnocompatwarnings"
		MKDEPPROG='cc -Ae -E -Wp,-M >/dev/null 2>>$TMP'
		;;
	*-sgi-irix*)
		STD_CWARNINGS="-fullwarn -woff 1209"
		#
		# Silence more than 250 instances of
		#   "prototyped function redeclared without prototype"
		# and 11 instances of
		#   "variable ... was set but never used"
		# from lib/dns/sec/openssl.
		#
		IRIX_DNSSEC_WARNINGS_HACK="-woff 1692,1552"
		;;
	*-solaris*)
		MKDEPCFLAGS="-xM"
		;;
	*-sco-sysv*uw*|*-*-sysv*UnixWare*|*-*-sysv*OpenUNIX*)
		# UnixWare
		CC="$CC -w"
		;;
	esac
fi

AC_SUBST(MKDEPCC)
AC_SUBST(MKDEPCFLAGS)
AC_SUBST(MKDEPPROG)
AC_SUBST(IRIX_DNSSEC_WARNINGS_HACK)

#
# NLS
#
AC_CHECK_FUNC(catgets, AC_DEFINE(HAVE_CATGETS),)

#
# -lxnet buys us one big porting headache...  standards, gotta love 'em.
#
# AC_CHECK_LIB(xnet, socket, ,
#    AC_CHECK_LIB(socket, socket)
# )
#
# Use this for now, instead:
#
case "$host" in
	mips-sgi-irix*)
		;;
	*-linux*)
		;;
	*)
		AC_CHECK_LIB(socket, socket)
		AC_CHECK_LIB(nsl, inet_addr)
		;;
esac

#
# Work around Solaris's select() limitations.
#
case "$host" in
	*-solaris2.[[89]]|*-solaris2.1?)
	AC_DEFINE(FD_SETSIZE, 65536,
		  [Solaris hack to get select_large_fdset.])
	;;
esac

#
# Purify support
#
AC_MSG_CHECKING(whether to use purify)
AC_ARG_WITH(purify,
	    AS_HELP_STRING([--with-purify[=PATH]], [use Rational purify]),
	    use_purify="$withval", use_purify="no")

case "$use_purify" in
	no)
		;;
	yes)
		AC_PATH_PROG(purify_path, purify, purify)
		;;
	*)
		purify_path="$use_purify"
		;;
esac

case "$use_purify" in
	no)
		AC_MSG_RESULT(no)
		PURIFY=""
		;;
	*)
		if test -f "$purify_path" || test purify = "$purify_path"; then
			AC_MSG_RESULT($purify_path)
			PURIFYFLAGS="`echo $PURIFYOPTIONS`"
			PURIFY="$purify_path $PURIFYFLAGS"
		else
			AC_MSG_ERROR([$purify_path not found.

Please choose the proper path with the following command:

    configure --with-purify=PATH
])
		fi
		;;
esac

AC_SUBST(PURIFY)

#
# Google/Great Performance Tools CPU Profiler
#
AC_MSG_CHECKING(whether to use gperftools profiler)
AC_ARG_WITH(gperftools-profiler,
	    AS_HELP_STRING([--with-gperftools-profiler],
			   [use gperftools CPU profiler]),
	    use_profiler="$withval", use_profiler="no")

case $use_profiler in
	yes)
		AC_MSG_RESULT(yes)
		AC_DEFINE([HAVE_GPERFTOOLS_PROFILER], 1,
		[Define to use gperftools CPU profiler.])
		LIBS="$LIBS -lprofiler"
		;;
	*)
		AC_MSG_RESULT(no)
		;;
esac

#
# enable/disable dumping stack backtrace.  Also check if the system supports
# glibc-compatible backtrace() function.
#
AC_ARG_ENABLE(backtrace,
	      AS_HELP_STRING([--enable-backtrace],
			     [log stack backtrace on abort [default=yes]]),
	      want_backtrace="$enableval",  want_backtrace="yes")
case $want_backtrace in
yes)
	ISC_PLATFORM_USEBACKTRACE="#define ISC_PLATFORM_USEBACKTRACE 1"
	AC_TRY_LINK([#include <execinfo.h>],
	[return (backtrace((void **)0, 0));],
	[AC_DEFINE([HAVE_LIBCTRACE], [], [if system have backtrace function])],)
	;;
*)
	ISC_PLATFORM_USEBACKTRACE="#undef ISC_PLATFORM_USEBACKTRACE"
	;;
esac
AC_SUBST(ISC_PLATFORM_USEBACKTRACE)

AC_ARG_ENABLE(symtable,
	      AS_HELP_STRING([--enable-symtable],
			     [use internal symbol table for backtrace
			      [all|minimal(default)|none]]),
		want_symtable="$enableval",  want_symtable="minimal")
case $want_symtable in
yes|all|minimal)     # "yes" is a hidden value equivalent to "minimal"
	if test "" = "$PERL"
	then
		AC_MSG_ERROR([Internal symbol table requires perl but no perl is found.
Install perl or explicitly disable the feature by --disable-symtable.])
	fi
	if test "yes" = "$use_libtool"; then
		AC_MSG_WARN([Internal symbol table does not work with libtool.  Disabling symbol table.])
	else
		# we generate the internal symbol table only for those systems
		# known to work to avoid unexpected build failure.  Also, warn
		# about unsupported systems when the feature is enabled
		#  manually.
		case $host_os in
		freebsd*|netbsd*|openbsd*|linux*|solaris*|darwin*)
			MKSYMTBL_PROGRAM="$PERL"
			if test "all" = "$want_symtable"; then
				ALWAYS_MAKE_SYMTABLE="yes"
			fi
			;;
		*)
			if test "yes" = "$want_symtable" -o "all" = "$want_symtable"
			then
				AC_MSG_WARN([this system is not known to generate internal symbol table safely; disabling it])
			fi
		esac
	fi
	;;
*)
	;;
esac
AC_SUBST(MKSYMTBL_PROGRAM)
AC_SUBST(ALWAYS_MAKE_SYMTABLE)

#
# File name extension for static archive files, for those few places
# where they are treated differently from dynamic ones.
#
SA=a

AC_SUBST(O)
AC_SUBST(A)
AC_SUBST(SA)
AC_SUBST(LIBTOOL_MKDEP_SED)
AC_SUBST(LIBTOOL_MODE_COMPILE)
AC_SUBST(LIBTOOL_MODE_INSTALL)
AC_SUBST(LIBTOOL_MODE_LINK)
AC_SUBST(LIBTOOL_MODE_UNINSTALL)
AC_SUBST(LIBTOOL_ALLOW_UNDEFINED)
AC_SUBST(LIBTOOL_IN_MAIN)

BIND9_CO_RULE=".c.$O:"
AC_SUBST(BIND9_CO_RULE)

#
# Here begins a very long section to determine the system's networking
# capabilities.  The order of the tests is significant.
#

#
# IPv6
#
AC_ARG_ENABLE(ipv6,
	      AS_HELP_STRING([--enable-ipv6], [use IPv6 [default=autodetect]]))

case "$enable_ipv6" in
	yes|''|autodetect)
		AC_DEFINE(WANT_IPV6)
		;;
	no)
		;;
esac

#
# We do the IPv6 compilation checking after libtool so that we can put
# the right suffix on the files.
#
AC_MSG_CHECKING(for IPv6 structures)
AC_TRY_COMPILE([
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>],
[struct sockaddr_in6 sin6; return (0);],
	[AC_MSG_RESULT(yes)
	 found_ipv6=yes],
	[AC_MSG_RESULT(no)
	 found_ipv6=no])

#
# See whether IPv6 support is provided via a Kame add-on.
# This is done before other IPv6 linking tests to LIBS is properly set.
#
AC_MSG_CHECKING(for Kame IPv6 support)
AC_ARG_WITH(kame,
	    AS_HELP_STRING([--with-kame[=PATH]],
			   [use Kame IPv6 [default path /usr/local/v6]]),
	    use_kame="$withval", use_kame="no")

case "$use_kame" in
	no)
		;;
	yes)
		kame_path=/usr/local/v6
		;;
	*)
		kame_path="$use_kame"
		;;
esac

case "$use_kame" in
	no)
		AC_MSG_RESULT(no)
		;;
	*)
		if test -f $kame_path/lib/libinet6.a; then
			AC_MSG_RESULT($kame_path/lib/libinet6.a)
			LIBS="-L$kame_path/lib -linet6 $LIBS"
		else
			AC_MSG_ERROR([$kame_path/lib/libinet6.a not found.

Please choose the proper path with the following command:

    configure --with-kame=PATH
])
		fi
		;;
esac

#
# Whether netinet6/in6.h is needed has to be defined in isc/platform.h.
# Including it on Kame-using platforms is very bad, though, because
# Kame uses #error against direct inclusion.   So include it on only
# the platform that is otherwise broken without it -- BSD/OS 4.0 through 4.1.
# This is done before the in6_pktinfo check because that's what
# netinet6/in6.h is needed for.
#
changequote({, })
case "$host" in
*-bsdi4.[01]*)
	ISC_PLATFORM_NEEDNETINET6IN6H="#define ISC_PLATFORM_NEEDNETINET6IN6H 1"
	LWRES_PLATFORM_NEEDNETINET6IN6H="#define LWRES_PLATFORM_NEEDNETINET6IN6H 1"
	isc_netinet6in6_hack="#include <netinet6/in6.h>"
	;;
*)
	ISC_PLATFORM_NEEDNETINET6IN6H="#undef ISC_PLATFORM_NEEDNETINET6IN6H"
	LWRES_PLATFORM_NEEDNETINET6IN6H="#undef LWRES_PLATFORM_NEEDNETINET6IN6H"
	isc_netinet6in6_hack=""
	;;
esac
changequote([, ])

#
# This is similar to the netinet6/in6.h issue.
#
case "$host" in
*-sco-sysv*uw*|*-*-sysv*UnixWare*|*-*-sysv*OpenUNIX*)
	# UnixWare
	ISC_PLATFORM_NEEDNETINETIN6H="#define ISC_PLATFORM_NEEDNETINETIN6H 1"
	LWRES_PLATFORM_NEEDNETINETIN6H="#define LWRES_PLATFORM_NEEDNETINETIN6H 1"
	ISC_PLATFORM_FIXIN6ISADDR="#define ISC_PLATFORM_FIXIN6ISADDR 1"
	isc_netinetin6_hack="#include <netinet/in6.h>"
	;;
*)
	ISC_PLATFORM_NEEDNETINETIN6H="#undef ISC_PLATFORM_NEEDNETINETIN6H"
	LWRES_PLATFORM_NEEDNETINETIN6H="#undef LWRES_PLATFORM_NEEDNETINETIN6H"
	ISC_PLATFORM_FIXIN6ISADDR="#undef ISC_PLATFORM_FIXIN6ISADDR"
	isc_netinetin6_hack=""
	;;
esac

#
# Now delve deeper into the suitability of the IPv6 support.
#
case "$found_ipv6" in
	yes)
		ISC_PLATFORM_HAVEIPV6="#define ISC_PLATFORM_HAVEIPV6 1"
		LWRES_PLATFORM_HAVEIPV6="#define LWRES_PLATFORM_HAVEIPV6 1"

		AC_MSG_CHECKING(for in6_addr)
		AC_TRY_COMPILE([
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
$isc_netinetin6_hack
$isc_netinet6in6_hack
],
[struct in6_addr in6; return (0);],
		[AC_MSG_RESULT(yes)
		 ISC_PLATFORM_HAVEINADDR6="#undef ISC_PLATFORM_HAVEINADDR6"
		 LWRES_PLATFORM_HAVEINADDR6="#undef LWRES_PLATFORM_HAVEINADDR6"
		 isc_in_addr6_hack=""],
		[AC_MSG_RESULT(no)
		 ISC_PLATFORM_HAVEINADDR6="#define ISC_PLATFORM_HAVEINADDR6 1"
		 LWRES_PLATFORM_HAVEINADDR6="#define LWRES_PLATFORM_HAVEINADDR6 1"
		 isc_in_addr6_hack="#define in6_addr in_addr6"])

		AC_MSG_CHECKING(for in6addr_any)
		AC_TRY_LINK([
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
$isc_netinetin6_hack
$isc_netinet6in6_hack
$isc_in_addr6_hack
],
		[struct in6_addr in6; in6 = in6addr_any; return (in6.s6_addr[0]);],
			[AC_MSG_RESULT(yes)
			 ISC_PLATFORM_NEEDIN6ADDRANY="#undef ISC_PLATFORM_NEEDIN6ADDRANY"
			 LWRES_PLATFORM_NEEDIN6ADDRANY="#undef LWRES_PLATFORM_NEEDIN6ADDRANY"],
			[AC_MSG_RESULT(no)
			 ISC_PLATFORM_NEEDIN6ADDRANY="#define ISC_PLATFORM_NEEDIN6ADDRANY 1"
			 LWRES_PLATFORM_NEEDIN6ADDRANY="#define LWRES_PLATFORM_NEEDIN6ADDRANY 1"])

		AC_MSG_CHECKING(for in6addr_loopback)
		AC_TRY_LINK([
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
$isc_netinetin6_hack
$isc_netinet6in6_hack
$isc_in_addr6_hack
],
		[struct in6_addr in6; in6 = in6addr_loopback; return (in6.s6_addr[0]);],
			[AC_MSG_RESULT(yes)
			 ISC_PLATFORM_NEEDIN6ADDRLOOPBACK="#undef ISC_PLATFORM_NEEDIN6ADDRLOOPBACK"
			 LWRES_PLATFORM_NEEDIN6ADDRLOOPBACK="#undef LWRES_PLATFORM_NEEDIN6ADDRLOOPBACK"],
			[AC_MSG_RESULT(no)
			 ISC_PLATFORM_NEEDIN6ADDRLOOPBACK="#define ISC_PLATFORM_NEEDIN6ADDRLOOPBACK 1"
			 LWRES_PLATFORM_NEEDIN6ADDRLOOPBACK="#define LWRES_PLATFORM_NEEDIN6ADDRLOOPBACK 1"])

		AC_MSG_CHECKING(for sin6_scope_id in struct sockaddr_in6)
		AC_TRY_COMPILE([
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
$isc_netinetin6_hack
$isc_netinet6in6_hack
],
		[struct sockaddr_in6 xyzzy; xyzzy.sin6_scope_id = 0; return (0);],
			[AC_MSG_RESULT(yes)
			 ISC_PLATFORM_HAVESCOPEID="#define ISC_PLATFORM_HAVESCOPEID 1"
			 result="#define LWRES_HAVE_SIN6_SCOPE_ID 1"],
			[AC_MSG_RESULT(no)
			 ISC_PLATFORM_HAVESCOPEID="#undef ISC_PLATFORM_HAVESCOPEID"
			 result="#undef LWRES_HAVE_SIN6_SCOPE_ID"])
		LWRES_HAVE_SIN6_SCOPE_ID="$result"

		AC_MSG_CHECKING(for in6_pktinfo)
		AC_TRY_COMPILE([
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
$isc_netinetin6_hack
$isc_netinet6in6_hack
],
		[struct in6_pktinfo xyzzy; return (0);],
			[AC_MSG_RESULT(yes)
			 ISC_PLATFORM_HAVEIN6PKTINFO="#define ISC_PLATFORM_HAVEIN6PKTINFO 1"],
			[AC_MSG_RESULT(no -- disabling runtime ipv6 support)
			 ISC_PLATFORM_HAVEIN6PKTINFO="#undef ISC_PLATFORM_HAVEIN6PKTINFO"])
		;;
	no)
		ISC_PLATFORM_HAVEIPV6="#undef ISC_PLATFORM_HAVEIPV6"
		LWRES_PLATFORM_HAVEIPV6="#undef LWRES_PLATFORM_HAVEIPV6"
		ISC_PLATFORM_NEEDIN6ADDRANY="#undef ISC_PLATFORM_NEEDIN6ADDRANY"
		LWRES_PLATFORM_NEEDIN6ADDRANY="#undef LWRES_PLATFORM_NEEDIN6ADDRANY"
		ISC_PLATFORM_HAVEIN6PKTINFO="#undef ISC_PLATFORM_HAVEIN6PKTINFO"
		LWRES_HAVE_SIN6_SCOPE_ID="#define LWRES_HAVE_SIN6_SCOPE_ID 1"
		ISC_PLATFORM_HAVESCOPEID="#define ISC_PLATFORM_HAVESCOPEID 1"
		ISC_IPV6_H="ipv6.h"
		ISC_IPV6_O="ipv6.$O"
		ISC_ISCIPV6_O="unix/ipv6.$O"
		ISC_IPV6_C="ipv6.c"
		;;
esac

AC_MSG_CHECKING(for struct sockaddr_storage)
AC_TRY_COMPILE([
#include <sys/types.h>
#include <sys/socket.h>
$isc_netinetin6_hack
$isc_netinet6in6_hack
],
[struct sockaddr_storage storage; return (0);],
[AC_MSG_RESULT(yes)
ISC_PLATFORM_HAVESOCKADDRSTORAGE="#define ISC_PLATFORM_HAVESOCKADDRSTORAGE 1"],
[AC_MSG_RESULT(no)
ISC_PLATFORM_HAVESOCKADDRSTORAGE="#undef ISC_PLATFORM_HAVESOCKADDRSTORAGE"])

AC_SUBST(ISC_PLATFORM_HAVEIPV6)
AC_SUBST(LWRES_PLATFORM_HAVEIPV6)
AC_SUBST(ISC_PLATFORM_NEEDNETINETIN6H)
AC_SUBST(LWRES_PLATFORM_NEEDNETINETIN6H)
AC_SUBST(ISC_PLATFORM_NEEDNETINET6IN6H)
AC_SUBST(LWRES_PLATFORM_NEEDNETINET6IN6H)
AC_SUBST(ISC_PLATFORM_HAVEINADDR6)
AC_SUBST(LWRES_PLATFORM_HAVEINADDR6)
AC_SUBST(ISC_PLATFORM_NEEDIN6ADDRANY)
AC_SUBST(LWRES_PLATFORM_NEEDIN6ADDRANY)
AC_SUBST(ISC_PLATFORM_NEEDIN6ADDRLOOPBACK)
AC_SUBST(LWRES_PLATFORM_NEEDIN6ADDRLOOPBACK)
AC_SUBST(ISC_PLATFORM_HAVEIN6PKTINFO)
AC_SUBST(ISC_PLATFORM_FIXIN6ISADDR)
AC_SUBST(ISC_PLATFORM_HAVESOCKADDRSTORAGE)
AC_SUBST(ISC_IPV6_H)
AC_SUBST(ISC_IPV6_O)
AC_SUBST(ISC_ISCIPV6_O)
AC_SUBST(ISC_IPV6_C)
AC_SUBST(LWRES_HAVE_SIN6_SCOPE_ID)
AC_SUBST(ISC_PLATFORM_HAVESCOPEID)

AC_MSG_CHECKING([for struct if_laddrreq])
AC_TRY_LINK([
#include <sys/types.h>
#include <net/if6.h>
],[ struct if_laddrreq a; ],
	[AC_MSG_RESULT(yes)
	ISC_PLATFORM_HAVEIF_LADDRREQ="#define ISC_PLATFORM_HAVEIF_LADDRREQ 1"],
	[AC_MSG_RESULT(no)
	ISC_PLATFORM_HAVEIF_LADDRREQ="#undef ISC_PLATFORM_HAVEIF_LADDRREQ"])
AC_SUBST(ISC_PLATFORM_HAVEIF_LADDRREQ)

AC_MSG_CHECKING([for struct if_laddrconf])
AC_TRY_LINK([
#include <sys/types.h>
#include <net/if6.h>
],[ struct if_laddrconf a; ],
	[AC_MSG_RESULT(yes)
	ISC_PLATFORM_HAVEIF_LADDRCONF="#define ISC_PLATFORM_HAVEIF_LADDRCONF 1"],
	[AC_MSG_RESULT(no)
	ISC_PLATFORM_HAVEIF_LADDRCONF="#undef ISC_PLATFORM_HAVEIF_LADDRCONF"])
AC_SUBST(ISC_PLATFORM_HAVEIF_LADDRCONF)

#
# Check for network functions that are often missing.  We do this
# after the libtool checking, so we can put the right suffix on
# the files.  It also needs to come after checking for a Kame add-on,
# which provides some (all?) of the desired functions.
#

AC_MSG_CHECKING([for inet_ntop with IPv6 support])
AC_TRY_RUN([
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
main() {
char a[16],b[64]; return(inet_ntop(AF_INET6, a, b, sizeof(b)) == (char*)0);}],
	[AC_MSG_RESULT(yes)
	ISC_PLATFORM_NEEDNTOP="#undef ISC_PLATFORM_NEEDNTOP"],

	[AC_MSG_RESULT(no)
	ISC_EXTRA_OBJS="$ISC_EXTRA_OBJS inet_ntop.$O"
	ISC_EXTRA_SRCS="$ISC_EXTRA_SRCS inet_ntop.c"
	ISC_PLATFORM_NEEDNTOP="#define ISC_PLATFORM_NEEDNTOP 1"],
	[AC_MSG_RESULT(assuming inet_ntop not needed)
	ISC_PLATFORM_NEEDNTOP="#undef ISC_PLATFORM_NEEDNTOP"])


# On NetBSD 1.4.2 and maybe others, inet_pton() incorrectly accepts
# addresses with less than four octets, like "1.2.3".  Also leading
# zeros should also be rejected.

AC_MSG_CHECKING([for working inet_pton with IPv6 support])
AC_TRY_RUN([
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
main() { char a[16]; return (inet_pton(AF_INET, "1.2.3", a) == 1 ? 1 :
			     inet_pton(AF_INET, "1.2.3.04", a) == 1 ? 1 :
			     (inet_pton(AF_INET6, "::1.2.3.4", a) != 1)); }],
	[AC_MSG_RESULT(yes)
	ISC_PLATFORM_NEEDPTON="#undef ISC_PLATFORM_NEEDPTON"],
	[AC_MSG_RESULT(no)
	ISC_EXTRA_OBJS="$ISC_EXTRA_OBJS inet_pton.$O"
	ISC_EXTRA_SRCS="$ISC_EXTRA_SRCS inet_pton.c"
	ISC_PLATFORM_NEEDPTON="#define ISC_PLATFORM_NEEDPTON 1"],
	[AC_MSG_RESULT(assuming inet_pton needed)
	ISC_EXTRA_OBJS="$ISC_EXTRA_OBJS inet_pton.$O"
	ISC_EXTRA_SRCS="$ISC_EXTRA_SRCS inet_pton.c"
	ISC_PLATFORM_NEEDPTON="#define ISC_PLATFORM_NEEDPTON 1"])

AC_SUBST(ISC_PLATFORM_NEEDNTOP)
AC_SUBST(ISC_PLATFORM_NEEDPTON)

#
# Look for a 4.4BSD-style sa_len member in struct sockaddr.
#
case "$host" in
	*-dec-osf*)
		# Turn on 4.4BSD style sa_len support.
		AC_DEFINE(_SOCKADDR_LEN)
		;;
esac

AC_MSG_CHECKING(for sa_len in struct sockaddr)
AC_TRY_COMPILE([
#include <sys/types.h>
#include <sys/socket.h>],
[struct sockaddr sa; sa.sa_len = 0; return (0);],
	[AC_MSG_RESULT(yes)
	ISC_PLATFORM_HAVESALEN="#define ISC_PLATFORM_HAVESALEN 1"
	LWRES_PLATFORM_HAVESALEN="#define LWRES_PLATFORM_HAVESALEN 1"],
	[AC_MSG_RESULT(no)
	ISC_PLATFORM_HAVESALEN="#undef ISC_PLATFORM_HAVESALEN"
	LWRES_PLATFORM_HAVESALEN="#undef LWRES_PLATFORM_HAVESALEN"])
AC_SUBST(ISC_PLATFORM_HAVESALEN)
AC_SUBST(LWRES_PLATFORM_HAVESALEN)

#
# Look for a 4.4BSD or 4.3BSD struct msghdr
#
AC_MSG_CHECKING(for struct msghdr flavor)
AC_TRY_COMPILE([
#include <sys/types.h>
#include <sys/socket.h>],
[struct msghdr msg; msg.msg_flags = 0; return (0);],
	[AC_MSG_RESULT(4.4BSD)
	ISC_PLATFORM_MSGHDRFLAVOR="#define ISC_NET_BSD44MSGHDR 1"],
	[AC_MSG_RESULT(4.3BSD)
	ISC_PLATFORM_MSGHDRFLAVOR="#define ISC_NET_BSD43MSGHDR 1"])
AC_SUBST(ISC_PLATFORM_MSGHDRFLAVOR)

#
# Look for in_port_t.
#
AC_MSG_CHECKING(for type in_port_t)
AC_TRY_COMPILE([
#include <sys/types.h>
#include <netinet/in.h>],
[in_port_t port = 25; return (0);],
	[AC_MSG_RESULT(yes)
	ISC_PLATFORM_NEEDPORTT="#undef ISC_PLATFORM_NEEDPORTT"],
	[AC_MSG_RESULT(no)
	ISC_PLATFORM_NEEDPORTT="#define ISC_PLATFORM_NEEDPORTT 1"])
AC_SUBST(ISC_PLATFORM_NEEDPORTT)

#
# Allow forcibly disabling TCP Fast Open support as autodetection might yield
# confusing results on some systems (e.g. FreeBSD; see set_tcp_fastopen()
# comment in lib/isc/unix/socket.c).
#

AC_ARG_ENABLE(tcp_fastopen,
	      AS_HELP_STRING([--disable-tcp-fastopen],
		     [disable TCP Fast Open support [default=autodetect]]))

AC_MSG_CHECKING(for TCP_FASTOPEN socket option)
case "$enable_tcp_fastopen" in
yes|''|autodetect)
	AC_EGREP_CPP(has_tfo, [
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/tcp.h>
#ifdef TCP_FASTOPEN
int has_tfo() { return (0); }
#endif
],
		[AC_MSG_RESULT(yes)
		ISC_PLATFORM_HAVETFO="#define ISC_PLATFORM_HAVETFO 1"],
		[AC_MSG_RESULT(no)
		ISC_PLATFORM_HAVETFO="#undef ISC_PLATFORM_HAVETFO"])

		;;
	no)
		AC_MSG_RESULT(disabled)
		ISC_PLATFORM_HAVETFO="#undef ISC_PLATFORM_HAVETFO"
		;;
esac
AC_SUBST(ISC_PLATFORM_HAVETFO)

#
# Check for addrinfo
#
AC_MSG_CHECKING(for struct addrinfo)
AC_TRY_COMPILE([
#include <netdb.h>],
[struct addrinfo a; return (0);],
	[AC_MSG_RESULT(yes)
	ISC_LWRES_NEEDADDRINFO="#undef ISC_LWRES_NEEDADDRINFO"
	ISC_IRS_NEEDADDRINFO="#undef ISC_IRS_NEEDADDRINFO"
	AC_DEFINE(HAVE_ADDRINFO)],
	[AC_MSG_RESULT(no)
	ISC_LWRES_NEEDADDRINFO="#define ISC_LWRES_NEEDADDRINFO 1"
	ISC_IRS_NEEDADDRINFO="#define ISC_IRS_NEEDADDRINFO 1"])
AC_SUBST(ISC_LWRES_NEEDADDRINFO)
AC_SUBST(ISC_IRS_NEEDADDRINFO)

#
# Check for rrsetinfo
#
AC_MSG_CHECKING(for struct rrsetinfo)
AC_TRY_COMPILE([
#include <netdb.h>],
[struct rrsetinfo r; return (0);],
	[AC_MSG_RESULT(yes)
	ISC_LWRES_NEEDRRSETINFO="#undef ISC_LWRES_NEEDRRSETINFO"],
	[AC_MSG_RESULT(no)
	ISC_LWRES_NEEDRRSETINFO="#define ISC_LWRES_NEEDRRSETINFO 1"])
AC_SUBST(ISC_LWRES_NEEDRRSETINFO)

AC_MSG_CHECKING(for int sethostent)
AC_TRY_COMPILE([
#include <netdb.h>],
[int i = sethostent(0); return(0);],
	[AC_MSG_RESULT(yes)
	ISC_LWRES_SETHOSTENTINT="#define ISC_LWRES_SETHOSTENTINT 1"],
	[AC_MSG_RESULT(no)
	ISC_LWRES_SETHOSTENTINT="#undef ISC_LWRES_SETHOSTENTINT"])
AC_SUBST(ISC_LWRES_SETHOSTENTINT)

AC_MSG_CHECKING(for int endhostent)
AC_TRY_COMPILE([
#include <netdb.h>],
[int i = endhostent(); return(0);],
	[AC_MSG_RESULT(yes)
	ISC_LWRES_ENDHOSTENTINT="#define ISC_LWRES_ENDHOSTENTINT 1"],
	[AC_MSG_RESULT(no)
	ISC_LWRES_ENDHOSTENTINT="#undef ISC_LWRES_ENDHOSTENTINT"])
AC_SUBST(ISC_LWRES_ENDHOSTENTINT)

AC_MSG_CHECKING(for getnetbyaddr(in_addr_t, ...))
AC_TRY_COMPILE([
#include <netdb.h>
struct netent *getnetbyaddr(in_addr_t, int);],
[],
	[AC_MSG_RESULT(yes)
	ISC_LWRES_GETNETBYADDRINADDR="#define ISC_LWRES_GETNETBYADDRINADDR 1"],
	[AC_MSG_RESULT(no)
	ISC_LWRES_GETNETBYADDRINADDR="#undef ISC_LWRES_GETNETBYADDRINADDR"])
AC_SUBST(ISC_LWRES_GETNETBYADDRINADDR)

AC_MSG_CHECKING(for int setnetent)
AC_TRY_COMPILE([
#include <netdb.h>],
[int i = setnetent(0); return(0);],
	[AC_MSG_RESULT(yes)
	ISC_LWRES_SETNETENTINT="#define ISC_LWRES_SETNETENTINT 1"],
	[AC_MSG_RESULT(no)
	ISC_LWRES_SETNETENTINT="#undef ISC_LWRES_SETNETENTINT"])
AC_SUBST(ISC_LWRES_SETNETENTINT)

AC_MSG_CHECKING(for int endnetent)
AC_TRY_COMPILE([
#include <netdb.h>],
[int i = endnetent(); return(0);],
	[AC_MSG_RESULT(yes)
	ISC_LWRES_ENDNETENTINT="#define ISC_LWRES_ENDNETENTINT 1"],
	[AC_MSG_RESULT(no)
	ISC_LWRES_ENDNETENTINT="#undef ISC_LWRES_ENDNETENTINT"])
AC_SUBST(ISC_LWRES_ENDNETENTINT)

AC_MSG_CHECKING(for gethostbyaddr(const void *, size_t, ...))
AC_TRY_COMPILE([
#include <netdb.h>
struct hostent *gethostbyaddr(const void *, size_t, int);],
[return(0);],
	[AC_MSG_RESULT(yes)
	ISC_LWRES_GETHOSTBYADDRVOID="#define ISC_LWRES_GETHOSTBYADDRVOID 1"],
	[AC_MSG_RESULT(no)
	ISC_LWRES_GETHOSTBYADDRVOID="#undef ISC_LWRES_GETHOSTBYADDRVOID"])
AC_SUBST(ISC_LWRES_GETHOSTBYADDRVOID)

AC_MSG_CHECKING(for h_errno in netdb.h)
AC_TRY_COMPILE([
#include <netdb.h>],
[h_errno = 1; return(0);],
	[AC_MSG_RESULT(yes)
	ISC_LWRES_NEEDHERRNO="#undef ISC_LWRES_NEEDHERRNO"],
	[AC_MSG_RESULT(no)
	ISC_LWRES_NEEDHERRNO="#define ISC_LWRES_NEEDHERRNO 1"])
AC_SUBST(ISC_LWRES_NEEDHERRNO)

#
# Sadly, the definitions of system-supplied getnameinfo(3) vary.  Try to catch
# known variations here:
#
AC_MSG_CHECKING(for getnameinfo prototype definitions)
AC_TRY_COMPILE([
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
int getnameinfo(const struct sockaddr *, socklen_t, char *,
		socklen_t, char *, socklen_t, int);],
[ return (0);],
	[AC_MSG_RESULT(socklen_t for buflen; int for flags)
	 AC_DEFINE(IRS_GETNAMEINFO_SOCKLEN_T, socklen_t,
		   [Define to the sockaddr length type used by getnameinfo(3).])
	 AC_DEFINE(IRS_GETNAMEINFO_BUFLEN_T, socklen_t,
		   [Define to the buffer length type used by getnameinfo(3).])
	 AC_DEFINE(IRS_GETNAMEINFO_FLAGS_T, int,
		   [Define to the flags type used by getnameinfo(3).])],
[AC_TRY_COMPILE([
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
int getnameinfo(const struct sockaddr *, socklen_t, char *,
		size_t, char *, size_t, int);],
[ return (0);],
	[AC_MSG_RESULT(size_t for buflen; int for flags)
	 AC_DEFINE(IRS_GETNAMEINFO_SOCKLEN_T, socklen_t)
	 AC_DEFINE(IRS_GETNAMEINFO_BUFLEN_T, size_t)
	 AC_DEFINE(IRS_GETNAMEINFO_FLAGS_T, int)],
[AC_TRY_COMPILE([
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
int getnameinfo(const struct sockaddr *, size_t, char *,
		size_t, char *, size_t, int);],
[ return (0);],
	[AC_MSG_RESULT(size_t for buflen; int for flags)
	 AC_DEFINE(IRS_GETNAMEINFO_SOCKLEN_T, size_t)
	 AC_DEFINE(IRS_GETNAMEINFO_BUFLEN_T, size_t)
	 AC_DEFINE(IRS_GETNAMEINFO_FLAGS_T, int)],
[AC_MSG_RESULT(not match any subspecies; socklen_t for buflen; u_int for flags)
AC_DEFINE(IRS_GETNAMEINFO_SOCKLEN_T, socklen_t)
AC_DEFINE(IRS_GETNAMEINFO_BUFLEN_T, socklen_t)
AC_DEFINE(IRS_GETNAMEINFO_FLAGS_T, unsigned int)])])])

#
# ...and same for gai_strerror().
#
AC_MSG_CHECKING(for gai_strerror prototype definitions)
AC_TRY_COMPILE([
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
char *gai_strerror(int ecode);],
[ return (0); ],
	[AC_MSG_RESULT(returning char *)
	 AC_DEFINE([IRS_GAISTRERROR_RETURN_T], [char *],
	 [return type of gai_strerror])],
[AC_MSG_RESULT(not match any subspecies; assume standard definition)
AC_DEFINE([IRS_GAISTRERROR_RETURN_T], [const char *])])

AC_CHECK_FUNC(getipnodebyname,
	[ISC_LWRES_GETIPNODEPROTO="#undef ISC_LWRES_GETIPNODEPROTO"],
	[ISC_LWRES_GETIPNODEPROTO="#define ISC_LWRES_GETIPNODEPROTO 1"])
AC_CHECK_FUNC(getnameinfo,
	[ISC_LWRES_GETNAMEINFOPROTO="#undef ISC_LWRES_GETNAMEINFOPROTO"],
	[ISC_LWRES_GETNAMEINFOPROTO="#define ISC_LWRES_GETNAMEINFOPROTO 1"])
AC_CHECK_FUNC(getaddrinfo,
	[ISC_LWRES_GETADDRINFOPROTO="#undef ISC_LWRES_GETADDRINFOPROTO"
	AC_DEFINE(HAVE_GETADDRINFO)],
	[ISC_LWRES_GETADDRINFOPROTO="#define ISC_LWRES_GETADDRINFOPROTO 1"])
AC_CHECK_FUNC(gai_strerror, AC_DEFINE(HAVE_GAISTRERROR))
AC_SUBST(ISC_LWRES_GETIPNODEPROTO)
AC_SUBST(ISC_LWRES_GETADDRINFOPROTO)
AC_SUBST(ISC_LWRES_GETNAMEINFOPROTO)
AC_SUBST(ISC_IRS_GETNAMEINFOSOCKLEN)

AC_ARG_ENABLE(getifaddrs,
	      AS_HELP_STRING([--enable-getifaddrs],
			     [enable the use of getifaddrs() [yes|no].]),
    want_getifaddrs="$enableval",  want_getifaddrs="yes")

#
# This interface iteration code for getifaddrs() will fall back to using
# /proc/net/if_inet6 if getifaddrs() in glibc doesn't return any IPv6
# addresses.
#
case $want_getifaddrs in
glibc)
AC_MSG_WARN("--enable-getifaddrs=glibc is no longer required")
AC_CHECK_FUNC(getifaddrs, AC_DEFINE(HAVE_GETIFADDRS))
;;
yes)
AC_CHECK_FUNC(getifaddrs, AC_DEFINE(HAVE_GETIFADDRS))
;;
no)
;;
esac

#
# Look for a sysctl call to get the list of network interfaces.
#
case $ac_cv_header_sys_sysctl_h in
yes)
AC_MSG_CHECKING(for interface list sysctl)
AC_EGREP_CPP(found_rt_iflist, [
#include <sys/param.h>
#include <sys/sysctl.h>
#include <sys/socket.h>
#ifdef NET_RT_IFLIST
found_rt_iflist
#endif
],
	[AC_MSG_RESULT(yes)
	 AC_DEFINE(HAVE_IFLIST_SYSCTL)],
	[AC_MSG_RESULT(no)])
;;
esac

#
# Check for some other useful functions that are not ever-present.
#

# We test for strsep() using AC_TRY_LINK instead of AC_CHECK_FUNC
# because AIX 4.3.3 with patches for bos.adt.include to version 4.3.3.77
# reportedly defines strsep() without declaring it in <string.h> when
# -D_LINUX_SOURCE_COMPAT is not defined [RT #2190], and
# AC_CHECK_FUNC() incorrectly succeeds because it declares
# the function itself.
AC_MSG_CHECKING(for correctly declared strsep())
AC_TRY_LINK([#include <string.h>], [char *sp; char *foo = strsep(&sp, ".");],
	[AC_MSG_RESULT(yes); ISC_PLATFORM_NEEDSTRSEP="#undef ISC_PLATFORM_NEEDSTRSEP"],
	[AC_MSG_RESULT(no); ISC_PLATFORM_NEEDSTRSEP="#define ISC_PLATFORM_NEEDSTRSEP 1"])
AC_SUBST(ISC_PLATFORM_NEEDSTRSEP)

AC_CHECK_FUNC(memmove,
	[ISC_PLATFORM_NEEDMEMMOVE="#undef ISC_PLATFORM_NEEDMEMMOVE"],
	[ISC_PLATFORM_NEEDMEMMOVE="#define ISC_PLATFORM_NEEDMEMMOVE 1"])
AC_SUBST(ISC_PLATFORM_NEEDMEMMOVE)

AC_CHECK_FUNC(strtoul,
	[ISC_PLATFORM_NEEDSTRTOUL="#undef ISC_PLATFORM_NEEDSTRTOUL"
	 LWRES_PLATFORM_NEEDSTRTOUL="#undef LWRES_PLATFORM_NEEDSTRTOUL"
	 GENRANDOMLIB=""],
	[ISC_PLATFORM_NEEDSTRTOUL="#define ISC_PLATFORM_NEEDSTRTOUL 1"
	 LWRES_PLATFORM_NEEDSTRTOUL="#define LWRES_PLATFORM_NEEDSTRTOUL 1"
	 GENRANDOMLIB='${ISCLIBS}'])
AC_SUBST(ISC_PLATFORM_NEEDSTRTOUL)
AC_SUBST(LWRES_PLATFORM_NEEDSTRTOUL)
AC_SUBST(GENRANDOMLIB)

AC_CHECK_FUNC(strlcpy,
	[ISC_PLATFORM_NEEDSTRLCPY="#undef ISC_PLATFORM_NEEDSTRLCPY"
	 LWRES_PLATFORM_NEEDSTRLCPY="#undef LWRES_PLATFORM_NEEDSTRLCPY"],
	[ISC_PLATFORM_NEEDSTRLCPY="#define ISC_PLATFORM_NEEDSTRLCPY 1"
	 LWRES_PLATFORM_NEEDSTRLCPY="#define LWRES_PLATFORM_NEEDSTRLCPY 1"])
AC_SUBST(ISC_PLATFORM_NEEDSTRLCPY)
AC_SUBST(LWRES_PLATFORM_NEEDSTRLCPY)

AC_CHECK_FUNC(strlcat,
	[ISC_PLATFORM_NEEDSTRLCAT="#undef ISC_PLATFORM_NEEDSTRLCAT"],
	[ISC_PLATFORM_NEEDSTRLCAT="#define ISC_PLATFORM_NEEDSTRLCAT 1"])
AC_SUBST(ISC_PLATFORM_NEEDSTRLCAT)

AC_CHECK_FUNC(strcasestr,
	[ISC_PLATFORM_NEEDSTRCASESTR="#undef ISC_PLATFORM_NEEDSTRCASESTR"],
	[ISC_PLATFORM_NEEDSTRCASESTR="#define ISC_PLATFORM_NEEDSTRCASESTR 1"])
AC_SUBST(ISC_PLATFORM_NEEDSTRCASESTR)

AC_SUBST(READLINE_LIB)
AC_ARG_WITH(readline,
	    AS_HELP_STRING([--with-readline[=LIBSPEC]],
			   [specify readline library [default auto]]),
	    use_readline="$withval", use_readline="auto")
case "$use_readline" in
no)	;;
*)
	saved_LIBS="$LIBS"
	case "$use_readline" in
	yes|auto) try_readline="-ledit"; or_readline="-lreadline" ;;
	*) try_readline="$use_readline"
	esac
	for readline in "$try_readline" $or_readline
	do
		LIBS="$readline"
		AC_MSG_NOTICE(checking for readline with $readline)
		AC_CHECK_FUNCS(readline)
		if test "yes" = "$ac_cv_func_readline"
		then
			READLINE_LIB="$readline"
			break
		fi
		for lib in -lterminfo -ltermcap -lncurses -lcurses
		do
			AC_MSG_NOTICE(checking for readline with $readline $lib)
			unset ac_cv_func_readline
			LIBS="$readline $lib"
			AC_CHECK_FUNCS(readline)
			if test "yes" = "$ac_cv_func_readline"
			then
				READLINE_LIB="$readline $lib"
				break
			fi
		done
		if test "yes" = "$ac_cv_func_readline"
		then
			break
		fi
	done
	if test "auto" != "$use_readline" &&
	   test "X$READLINE_LIB" = "X"
	then
		AC_MSG_ERROR([The readline library was not found.])
	fi
	LIBS="$saved_LIBS"
	;;
esac
if test "yes" = "$ac_cv_func_readline"
then
	case "$READLINE_LIB" in
	*edit*)
		AC_CHECK_HEADERS(editline/readline.h)
		AC_CHECK_HEADERS(edit/readline/readline.h)
		AC_CHECK_HEADERS(edit/readline/history.h)
		;;
	esac
	AC_CHECK_HEADERS(readline/readline.h)
	AC_CHECK_HEADERS(readline/history.h)
fi

ISC_PRINT_OBJS=
ISC_PRINT_SRCS=
ISC_PLATFORM_NEEDPRINTF='#undef ISC_PLATFORM_NEEDPRINTF'
ISC_PLATFORM_NEEDFPRINTF='#undef ISC_PLATFORM_NEEDFPRINTF'
ISC_PLATFORM_NEEDSPRINTF='#undef ISC_PLATFORM_NEEDSPRINTF'
ISC_PLATFORM_NEEDVSNPRINTF='#undef ISC_PLATFORM_NEEDVSNPRINTF'
LWRES_PLATFORM_NEEDVSNPRINTF='#undef LWRES_PLATFORM_NEEDVSNPRINTF'

AC_MSG_CHECKING(sprintf return type)
AC_TRY_COMPILE([
#include <stdio.h>
],
[ char buf[2]; return(*sprintf(buf,"x"));],
[AC_MSG_RESULT(char *)
ISC_PRINT_OBJS="print.$O"
ISC_PRINT_SRCS="print.c"
ISC_PLATFORM_NEEDSPRINTF="#define ISC_PLATFORM_NEEDSPRINTF"
LWRES_PLATFORM_NEEDSPRINTF="#define LWRES_PLATFORM_NEEDSPRINTF"
],[AC_MSG_RESULT(int)])

AC_CHECK_FUNC(vsnprintf, [],
	[ISC_PRINT_OBJS="print.$O"
	 ISC_PRINT_SRCS="print.c"
	 ISC_PLATFORM_NEEDVSNPRINTF="#define ISC_PLATFORM_NEEDVSNPRINTF 1"
	 LWRES_PLATFORM_NEEDVSNPRINTF="#define LWRES_PLATFORM_NEEDVSNPRINTF 1"])

AC_MSG_CHECKING(printf for %z support)
AC_TRY_RUN([
#include <stdio.h>

int
main() {
	size_t j = 0;
	char buf[100];
	buf[0] = 0;
	sprintf(buf, "%zu", j);
	return ((buf[0] == '0' && buf[1] == '\0') ? 0 : 1);
}
],
	[AC_MSG_RESULT(yes)],
	[AC_MSG_RESULT(no)
	ISC_PRINT_OBJS="print.$O"
	ISC_PRINT_SRCS="print.c"
	ISC_PLATFORM_NEEDPRINTF='#define ISC_PLATFORM_NEEDPRINTF 1'
	ISC_PLATFORM_NEEDFPRINTF='#define ISC_PLATFORM_NEEDFPRINTF 1'
	ISC_PLATFORM_NEEDFSRINTF='#define ISC_PLATFORM_NEEDSPRINTF 1'
	ISC_PLATFORM_NEEDVSNPRINTF="#define ISC_PLATFORM_NEEDVSNPRINTF 1"
	LWRES_PLATFORM_NEEDVSNPRINTF="#define LWRES_PLATFORM_NEEDVSNPRINTF 1"],
	[AC_MSG_RESULT(assuming target platform supports %z)])

AC_SUBST(ISC_PLATFORM_NEEDPRINTF)
AC_SUBST(ISC_PLATFORM_NEEDFPRINTF)
AC_SUBST(ISC_PLATFORM_NEEDSPRINTF)
AC_SUBST(ISC_PLATFORM_NEEDVSNPRINTF)
AC_SUBST(LWRES_PLATFORM_NEEDSPRINTF)
AC_SUBST(LWRES_PLATFORM_NEEDVSNPRINTF)

ISC_EXTRA_OBJS="$ISC_EXTRA_OBJS $ISC_PRINT_OBJS"
ISC_EXTRA_SRCS="$ISC_EXTRA_SRCS $ISC_PRINT_SRCS"
AC_SUBST(ISC_EXTRA_OBJS)
AC_SUBST(ISC_EXTRA_SRCS)

AC_CHECK_FUNC(strerror, AC_DEFINE(HAVE_STRERROR))
#
# Use our own SPNEGO implementation?
#
AC_ARG_ENABLE(isc-spnego,
	      AS_HELP_STRING([--disable-isc-spnego],
			     [use SPNEGO from GSSAPI library]))

if test -n "$USE_GSSAPI"
then
	case "$enable_isc_spnego" in
		yes|'')
			USE_ISC_SPNEGO='-DUSE_ISC_SPNEGO'
			DST_EXTRA_OBJS="$DST_EXTRA_OBJS spnego.$O"
			DST_EXTRA_SRCS="$DST_EXTRA_SRCS spnego.c"
			AC_MSG_RESULT(using SPNEGO from lib/dns)
			;;
		no)
			AC_MSG_RESULT(using SPNEGO from GSSAPI library)
			;;
	esac
fi

AC_SUBST(USE_ISC_SPNEGO)

AC_SUBST(DST_EXTRA_OBJS)
AC_SUBST(DST_EXTRA_SRCS)

#
# Security Stuff
#
# Note it is very recommended to *not* disable chroot(),
# this is only because chroot() was made obsolete by Posix.
AC_ARG_ENABLE(chroot, AS_HELP_STRING([--disable-chroot], [disable chroot]))
case "$enable_chroot" in
	yes|'')
		AC_CHECK_FUNCS(chroot)
		;;
	no)
		;;
esac
AC_ARG_ENABLE(linux-caps,
	      AS_HELP_STRING([--disable-linux-caps],
			     [disable linux capabilities]))
case "$enable_linux_caps" in
	yes|'')
		AC_CHECK_HEADERS(linux/types.h)
		AC_CHECK_HEADERS([sys/capability.h])
		AC_CHECK_HEADERS([linux/capability.h], [], [],
				 [#ifdef HAVE_LINUX_TYPES_H
				  #include <linux/types.h>
				  #endif
				 ])
		AC_CHECK_LIB(cap, cap_set_proc)
		;;
	no)
		;;
esac
AC_CHECK_HEADERS(sys/prctl.h)

AC_CHECK_HEADERS(sys/un.h,
ISC_PLATFORM_HAVESYSUNH="#define ISC_PLATFORM_HAVESYSUNH 1"
,
ISC_PLATFORM_HAVESYSUNH="#undef ISC_PLATFORM_HAVESYSUNH"
)
AC_SUBST(ISC_PLATFORM_HAVESYSUNH)

case "$host" in
*-solaris*)
	AC_DEFINE(NEED_SECURE_DIRECTORY, 1,
		  [Define if connect does not honour the permission on the UNIX domain socket.])
	;;
*-sunos*)
	AC_DEFINE(NEED_SECURE_DIRECTORY, 1,
		  [Define if connect does not honour the permission on the UNIX domain socket.])
	;;
esac

#
# Time Zone Stuff
#
AC_CHECK_FUNC(tzset, AC_DEFINE(HAVE_TZSET))

AC_MSG_CHECKING(for optarg declaration)
AC_TRY_COMPILE([
#include <unistd.h>
],
[optarg = 0;],
[AC_MSG_RESULT(yes)],
[AC_MSG_RESULT(no)
GEN_NEED_OPTARG="-DNEED_OPTARG=1"
AC_DEFINE(NEED_OPTARG, 1, [Defined if extern char *optarg is not declared.])])

#
# Check for nanoseconds in file stats
#
AC_MSG_CHECKING(st_mtim.tv_nsec)
AC_TRY_COMPILE([#include <sys/fcntl.h>],[struct stat s; return(s.st_mtim.tv_nsec);],
	[AC_MSG_RESULT(yes)
	ISC_PLATFORM_HAVESTATNSEC="#define ISC_PLATFORM_HAVESTATNSEC 1"],
	[AC_MSG_RESULT(no)
	ISC_PLATFORM_HAVESTATNSEC="#undef ISC_PLATFORM_HAVESTATNSEC"])
AC_SUBST(ISC_PLATFORM_HAVESTATNSEC)

#
# BSD/OS, and perhaps some others, don't define rlim_t.
#
AC_MSG_CHECKING(for type rlim_t)
AC_TRY_COMPILE([
#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>],
[rlim_t rl = 19671212; return (0);],
[AC_MSG_RESULT(yes)
 ISC_PLATFORM_RLIMITTYPE="#define ISC_PLATFORM_RLIMITTYPE rlim_t"],
[AC_MSG_RESULT(no)

AC_MSG_CHECKING(type of rlim_cur)
AC_TRY_RUN([
#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>
main() { struct rlimit r; exit(!(sizeof(r.rlim_cur) == sizeof(int)));}],
[AC_MSG_RESULT(int)
ISC_PLATFORM_RLIMITTYPE="#define ISC_PLATFORM_RLIMITTYPE int"],
[
AC_TRY_RUN([
#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>
main() { struct rlimit r; exit(!(sizeof(r.rlim_cur) == sizeof(long int)));}],
[AC_MSG_RESULT(long int)
ISC_PLATFORM_RLIMITTYPE="#define ISC_PLATFORM_RLIMITTYPE long int"],
[
AC_TRY_RUN([
#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>
main() { struct rlimit r; exit((!sizeof(r.rlim_cur) == sizeof(long long int)));}],
[AC_MSG_RESULT(long long int)
ISC_PLATFORM_RLIMITTYPE="#define ISC_PLATFORM_RLIMITTYPE long long int"],
[AC_MSG_ERROR([unable to determine sizeof rlim_cur])
],[AC_MSG_ERROR(this cannot happen)])
],[AC_MSG_ERROR(this cannot happen)])
],[
AC_ARG_WITH(rlimtype, , rlimtype="$withval", rlimtype="long long int")
ISC_PLATFORM_RLIMITTYPE="#define ISC_PLATFORM_RLIMITTYPE $rlimtype"
AC_MSG_RESULT(cannot determine type of rlim_cur when cross compiling - assuming $rlimtype)])
])
AC_SUBST(ISC_PLATFORM_RLIMITTYPE)

#
# Older HP-UX doesn't have gettune
#
case "$host" in
	*-hp-hpux*)
		AC_CHECK_HEADERS(sys/dyntune.h)
		;;
	*)
		;;
esac


#
# Compaq TruCluster requires more code for handling cluster IP aliases
#
case "$host" in
	*-dec-osf*)
		AC_CHECK_LIB(clua, clua_getaliasaddress, LIBS="-lclua $LIBS")
		AC_CHECK_FUNC(clua_getaliasaddress,
				AC_DEFINE(HAVE_TRUCLUSTER, 1,
					[Define if running under Compaq TruCluster]))
		;;
	*)
		;;
esac

#
# Some hosts need msg_namelen to match the size of the socket structure.
# Some hosts don't set msg_namelen appropriately on return from recvmsg().
#
case $host in
*os2*|*hp-mpeix*)
	AC_DEFINE(BROKEN_RECVMSG, 1,
		  [Define if recvmsg() does not meet all of the BSD socket API specifications.])
	;;
esac

#
# Microsoft has their own way of handling shared libraries that requires
# additional qualifiers on extern variables.  Unix systems don't need it.
#
AC_SUBST(ISC_PLATFORM_USEDECLSPEC)
ISC_PLATFORM_USEDECLSPEC="#undef ISC_PLATFORM_USEDECLSPEC"
AC_SUBST(LWRES_PLATFORM_USEDECLSPEC)
LWRES_PLATFORM_USEDECLSPEC="#undef LWRES_PLATFORM_USEDECLSPEC"
AC_SUBST(IRS_PLATFORM_USEDECLSPEC)
IRS_PLATFORM_USEDECLSPEC="#undef IRS_PLATFORM_USEDECLSPEC"

#
# Random remaining OS-specific issues involving compiler warnings.
# XXXDCL print messages to indicate some compensation is being done?
#
AC_SUBST(ISC_PLATFORM_BRACEPTHREADONCEINIT)
ISC_PLATFORM_BRACEPTHREADONCEINIT="#undef ISC_PLATFORM_BRACEPTHREADONCEINIT"

case "$host" in
	*-aix5.[[123]].*)
		hack_shutup_pthreadonceinit=yes
		;;
	*-bsdi3.1*)
		hack_shutup_sputaux=yes
		;;
	*-bsdi4.0*)
		hack_shutup_sigwait=yes
		hack_shutup_sputaux=yes
		;;
	[*-bsdi4.[12]*])
		hack_shutup_stdargcast=yes
		;;
	[*-solaris2.[89]])
		hack_shutup_pthreadonceinit=yes
		;;
	*-solaris2.1[[0-9]])
		AC_TRY_COMPILE([ #include <pthread.h> ], [ static pthread_once_t once_test = { PTHREAD_ONCE_INIT }; ], [hack_shutup_pthreadonceinit=yes], )
		;;
esac

case "$hack_shutup_pthreadonceinit" in
	yes)
		#
		# Shut up PTHREAD_ONCE_INIT unbraced initializer warnings.
		#
		ISC_PLATFORM_BRACEPTHREADONCEINIT="#define ISC_PLATFORM_BRACEPTHREADONCEINIT 1"
		;;
esac

case "$hack_shutup_sigwait" in
	yes)
		#
		# Shut up a -Wmissing-prototypes warning for sigwait().
		#
		AC_DEFINE(SHUTUP_SIGWAIT)
		;;
esac

case "$hack_shutup_sputaux" in
	yes)
		#
		# Shut up a -Wmissing-prototypes warning from <stdio.h>.
		#
		AC_DEFINE(SHUTUP_SPUTAUX)
		;;
esac

case "$hack_shutup_stdargcast" in
	yes)
		#
		# Shut up a -Wcast-qual warning from va_start().
		#
		AC_DEFINE(SHUTUP_STDARG_CAST)
		;;
esac

AC_CHECK_HEADERS(strings.h,
  ISC_PLATFORM_HAVESTRINGSH="#define ISC_PLATFORM_HAVESTRINGSH 1"
,
  ISC_PLATFORM_HAVESTRINGSH="#undef ISC_PLATFORM_HAVESTRINGSH"
)
AC_SUBST(ISC_PLATFORM_HAVESTRINGSH)

#
# Check for if_nametoindex() for IPv6 scoped addresses support
#
AC_CHECK_FUNC(if_nametoindex, ac_cv_have_if_nametoindex=yes,
		ac_cv_have_if_nametoindex=no)
case $ac_cv_have_if_nametoindex in
no)
	case "$host" in
	*-hp-hpux*)
		AC_CHECK_LIB(ipv6, if_nametoindex,
				ac_cv_have_if_nametoindex=yes
				LIBS="-lipv6 $LIBS",)
	;;
	esac
esac
case $ac_cv_have_if_nametoindex in
yes)
	ISC_PLATFORM_HAVEIFNAMETOINDEX="#define ISC_PLATFORM_HAVEIFNAMETOINDEX 1"
	AC_DEFINE(HAVE_IF_NAMETOINDEX, 1,
	[Define to 1 if you have the if_nametoindex function.])
	;;
*)
	ISC_PLATFORM_HAVEIFNAMETOINDEX="#undef ISC_PLATFORM_HAVEIFNAMETOINDEX"
	;;
esac
AC_SUBST(ISC_PLATFORM_HAVEIFNAMETOINDEX)

AC_CHECK_FUNCS(nanosleep usleep explicit_bzero)

#
# Machine architecture dependent features
#
have_stdatomic=no
AC_MSG_CHECKING(for usable stdatomic.h)
AC_TRY_COMPILE([
#include <stdio.h>
#include <stdatomic.h>
],
[
  #if ATOMIC_INT_LOCK_FREE == 2 && ATOMIC_LONG_LOCK_FREE == 2
  atomic_int_fast32_t val = 0; atomic_fetch_add_explicit(&val, 1, memory_order_relaxed);
  #else
  #error stdatomic not lock free
  #endif
],
        [AC_MSG_RESULT(yes)
	 have_stdatomic=yes
	 ISC_PLATFORM_HAVESTDATOMIC="#define ISC_PLATFORM_HAVESTDATOMIC 1"],
	[AC_MSG_RESULT(no)
	 have_stdatomic=no
	 ISC_PLATFORM_HAVESTDATOMIC="#undef ISC_PLATFORM_HAVESTDATOMIC"])

AC_ARG_ENABLE(atomic,
	      AS_HELP_STRING([--enable-atomic],
			     [enable machine specific atomic operations [default=autodetect]]),
			enable_atomic="$enableval",
			enable_atomic="autodetect")
case "$enable_atomic" in
	yes|''|autodetect)
		case "$host" in
		powerpc-ibm-aix*)
			if test "X$GCC" = "Xyes"; then
				AC_MSG_CHECKING([if asm("ics"); works])
				AC_TRY_COMPILE(,[
				main() { asm("ics"); exit(0); }
				],
				[AC_MSG_RESULT(yes)
				 use_atomic=yes],
				[
				saved_cflags="$CFLAGS"
				CFLAGS="$CFLAGS -Wa,-many"
				AC_TRY_RUN([
				main() { asm("ics"); exit(0); }
				],
				[AC_MSG_RESULT([yes, required -Wa,-many])
				 use_atomic=yes],
				[AC_MSG_RESULT([no, use_atomic disabled])
				 CFLAGS="$saved_cflags"
				 use_atomic=no],
				[AC_MSG_RESULT([cross compile, assume yes])
				 CFLAGS="$saved_cflags"
				 use_atomic=yes])
				]
				)
			else
				use_atomic=yes
			fi
			;;
		*)
			use_atomic=yes
			;;
		esac
		;;
	no)
		have_stdatomic=no
		ISC_PLATFORM_HAVESTDATOMIC="#undef ISC_PLATFORM_HAVESTDATOMIC"
		use_atomic=no
		arch=noatomic
		;;
esac

if test "X$have_stdatomic" = "Xyes"; then
    AC_MSG_CHECKING(if -latomic is needed to use 64-bit stdatomic.h primitives)
    AC_LINK_IFELSE(
	[AC_LANG_PROGRAM([#include <stdatomic.h>],
			 [atomic_int_fast64_t val = 0; atomic_fetch_add_explicit(&val, 1, memory_order_relaxed);])],
	[AC_MSG_RESULT(no)
	 ISC_ATOMIC_LIBS=""],
	[AC_MSG_RESULT(yes)
	 ISC_ATOMIC_LIBS="-latomic"]
    )
    LIBS="$LIBS $ISC_ATOMIC_LIBS"
fi

AC_SUBST(ISC_PLATFORM_HAVESTDATOMIC)

ISC_PLATFORM_USEOSFASM="#undef ISC_PLATFORM_USEOSFASM"
ISC_PLATFORM_USEGCCASM="#undef ISC_PLATFORM_USEGCCASM"
ISC_PLATFORM_USESTDASM="#undef ISC_PLATFORM_USESTDASM"
ISC_PLATFORM_USEMACASM="#undef ISC_PLATFORM_USEMACASM"
if test "yes" = "$use_atomic"; then
	have_atomic=yes		# set default
	case "$host" in
	[i[3456]86-*])
		# XXX: some old x86 architectures actually do not support
		#      (some of) these operations.  Do we need stricter checks?
		AC_CHECK_SIZEOF([void *])
		if test $ac_cv_sizeof_void_p = 8; then
			arch=x86_64
			have_xaddq=yes
		else
			arch=x86_32
		fi
	;;
	x86_64-*|amd64-*)
		AC_CHECK_SIZEOF([void *])
		if test $ac_cv_sizeof_void_p = 8; then
			arch=x86_64
			have_xaddq=yes
		else
			arch=x86_32
		fi
	;;
	alpha*-*)
		arch=alpha
	;;
	powerpc-*|powerpc64-*)
		arch=powerpc
	;;
	mips-*|mipsel-*|mips64-*|mips64el-*)
		arch=mips
	;;
	ia64-*)
		arch=ia64
	;;
	*)
		have_atomic=no
		arch=noatomic
	;;
	esac
	AC_MSG_CHECKING([architecture type for atomic operations])
	AC_MSG_RESULT($arch)
fi

if test "yes" = "$have_atomic"; then
	AC_MSG_CHECKING([compiler support for inline assembly code])

	compiler=generic
	# Check whether the compiler supports the assembly syntax we provide.
	if test "X$GCC" = "Xyes"; then
		# GCC's ASM extension always works
		compiler=gcc
		if test $arch = "x86_64"; then
			# We can share the same code for gcc with x86_32
			arch=x86_32
		fi
		if test $arch = "powerpc"; then
			#
			# The MacOS (and maybe others) uses "r0" for register
			# zero. Under linux/ibm it is "0" for register 0.
			# Probe to see if we have a MacOS style assembler.
			#
			AC_MSG_CHECKING([Checking for MacOS style assembler syntax])
			AC_TRY_COMPILE(, [
			__asm__ volatile ("li r0, 0x0\n"::);
			], [
			AC_MSG_RESULT(yes)
			compiler="mac"
			ISC_PLATFORM_USEMACASM="#define ISC_PLATFORM_USEMACASM 1"
			], [AC_MSG_RESULT(no)])
		fi
	else
		case "$host" in
		alpha*-dec-osf*)
			# Tru64 compiler has its own syntax for inline
			# assembly.
			AC_TRY_COMPILE(, [
#ifndef __DECC
#error "unexpected compiler"
#endif
				return (0);],
				[compiler=osf],)
		;;
		powerpc-ibm-aix*)
			compiler=aix
		;;
		esac
	fi
	case "$compiler" in
	gcc)
		ISC_PLATFORM_USEGCCASM="#define ISC_PLATFORM_USEGCCASM 1"
		;;
	osf)
		ISC_PLATFORM_USEOSFASM="#define ISC_PLATFORM_USEOSFASM 1"
		;;
	aix)
		;;
	mac)
		;;
	*)
		# See if the generic __asm function works.  If not,
		# we need to disable the atomic operations.
		AC_TRY_LINK(, [
					__asm("nop")
				],
		[compiler="standard"
		ISC_PLATFORM_USESTDASM="#define ISC_PLATFORM_USESTDASM 1"],
		[compiler="not supported (atomic operations disabled)"
		have_atomic=no
		arch=noatomic ]);
		;;
	esac

	AC_MSG_RESULT($compiler)
fi

if test "yes" = "$have_atomic"; then
	ISC_PLATFORM_HAVEXADD="#define ISC_PLATFORM_HAVEXADD 1"
	ISC_PLATFORM_HAVECMPXCHG="#define ISC_PLATFORM_HAVECMPXCHG 1"
	ISC_PLATFORM_HAVEATOMICSTORE="#define ISC_PLATFORM_HAVEATOMICSTORE 1"
	if test "yes" = "$have_xaddq"; then
		ISC_PLATFORM_HAVEXADDQ="#define ISC_PLATFORM_HAVEXADDQ 1"
		ISC_PLATFORM_HAVEATOMICSTOREQ="#define ISC_PLATFORM_HAVEATOMICSTOREQ 1"
	else
		ISC_PLATFORM_HAVEXADDQ="#undef ISC_PLATFORM_HAVEXADDQ"
		ISC_PLATFORM_HAVEATOMICSTOREQ="#undef ISC_PLATFORM_HAVEATOMICSTOREQ"
	fi
else
	ISC_PLATFORM_HAVEXADD="#undef ISC_PLATFORM_HAVEXADD"
	ISC_PLATFORM_HAVECMPXCHG="#undef ISC_PLATFORM_HAVECMPXCHG"
	ISC_PLATFORM_HAVEATOMICSTORE="#undef ISC_PLATFORM_HAVEATOMICSTORE"
	ISC_PLATFORM_HAVEXADDQ="#undef ISC_PLATFORM_HAVEXADDQ"
	ISC_PLATFORM_HAVEATOMICSTOREQ="#undef ISC_PLATFORM_HAVEATOMICSTOREQ"
fi

AC_SUBST(ISC_PLATFORM_HAVEXADD)
AC_SUBST(ISC_PLATFORM_HAVEXADDQ)
AC_SUBST(ISC_PLATFORM_HAVECMPXCHG)
AC_SUBST(ISC_PLATFORM_HAVEATOMICSTORE)
AC_SUBST(ISC_PLATFORM_HAVEATOMICSTOREQ)

AC_SUBST(ISC_PLATFORM_USEGCCASM)
AC_SUBST(ISC_PLATFORM_USEOSFASM)
AC_SUBST(ISC_PLATFORM_USESTDASM)
AC_SUBST(ISC_PLATFORM_USEMACASM)

ISC_ARCH_DIR=$arch
AC_SUBST(ISC_ARCH_DIR)

#
# Check for __builtin_unreachable
#
AC_MSG_CHECKING([compiler support for __builtin_unreachable()])
AC_LINK_IFELSE(
  [AC_LANG_PROGRAM(
     [[]],
     [[__builtin_unreachable();]]
   )],
  [AC_MSG_RESULT([yes])
   AC_DEFINE([HAVE_BUILTIN_UNREACHABLE], [1], [define if the compiler supports __builtin_unreachable().])
  ],
  [AC_MSG_RESULT([no])
  ])

#
# Check for __builtin_expect
#
AC_MSG_CHECKING([compiler support for __builtin_expect])
AC_TRY_LINK(, [
	return (__builtin_expect(1, 1) ? 1 : 0);
], [
	have_builtin_expect=yes
	AC_MSG_RESULT(yes)
], [
	have_builtin_expect=no
	AC_MSG_RESULT(no)
])
if test "yes" = "$have_builtin_expect"; then
	AC_DEFINE(HAVE_BUILTIN_EXPECT, 1, [Define to 1 if the compiler supports __builtin_expect.])
fi

#
# Check for __builtin_clz
#
AC_MSG_CHECKING([compiler support for __builtin_clz])
AC_TRY_LINK(, [
	return (__builtin_clz(0xff) == 24 ? 1 : 0);
], [
	have_builtin_clz=yes
	AC_MSG_RESULT(yes)
], [
	have_builtin_clz=no
	AC_MSG_RESULT(no)
])
if test "yes" = "$have_builtin_clz"; then
	AC_DEFINE(HAVE_BUILTIN_CLZ, 1, [Define to 1 if the compiler supports __builtin_clz.])
fi

#
# CPU relax (for spin locks)
#
if $use_threads
then
	case "$host" in
	[i[3456]86-*])
		# x86_32
		AC_MSG_CHECKING([if asm("rep; nop"); works])
		AC_TRY_COMPILE(,[asm("rep; nop");],
		[AC_MSG_RESULT(yes)
		 ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"rep; nop\")"],
		[AC_MSG_RESULT(no)],
		[AC_MSG_RESULT([cross compile, assume yes])
		 ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"rep; nop\")"])
		;;
	x86_64-*|amd64-*)
		# x86_64
		AC_MSG_CHECKING([if asm("rep; nop"); works])
		AC_TRY_COMPILE(,[asm("rep; nop");],
		[AC_MSG_RESULT(yes)
		 ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"rep; nop\")"],
		[AC_MSG_RESULT(no)],
		[AC_MSG_RESULT([cross compile, assume yes])
		 ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"rep; nop\")"])
		;;
	ia64-*)
		# ia64
		AC_MSG_CHECKING([if asm("hint @pause"); works])
		AC_TRY_COMPILE(,[asm("hint @pause");],
		[AC_MSG_RESULT(yes)
		 ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"hint @pause\")"],
		[AC_MSG_RESULT(no)],
		[AC_MSG_RESULT([cross compile, assume yes])
		 ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"hint @pause\")"])
		;;
	sparc-*)
		# sparc
		AC_MSG_CHECKING([if cpu_relax(); or __cpu_relax(); works])
		AC_CHECK_FUNC(cpu_relax,
		[AC_MSG_RESULT(yes)
		 ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP cpu_relax()"],
		 [AC_CHECK_FUNC(__cpu_relax,
		  [AC_MSG_RESULT(yes)
		   ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP __cpu_relax()"],
		   [AC_MSG_RESULT(no)])])
		;;
	esac
fi

AC_SUBST(ISC_PLATFORM_BUSYWAITNOP)

#
# Activate "rrset-order fixed" or not?
#
AC_ARG_ENABLE(fixed-rrset,
	      AS_HELP_STRING([--enable-fixed-rrset],
			     [enable fixed rrset ordering [default=no]]),
	      enable_fixed="$enableval", enable_fixed="no")
case "$enable_fixed" in
	yes)
		AC_DEFINE(DNS_RDATASET_FIXED, 1,
			  [Define to enable "rrset-order fixed" syntax.])
		;;
	no)
		;;
	*)
		;;
esac

#
# Enable response policy rewriting using NS IP addresses
#
AC_ARG_ENABLE(rpz-nsip,
	      AS_HELP_STRING([--disable-rpz-nsip],
			     [disable rpz nsip rules [default=enabled]]),
	      enable_nsip="$enableval", enable_nsip="yes")
case "$enable_nsip" in
	yes)
		AC_DEFINE(ENABLE_RPZ_NSIP, 1,
			  [Define to enable rpz-nsip rules.])
		;;
	no)
		;;
	*)
		;;
esac

#
# Enable response policy rewriting using NS name
#
AC_ARG_ENABLE(rpz-nsdname,
	      AS_HELP_STRING([--disable-rpz-nsdname],
			     [disable rpz nsdname rules [default=enabled]]),
	      enable_nsdname="$enableval", enable_nsdname="yes")
case "$enable_nsdname" in
	yes)
		AC_DEFINE(ENABLE_RPZ_NSDNAME, 1,
			  [Define to enable rpz-nsdname rules.])
		;;
	no)
		;;
	*)
		;;
esac

#
# Activate "filter-aaaa-on-v4/v6" or not?
#
AC_ARG_ENABLE(filter-aaaa,
	[  --enable-filter-aaaa    enable filtering of AAAA records [[default=no]]],
			enable_filter="$enableval",
			enable_filter="no")
case "$enable_filter" in
	yes)
		AC_DEFINE(ALLOW_FILTER_AAAA, 1,
			  [Define to enable the "filter-aaaa-on-v4" and "filter-aaaa-on-v6" options.])
		;;
	no)
		;;
	*)
		;;
esac

#
# Activate dnstap?
#
AC_ARG_ENABLE(dnstap,
	      AS_HELP_STRING([--enable-dnstap],
			     [enable dnstap support
				(requires fstrm, protobuf-c)]),
	      use_dnstap=$enableval, use_dnstap=no)

DNSTAP=
DNSTAPSRCS=
DNSTAPOBJS=
DNSTAPTARGETS=
DNSTAP_PB_C_H=
if test "x$use_dnstap" != "xno"; then
	if ! $use_threads; then
		AC_MSG_ERROR([Dnstap requires threads.])
	fi
	AC_ARG_WITH([protobuf-c],
		    AS_HELP_STRING([--with-protobuf-c=path],
				   [Path where protobuf-c is installed,
					for dnstap]), [
	    # workaround for protobuf-c includes at old dir
	    # before protobuf-c-1.0.0
	    if test -f $withval/include/google/protobuf-c/protobuf-c.h
	    then
		CFLAGS="$CFLAGS -I$withval/include/google"
	    else
		CFLAGS="$CFLAGS -I$withval/include"
	    fi
	    LDFLAGS="$LDFLAGS -L$withval/lib"
	    AC_PATH_PROG([PROTOC_C], [protoc-c], [],
			 [$PATH$PATH_SEPARATOR$withval/bin])
	], [
	    # workaround for protobuf-c includes at old dir
	    # before protobuf-c-1.0.0
	    if test -f /usr/include/google/protobuf-c/protobuf-c.h
	    then
		CFLAGS="$CFLAGS -I/usr/include/google"
	    else
		if test -f /usr/local/include/google/protobuf-c/protobuf-c.h
		then
		    CFLAGS="$CFLAGS -I/usr/local/include/google"
		    LDFLAGS="$LDFLAGS -L/usr/local/lib"
		fi
	    fi
	    AC_PATH_PROG([PROTOC_C],[protoc-c])
	])
	if test -z "$PROTOC_C"; then
		AC_MSG_ERROR([The protoc-c program was not found.])
	fi
	AC_ARG_WITH([libfstrm], AS_HELP_STRING([--with-libfstrm=path],
		    [Path where libfstrm is installed, for dnstap]), [
	    CFLAGS="$CFLAGS -I$withval/include"
	    LDFLAGS="$LDFLAGS -L$withval/lib"
	    AC_PATH_PROG([FSTRM_CAPTURE], [fstrm_capture], [], [$PATH$PATH_SEPARATOR$withval/bin])
	],[
	    AC_PATH_PROG([FSTRM_CAPTURE], [fstrm_capture])
	])

	AC_SEARCH_LIBS([fstrm_iothr_init], [fstrm], [],
		       AC_MSG_ERROR([The fstrm library was not found. Please install fstrm!]))
	AC_SEARCH_LIBS([protobuf_c_message_pack], [protobuf-c], [],
		       AC_MSG_ERROR([The protobuf-c library was not found. Please install protobuf-c!]))

	AC_DEFINE(HAVE_DNSTAP, 1, [Define to 1 to enable dnstap support])
	DNSTAP=dnstap
	DNSTAPSRCS='${DNSTAPSRCS}'
	DNSTAPOBJS='${DNSTAPOBJS}'
	DNSTAPTARGETS='${DNSTAPTARGETS}'
	DNSTAP_PB_C_H="dnstap.pb-c.h"
fi
AC_SUBST(DNSTAP)
AC_SUBST(DNSTAPSRCS)
AC_SUBST(DNSTAPOBJS)
AC_SUBST(DNSTAPTARGETS)
AC_SUBST(DNSTAP_PB_C_H)

#
#  The following sets up how non-blocking i/o is established.
#  Sunos, cygwin and solaris 2.x (x<5) require special handling.
#
case "$host" in
*-sunos*) AC_DEFINE(PORT_NONBLOCK, O_NDELAY);;
*-cygwin*) AC_DEFINE(PORT_NONBLOCK, O_NDELAY);;
*-solaris2.[[01234]])
	AC_DEFINE(PORT_NONBLOCK, O_NONBLOCK)
	AC_DEFINE(USE_FIONBIO_IOCTL, 1,
		  [Defined if you need to use ioctl(FIONBIO) instead a fcntl call to make non-blocking.])
	;;
*) AC_DEFINE(PORT_NONBLOCK, O_NONBLOCK,
	     [Sets which flag to pass to open/fcntl to make non-blocking (O_NDELAY/O_NONBLOCK).])
	;;
esac
#
# Solaris 2.5.1 and earlier cannot bind() then connect() a TCP socket.
# This prevents the source address being set.
#
case "$host" in
*-solaris2.[[012345]]|*-solaris2.5.1)
	AC_DEFINE(BROKEN_TCP_BIND_BEFORE_CONNECT, 1,
		  [Define if you cannot bind() before connect() for TCP sockets.])
	;;
esac
#
# The following sections deal with tools used for formatting
# the documentation.  They are all optional, unless you are
# a developer editing the documentation source.
#

#
# Look for TeX.
#

AC_PATH_PROGS(LATEX, latex, latex)
AC_SUBST(LATEX)

AC_PATH_PROGS(PDFLATEX, pdflatex, pdflatex)
AC_SUBST(PDFLATEX)

AC_PATH_PROGS(DBLATEX, dblatex, dblatex)
AC_SUBST(DBLATEX)

#
# Look for w3m
#

AC_PATH_PROGS(W3M, w3m, w3m)
AC_SUBST(W3M)

#
# Look for pandoc
#
AC_PATH_PROG(PANDOC, pandoc, pandoc)
AC_SUBST(PANDOC)


#
# Look for xsltproc (libxslt)
#

AC_PATH_PROG(XSLTPROC, xsltproc, xsltproc)
AC_SUBST(XSLTPROC)

#
# Look for xmllint (libxml2)
#

AC_PATH_PROG(XMLLINT, xmllint, xmllint)
AC_SUBST(XMLLINT)

#
# Look for Doxygen
#

AC_PATH_PROG(DOXYGEN, doxygen, doxygen)
AC_SUBST(DOXYGEN)

#
# Look for curl
#

AC_PATH_PROG(CURL, curl, curl)
AC_SUBST(CURL)

#
# Subroutine for searching for an ordinary file (e.g., a stylesheet)
# in a number of directories:
#
#   NOM_PATH_FILE(VARIABLE, FILENAME, DIRECTORIES)
#
# If the file FILENAME is found in one of the DIRECTORIES, the shell
# variable VARIABLE is defined to its absolute pathname.  Otherwise,
# it is set to FILENAME, with no directory prefix (that's not terribly
# useful, but looks less confusing in substitutions than leaving it
# empty).  The variable VARIABLE will be substituted into output files.
#

AC_DEFUN([NOM_PATH_FILE], [
$1=""
AC_MSG_CHECKING(for $2)
for d in $3
do
	f=$d/$2
	if test -f $f
	then
		$1=$f
		AC_MSG_RESULT($f)
		break
	fi
done
if test "X[$]$1" = "X"
then
	AC_MSG_RESULT("not found");
	$1=$2
fi
AC_SUBST($1)
])

#
# Look for Docbook-XSL stylesheets.  Location probably varies by system.
# If it's not explicitly specified, guess where it might be found, based on
# where SGML stuff lives on some systems (FreeBSD is the only one we're sure
# of at the moment).
#
AC_MSG_CHECKING(for Docbook-XSL path)
AC_ARG_WITH(docbook-xsl,
	    AS_HELP_STRING([--with-docbook-xsl[=PATH]],
			   [specify path for Docbook-XSL stylesheets]),
   docbook_path="$withval", docbook_path="auto")
case "$docbook_path" in
auto)
	AC_MSG_RESULT(auto)
	docbook_xsl_trees="/usr/pkg/share/xsl/docbook /usr/local/share/xsl/docbook-ns /usr/local/share/xsl/docbook /usr/share/xsl/docbook /opt/local/share/xsl/docbook-xsl /opt/local/share/xsl/docbook-xsl-nons /usr/share/xml/docbook/stylesheet/docbook-xsl"
	;;
*)
	docbook_xsl_trees="$withval"
	AC_MSG_RESULT($docbook_xsl_trees)
	;;
esac

#
# Look for stylesheets we need.
#

NOM_PATH_FILE(XSLT_DOCBOOK_STYLE_HTML, html/docbook.xsl, $docbook_xsl_trees)
NOM_PATH_FILE(XSLT_DOCBOOK_STYLE_XHTML, xhtml/docbook.xsl, $docbook_xsl_trees)
NOM_PATH_FILE(XSLT_DOCBOOK_STYLE_MAN, manpages/docbook.xsl, $docbook_xsl_trees)
NOM_PATH_FILE(XSLT_DOCBOOK_CHUNK_HTML, html/chunk.xsl, $docbook_xsl_trees)
NOM_PATH_FILE(XSLT_DOCBOOK_CHUNK_XHTML, xhtml/chunk.xsl, $docbook_xsl_trees)
NOM_PATH_FILE(XSLT_DOCBOOK_CHUNKTOC_HTML, html/chunktoc.xsl, $docbook_xsl_trees)
NOM_PATH_FILE(XSLT_DOCBOOK_CHUNKTOC_XHTML, xhtml/chunktoc.xsl, $docbook_xsl_trees)
NOM_PATH_FILE(XSLT_DOCBOOK_MAKETOC_HTML, html/maketoc.xsl, $docbook_xsl_trees)
NOM_PATH_FILE(XSLT_DOCBOOK_MAKETOC_XHTML, xhtml/maketoc.xsl, $docbook_xsl_trees)

#
# Same dance for dblatex
#
dblatex_xsl_trees="/usr/local/share/xml/docbook/stylesheet/dblatex /usr/pkg/share/xml/docbook/stylesheet/dblatex /usr/share/xml/docbook/stylesheet/dblatex"
NOM_PATH_FILE(XSLT_DBLATEX_STYLE, xsl/docbook.xsl, $dblatex_xsl_trees)
NOM_PATH_FILE(XSLT_DBLATEX_FASTBOOK, xsl/latex_book_fast.xsl, $dblatex_xsl_trees)

#
# IDN support using idnkit
#
AC_ARG_WITH(idnkit,
	    AS_HELP_STRING([--with-idnkit[=PATH]],
			   [enable IDN support using idnkit [yes|no|path]]),
	use_idnkit="$withval", use_idnkit="no")
case "$use_idnkit" in
yes)
	if test X$prefix = XNONE ; then
		idnkit_path=/usr/local
	else
		idnkit_path=$prefix
	fi
	;;
no)
	;;
*)
	idnkit_path="$use_idnkit"
	;;
esac

iconvinc=
iconvlib=
AC_ARG_WITH(libiconv,
	    AS_HELP_STRING([--with-libiconv[=IPREFIX]],
			   [GNU libiconv are in IPREFIX [default PREFIX]]),
	use_libiconv="$withval", use_libiconv="no")
case "$use_libiconv" in
yes)
	if test X$prefix = XNONE ; then
		iconvlib="-L/usr/local/lib -R/usr/local/lib -liconv"
	else
		iconvlib="-L$prefix/lib -R$prefix/lib -liconv"
	fi
	;;
no)
	iconvlib=
	;;
*)
	iconvlib="-L$use_libiconv/lib -R$use_libiconv/lib -liconv"
	;;
esac

AC_ARG_WITH(iconv,
	    AS_HELP_STRING([--with-iconv[=LIBSPEC]],
			   [specify iconv library [default -liconv]]),
	    iconvlib="$withval")
case "$iconvlib" in
no)
	iconvlib=
	;;
yes)
	iconvlib=-liconv
	;;
esac

AC_ARG_WITH(idnlib,
	    AS_HELP_STRING([--with-idnlib=ARG], [specify libidnkit]),
	    idnlib="$withval", idnlib="no")
if test "yes" = "$idnlib"; then
	AC_MSG_ERROR([You must specify ARG for --with-idnlib.])
fi

IDNKIT_LIBS=
if test "no" != "$use_idnkit"; then
	AC_DEFINE(WITH_IDNKIT, 1, [define if idnkit support is to be included.])
	STD_CINCLUDES="$STD_CINCLUDES -I$idnkit_path/include"
	if test "no" != "$idnlib"; then
		IDNKIT_LIBS="$idnlib $iconvlib"
	else
		IDNKIT_LIBS="-L$idnkit_path/lib -lidnkit $iconvlib"
	fi
fi
AC_SUBST(IDNKIT_LIBS)

#
# IDN support using libidn2
#

LIBIDN2_CFLAGS=
LIBIDN2_LDFLAGS=
LIBIDN2_LIBS=
AC_ARG_WITH(libidn2,
	AS_HELP_STRING([--with-libidn2[=PATH]], [enable IDN support using GNU libidn2 [yes|no|path]]),
	use_libidn2="$withval", use_libidn2="no")
AS_CASE([$use_libidn2],
	[no],[:],
	[yes],[:],
	[*],[
	    LIBIDN2_CFLAGS="-I$use_libidn2/include"
	    LIBIDN2_LDFLAGS="-L$use_libidn2/lib"
	])

AS_IF([test "$use_libidn2" != "no"],
      [save_CFLAGS="$CFLAGS"
       save_LIBS="$LIBS"
       save_LDFLAGS="$LDFLAGS"
       CFLAGS="$LIBIDN2_CFLAGS $CFLAGS"
       LDFLAGS="$LIBIDN2_LDFLAGS $LDFLAGS"
       AC_SEARCH_LIBS([idn2_to_ascii_8z], [idn2],
		      [AC_DEFINE(WITH_IDN_SUPPORT, 1, [define if IDN input support is to be included.])
                       AC_DEFINE(WITH_LIBIDN2, 1, [define if libidn2 support is to be included.])
                       LIBIDN2_LIBS="$LIBIDN2_LDFLAGS -lidn2"],
		      [AC_MSG_ERROR([libidn2 requested, but not found])])
       AC_TRY_LINK([#include <idn2.h>],
		   [idn2_to_unicode_8zlz(".", NULL, IDN2_NONTRANSITIONAL|IDN2_NFC_INPUT);],
		   [AC_MSG_RESULT(yes)
		    AC_DEFINE(WITH_IDN_OUT_SUPPORT, 1, [define if IDN output support is to be included.])],
		   [AC_MSG_RESULT([no])])
       CFLAGS="$save_CFLAGS"
       LIBS="$save_LIBS"
       LDFLAGS="$save_LDFLAGS"
      ])
AC_SUBST([LIBIDN2_CFLAGS])
AC_SUBST([LIBIDN2_LIBS])

#
# IDN support in general
#

# check if idnkit and libidn2 are not used at the same time
if test "$use_idnkit" != no && test "$use_libidn2" != no; then
    AC_MSG_ERROR([idnkit and libidn2 cannot be used at the same time.])
fi
# the IDN support is on
if test "$use_idnkit" != no || test "$use_libidn2" != no; then
	AC_DEFINE(WITH_IDN_SUPPORT, 1, [define if IDN input support is to be included.])
	if test "$use_libidn2" = no || test "$use_libidn2_out" != no; then
		AC_DEFINE(WITH_IDN_OUT_SUPPORT, 1, [define if IDN output support is to be included.])
	fi
fi

#
# Check whether to build with cmocka unit testing framework
#

AC_ARG_WITH([cmocka],
	    [AS_HELP_STRING([--with-cmocka=no],[enable cmocka based tests (default is no)])],
	    [:],[with_cmocka=no])

AS_CASE([$with_cmocka],
	[no],[:],
	[yes],[
            PKG_CHECK_MODULES([CMOCKA], [cmocka >= 1.0.0],
			      [AC_DEFINE([HAVE_CMOCKA], [1], [Use cmocka])])
            UNITTESTS=tests
            ],
	[*],[
	    save_CFLAGS="$CFLAGS"
	    save_LIBS="$LIBS"
	    CFLAGS="$CFLAGS -I$with_cmocka/include"
	    LIBS="$LIBS -L$with_cmocka/lib"
	    AC_CHECK_HEADERS([cmocka.h],
			     [:],
			     [AC_MSG_ERROR([cmocka.h not found])],
			     [#include <stdarg.h>
			      #include <stddef.h>
			      #include <setjmp.h>
			     ])
	    AC_SEARCH_LIBS([cmocka_set_message_output],
			   [cmocka],
			   [
			       CMOCKA_CFLAGS="-Iwith_cmocka/include"
			       CMOCKA_LIBS="-L$with_cmocka/lib -lcmocka"
                               UNITTESTS=tests
			       AC_DEFINE([HAVE_CMOCKA], [1], [Use cmocka])
			   ],
			   [AC_MSG_ERROR([cmocka unit testing framework not found in $with_cmocka path])])
	    ])
AC_SUBST([CMOCKA_CFLAGS])
AC_SUBST([CMOCKA_LIBS])
AC_SUBST(UNITTESTS)

#
# Check for kyua execution engine if CMocka was requested
# and bail out if execution engine was not found
#
AC_ARG_VAR([KYUA], [path to kyua execution engine])
AS_IF([test "$with_cmocka" != "no"],
      [AC_PATH_PROGS([KYUA], [kyua], [])
       AS_IF([test -z "$KYUA"],
            [AC_MSG_WARN([kyua test execution engine not found])])])

AC_SUBST([KYUA])

#
# Check for -Wl,--wrap= support
#

save_LDFLAGS=$LDFLAGS
LDFLAGS="--wrap=printf"

LD_WRAP_TESTS=false
enable_ld_wrap=no
AC_MSG_CHECKING([for linker support for --wrap option])
AC_LINK_IFELSE(
    [AC_LANG_PROGRAM([#include <stdio.h>], [__wrap_printf("success"); return (0);])],
    [enable_ld_wrap=yes
     LD_WRAP_TESTS=true
     AC_DEFINE([LD_WRAP], [1], [define if the linker supports --wrap option])
     AC_MSG_RESULT([yes])],
    [AC_MSG_RESULT([no])])
# AM_CONDITIONAL([LD_WRAP], [test $enable_ld_wrap = yes])
AC_SUBST([LD_WRAP_TESTS])

LDFLAGS=$save_LDFLAGS

#
# Check for i18n
#
AC_CHECK_HEADERS(locale.h)
AC_CHECK_FUNCS(setlocale)

#
# was --with-tuning specified?
#
AC_ARG_WITH(tuning,
	    AS_HELP_STRING([--with-tuning=ARG],
			   [Specify server tuning (large or default)]),
	    use_tuning="$withval", use_tuning="no")

case "$use_tuning" in
	large)
		if ! $use_threads; then
			AC_MSG_ERROR([Large-system tuning requires threads.])
		fi
		AC_DEFINE(TUNE_LARGE, 1, [Define to use large-system tuning.])
		AC_MSG_RESULT(using large-system tuning)
		;;
	no|default)
		AC_MSG_RESULT(using default tuning)
		;;
	yes|*)
		AC_MSG_ERROR([You must specify "large" or "default" for --with-tuning.])
		;;
esac

#
# was --enable-querytrace specified?
#
AC_ARG_ENABLE(querytrace,
	      AS_HELP_STRING([--enable-querytrace],
			     [enable very verbose query trace logging
				[default=no]]),
	      want_querytrace="$enableval", want_querytrace="no")

AC_MSG_CHECKING([whether to enable query trace logging])
case "$want_querytrace" in
yes)
	AC_MSG_RESULT(yes)
	AC_DEFINE(WANT_QUERYTRACE, 1, [Define to enable very verbose query trace logging.])
	;;
no)
	AC_MSG_RESULT(no)
	;;
*)
	AC_MSG_ERROR("--enable-querytrace requires yes or no")
	;;
esac

#
# Substitutions
#
AC_SUBST(BIND9_TOP_BUILDDIR)
BIND9_TOP_BUILDDIR=`pwd`

AC_SUBST(BIND9_ISC_BUILDINCLUDE)
AC_SUBST(BIND9_ISCCC_BUILDINCLUDE)
AC_SUBST(BIND9_ISCCFG_BUILDINCLUDE)
AC_SUBST(BIND9_DNS_BUILDINCLUDE)
AC_SUBST(BIND9_LWRES_BUILDINCLUDE)
AC_SUBST(BIND9_BIND9_BUILDINCLUDE)
AC_SUBST(BIND9_IRS_BUILDINCLUDE)
if test "X$srcdir" != "X"; then
	BIND9_ISC_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/isc/include"
	BIND9_ISCCC_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/isccc/include"
	BIND9_ISCCFG_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/isccfg/include"
	BIND9_DNS_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/dns/include"
	BIND9_LWRES_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/lwres/include"
	BIND9_BIND9_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/bind9/include"
	BIND9_IRS_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/irs/include"
else
	BIND9_ISC_BUILDINCLUDE=""
	BIND9_ISCCC_BUILDINCLUDE=""
	BIND9_ISCCFG_BUILDINCLUDE=""
	BIND9_DNS_BUILDINCLUDE=""
	BIND9_LWRES_BUILDINCLUDE=""
	BIND9_BIND9_BUILDINCLUDE=""
	BIND9_IRS_BUILDINCLUDE=""
fi

AC_SUBST_FILE(BIND9_MAKE_INCLUDES)
BIND9_MAKE_INCLUDES=$BIND9_TOP_BUILDDIR/make/includes

AC_SUBST_FILE(BIND9_MAKE_RULES)
BIND9_MAKE_RULES=$BIND9_TOP_BUILDDIR/make/rules

. "$srcdir/version"
BIND9_PRODUCT="PRODUCT=\"${PRODUCT}\""
AC_SUBST(BIND9_PRODUCT)
BIND9_DESCRIPTION="DESCRIPTION=\"${DESCRIPTION}\""
AC_SUBST(BIND9_DESCRIPTION)
BIND9_VERSION="${MAJORVER}.${MINORVER}${PATCHVER:+.}${PATCHVER}${RELEASETYPE}${RELEASEVER}${EXTENSIONS}"
AC_SUBST(BIND9_VERSION)
BIND9_MAJOR="MAJOR=${MAJORVER}.${MINORVER}"
AC_SUBST(BIND9_MAJOR)
BIND9_VERSIONSTRING="${PRODUCT} ${MAJORVER}.${MINORVER}${PATCHVER:+.}${PATCHVER}${RELEASETYPE}${RELEASEVER}${EXTENSIONS}${DESCRIPTION:+ }${DESCRIPTION}"
AC_SUBST(BIND9_VERSIONSTRING)
BIND9_VERSIONSHORT="${PRODUCT} ${MAJORVER}.${MINORVER}${PATCHVER:+.}${PATCHVER}${RELEASETYPE}${RELEASEVER}${EXTENSIONS}"
AC_SUBST(BIND9_VERSIONSHORT)

BIND9_SRCID="SRCID=unset_id"
if test -f "${srcdir}/srcid"; then
	. "${srcdir}/srcid"
	BIND9_SRCID="SRCID=$SRCID"
elif test -d "${srcdir}/.git"; then
	BIND9_SRCID="SRCID="`(cd "${srcdir}";git rev-parse --short HEAD)`
fi

AC_SUBST(BIND9_SRCID)

if test -z "$ac_configure_args"; then
	BIND9_CONFIGARGS="defaults"
else
	for a in $ac_configure_args
	do
		BIND9_CONFIGARGS="$BIND9_CONFIGARGS $a"
	done
fi
BIND9_CONFIGARGS="`echo $BIND9_CONFIGARGS | sed 's/^ //'`"
BIND9_CONFIGARGS="CONFIGARGS=${BIND9_CONFIGARGS}"
AC_SUBST(BIND9_CONFIGARGS)

AC_SUBST_FILE(LIBISC_API)
LIBISC_API="$srcdir/lib/isc/api"

AC_SUBST_FILE(LIBISCCC_API)
LIBISCCC_API="$srcdir/lib/isccc/api"

AC_SUBST_FILE(LIBISCCFG_API)
LIBISCCFG_API="$srcdir/lib/isccfg/api"

AC_SUBST_FILE(LIBDNS_API)
LIBDNS_API="$srcdir/lib/dns/api"

AC_SUBST_FILE(LIBDNS_MAPAPI)
LIBDNS_MAPAPI="$srcdir/lib/dns/mapapi"

AC_SUBST_FILE(LIBBIND9_API)
LIBBIND9_API="$srcdir/lib/bind9/api"

AC_SUBST_FILE(LIBLWRES_API)
LIBLWRES_API="$srcdir/lib/lwres/api"

AC_SUBST_FILE(LIBIRS_API)
LIBIRS_API="$srcdir/lib/irs/api"

#
# 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=""
DLZ_DRIVER_MYSQL_INCLUDES=""
DLZ_DRIVER_MYSQL_LIBS=""

#
# Configure support for building a shared library object
#
# Even when libtool is available it can't always be relied upon
# to build an object that can be dlopen()'ed, but this is necessary
# for building the dlzexternal system test, so we'll try it the
# old-fashioned way.
#
SO="so"
SO_CFLAGS=""
SO_LDFLAGS=""
SO_LD=""
SO_TARGETS=""
SO_STRIP="cat"

AC_ARG_WITH(dlopen,
	    AS_HELP_STRING([--with-dlopen=ARG],
			   [support dynamically loadable DLZ drivers]),
	    dlopen="$withval", dlopen="yes")

case $host in
	*-sunos*) dlopen="no"
		;;
esac

if test "yes" = "$dlopen"; then
	AC_CHECK_LIB(dl, dlopen, have_dl=yes, have_dl=no)
	if test "yes" = "$have_dl"; then
		LIBS="-ldl $LIBS"
	fi
	AC_CHECK_FUNCS(dlopen dlclose dlsym,,dlopen=no)
fi

if test "yes" = "$dlopen"; then
	case $host in
		*-linux*|*-gnu*)
			SO_CFLAGS="-fPIC"
                        LDFLAGS="${LDFLAGS} -Wl,--export-dynamic"
			SO_LDFLAGS=""
			if test "yes" = "$have_dl"
			then
				if test "yes" = "$use_libtool"; then
					SO_LDFLAGS="-Xcompiler -shared"
					SO_LD="${CC}"
				else
					SO_LDFLAGS="-shared"
					SO_LD="${CC}"
				fi
			else
				SO_LDFLAGS="-shared"
				SO_LD="ld"
			fi
			;;
		*-freebsd*|*-openbsd*)
			LDFLAGS="${LDFLAGS} -Wl,-E"
			SO_CFLAGS="-fpic"
			if test "yes" = "$use_libtool"; then
				SO_LDFLAGS="-Xcompiler -shared"
				SO_LD="${CC}"
			else
				SO_LDFLAGS="-shared"
				SO_LD="${CC}"
			fi
			;;
		*-netbsd*)
			SO_CFLAGS="-fpic"
			SO_LDFLAGS="-Bshareable -x"
			SO_LD="ld"
			SO_STRIP="sed -e s/-Wl,//g"
			;;
		*-solaris*)
			SO_CFLAGS="-KPIC"
			SO_LDFLAGS="-G -z text"
			SO_LD="ld"
			;;
		*-hp-hpux*)
			SO=sl
			SO_CFLAGS="+z"
			SO_LDFLAGS="-b +vnocompatwarnings"
			SO_LD="ld"
			;;
		*)
			SO_CFLAGS="-fPIC"
			;;
	esac

	if test "X$GCC" = "Xyes"; then
		SO_CFLAGS="-fPIC"
		if test -z "$SO_LD"
		then
			if test "yes" = "$use_libtool"; then
				SO_LDFLAGS="-Xcompiler -shared"
				SO_LD="${CC}"
			else
				SO_LDFLAGS="-shared"
				SO_LD="${CC}"
			fi
		fi
	fi

	# If we still don't know how to make shared objects, don't make any.
	if test -n "$SO_LD"; then
		SO_TARGETS="\${SO_TARGETS}"
		AC_DEFINE(ISC_DLZ_DLOPEN, 1,
			  [Define to allow building of objects for dlopen().])
	fi
fi
CFLAGS="$CFLAGS $SO_CFLAGS"

AC_SUBST(SO)
AC_SUBST(SO_CFLAGS)
AC_SUBST(SO_LDFLAGS)
AC_SUBST(SO_LD)
AC_SUBST(SO_STRIP)
AC_SUBST(SO_TARGETS)

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(DLZ_DRIVER_MYSQL_INCLUDES)
AC_SUBST(DLZ_DRIVER_MYSQL_LIBS)
AC_SUBST_FILE(DLZ_DRIVER_RULES)

if test "yes" = "$cross_compiling"; then
	if test -z "$BUILD_CC"; then
		AC_MSG_ERROR([BUILD_CC not set])
	fi
	BUILD_CFLAGS="$BUILD_CFLAGS"
	BUILD_CPPFLAGS="$BUILD_CPPFLAGS"
	BUILD_LDFLAGS="$BUILD_LDFLAGS"
	BUILD_LIBS="$BUILD_LIBS"
else
	BUILD_CC="$CC"
	BUILD_CFLAGS="$CFLAGS"
	BUILD_CPPFLAGS="$CPPFLAGS $GEN_NEED_OPTARG"
	BUILD_LDFLAGS="$LDFLAGS"
	BUILD_LIBS="$LIBS"
fi

NEWFLAGS=""
for e in $BUILD_LDFLAGS ; do
    case $e in
	-L*)
	    case $host_os in
		netbsd*)
		    ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'`
		    NEWFLAGS="$NEWFLAGS $e $ee"
		    ;;
		freebsd*)
		    ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'`
		    NEWFLAGS="$NEWFLAGS $e $ee"
		    ;;
		solaris*)
		    ee=`echo $e | sed -e 's%^-L%-R%'`
		    NEWFLAGS="$NEWFLAGS $e $ee"
		    ;;
		*)
		    NEWFLAGS="$NEWFLAGS $e"
		    ;;
		esac
	    ;;
	*)
	    NEWFLAGS="$NEWFLAGS $e"
	    ;;
    esac
done
BUILD_LDFLAGS="$NEWFLAGS"

NEWFLAGS=""
for e in $DNS_GSSAPI_LIBS ; do
    case $e in
	-L*)
	    case $host_os in
		netbsd*)
		    ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'`
		    NEWFLAGS="$NEWFLAGS $e $ee"
		    ;;
		freebsd*)
		    ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'`
		    NEWFLAGS="$NEWFLAGS $e $ee"
		    ;;
		solaris*)
		    ee=`echo $e | sed -e 's%^-L%-R%'`
		    NEWFLAGS="$NEWFLAGS $e $ee"
		    ;;
		*)
		    NEWFLAGS="$NEWFLAGS $e"
		    ;;
		esac
	    ;;
	*)
	    NEWFLAGS="$NEWFLAGS $e"
	    ;;
    esac
done
DNS_GSSAPI_LIBS="$NEWFLAGS"

NEWFLAGS=""
for e in $ISC_OPENSSL_LIBS ; do
    case $e in
	-L*)
	    case $host_os in
		netbsd*)
		    ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'`
		    NEWFLAGS="$NEWFLAGS $e $ee"
		    ;;
		freebsd*)
		    ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'`
		    NEWFLAGS="$NEWFLAGS $e $ee"
		    ;;
		solaris*)
		    ee=`echo $e | sed -e 's%^-L%-R%'`
		    NEWFLAGS="$NEWFLAGS $e $ee"
		    ;;
		*)
		    NEWFLAGS="$NEWFLAGS $e"
		    ;;
		esac
	    ;;
	*)
	    NEWFLAGS="$NEWFLAGS $e"
	    ;;
    esac
done
ISC_OPENSSL_LIBS="$NEWFLAGS"

NEWFLAGS=""
for e in $DNS_CRYPTO_LIBS ; do
    case $e in
	-L*)
	    case $host_os in
		netbsd*)
		    ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'`
		    NEWFLAGS="$NEWFLAGS $e $ee"
		    ;;
		freebsd*)
		    ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'`
		    NEWFLAGS="$NEWFLAGS $e $ee"
		    ;;
		solaris*)
		    ee=`echo $e | sed -e 's%^-L%-R%'`
		    NEWFLAGS="$NEWFLAGS $e $ee"
		    ;;
		*)
		    NEWFLAGS="$NEWFLAGS $e"
		    ;;
		esac
	    ;;
	*)
	    NEWFLAGS="$NEWFLAGS $e"
	    ;;
    esac
done
DNS_CRYPTO_LIBS="$NEWFLAGS"

AC_SUBST(BUILD_CC)
AC_SUBST(BUILD_CFLAGS)
AC_SUBST(BUILD_CPPFLAGS)
AC_SUBST(BUILD_LDFLAGS)
AC_SUBST(BUILD_LIBS)

#
# Commands to run at the end of config.status.
# Don't just put these into configure, it won't work right if somebody
# runs config.status directly (which autoconf allows).
#

AC_CONFIG_COMMANDS(
	[chmod],
	[chmod a+x isc-config.sh doc/doxygen/doxygen-input-filter])

#
# Files to configure.  These are listed here because we used to
# specify them as arguments to AC_OUTPUT.  It's (now) ok to move these
# elsewhere if there's a good reason for doing so.
#

AC_CONFIG_FILES([
  make/Makefile
  make/mkdep
	Makefile
	bin/Makefile
	bin/check/Makefile
	bin/confgen/Makefile
	bin/confgen/unix/Makefile
	bin/delv/Makefile
	bin/dig/Makefile
	bin/dnssec/Makefile
	bin/named/Makefile
	bin/named/unix/Makefile
	bin/nsupdate/Makefile
	bin/pkcs11/Makefile
	bin/python/Makefile
	bin/python/isc/Makefile
	bin/python/isc/utils.py
	bin/python/isc/tests/Makefile
	bin/python/dnssec-checkds.py
	bin/python/dnssec-coverage.py
	bin/python/dnssec-keymgr.py
	bin/python/isc/__init__.py
	bin/python/isc/checkds.py
	bin/python/isc/coverage.py
	bin/python/isc/dnskey.py
	bin/python/isc/eventlist.py
	bin/python/isc/keydict.py
	bin/python/isc/keyevent.py
	bin/python/isc/keymgr.py
	bin/python/isc/keyseries.py
	bin/python/isc/keyzone.py
	bin/python/isc/policy.py
	bin/python/isc/rndc.py
	bin/python/isc/tests/dnskey_test.py
	bin/python/isc/tests/policy_test.py
	bin/rndc/Makefile
	bin/tests/Makefile
	bin/tests/headerdep_test.sh
	bin/tests/optional/Makefile
	bin/tests/pkcs11/Makefile
	bin/tests/pkcs11/benchmarks/Makefile
	bin/tests/system/Makefile
	bin/tests/system/conf.sh
	bin/tests/system/dlz/prereq.sh
	bin/tests/system/dlzexternal/Makefile
	bin/tests/system/dlzexternal/ns1/dlzs.conf
	bin/tests/system/dyndb/Makefile
	bin/tests/system/dyndb/driver/Makefile
	bin/tests/system/inline/checkdsa.sh
	bin/tests/system/lwresd/Makefile
	bin/tests/system/pipelined/Makefile
	bin/tests/system/rndc/Makefile
	bin/tests/system/rsabigexponent/Makefile
	bin/tests/system/tkey/Makefile
	bin/tests/virtual-time/Makefile
	bin/tests/virtual-time/conf.sh
	bin/tools/Makefile
	contrib/scripts/check-secure-delegation.pl
	contrib/scripts/zone-edit.sh
	doc/Makefile
	doc/arm/Makefile
	doc/arm/noteversion.xml
	doc/arm/pkgversion.xml
	doc/arm/releaseinfo.xml
	doc/doxygen/Doxyfile
	doc/doxygen/Makefile
	doc/doxygen/doxygen-input-filter
	doc/misc/Makefile
	doc/tex/Makefile
	doc/tex/armstyle.sty
	doc/xsl/Makefile
	doc/xsl/isc-docbook-chunk.xsl
	doc/xsl/isc-docbook-html.xsl
	doc/xsl/isc-manpage.xsl
	doc/xsl/isc-notes-html.xsl
	isc-config.sh
	lib/Makefile
	lib/bind9/Makefile
	lib/bind9/include/Makefile
	lib/bind9/include/bind9/Makefile
	lib/dns/Makefile
	lib/dns/include/Makefile
	lib/dns/include/dns/Makefile
	lib/dns/include/dst/Makefile
	lib/dns/tests/Makefile
	lib/irs/Makefile
	lib/irs/include/Makefile
	lib/irs/include/irs/Makefile
	lib/irs/include/irs/netdb.h
	lib/irs/include/irs/platform.h
	lib/irs/tests/Makefile
	lib/isc/$arch/Makefile
	lib/isc/$arch/include/Makefile
	lib/isc/$arch/include/isc/Makefile
	lib/isc/$thread_dir/Makefile
	lib/isc/$thread_dir/include/Makefile
	lib/isc/$thread_dir/include/isc/Makefile
	lib/isc/Makefile
	lib/isc/include/Makefile
	lib/isc/include/isc/Makefile
	lib/isc/include/isc/platform.h
	lib/isc/include/pk11/Makefile
	lib/isc/include/pkcs11/Makefile
	lib/isc/tests/Makefile
	lib/isc/nls/Makefile
	lib/isc/unix/Makefile
	lib/isc/unix/include/Makefile
	lib/isc/unix/include/isc/Makefile
	lib/isc/unix/include/pkcs11/Makefile
	lib/isccc/Makefile
	lib/isccc/include/Makefile
	lib/isccc/include/isccc/Makefile
	lib/isccc/tests/Makefile
	lib/isccfg/Makefile
	lib/isccfg/include/Makefile
	lib/isccfg/include/isccfg/Makefile
	lib/isccfg/tests/Makefile
	lib/lwres/Makefile
	lib/lwres/include/Makefile
	lib/lwres/include/lwres/Makefile
	lib/lwres/include/lwres/netdb.h
	lib/lwres/include/lwres/platform.h
	lib/lwres/man/Makefile
	lib/lwres/tests/Makefile
	lib/lwres/unix/Makefile
	lib/lwres/unix/include/Makefile
	lib/lwres/unix/include/lwres/Makefile
	lib/samples/Makefile
	lib/samples/Makefile-postinstall
	unit/unittest.sh
])

#
# Do it
#

AC_OUTPUT

#
# Now that the Makefiles exist we can ensure that everything is rebuilt.
#
AC_ARG_WITH(make-clean,
	    AS_HELP_STRING([--with-make-clean],
			   [run "make clean" at end of configure [yes|no]]),
	    make_clean="$withval", make_clean="yes")
case "$make_clean" in
yes)
	if test "yes" != "$no_create"
	then
		if test "yes" = "$silent"
		then
			make clean > /dev/null
		else
			make clean
		fi
	fi
	;;
esac

AC_ARG_ENABLE(full-report,
	      AS_HELP_STRING([--enable-full-report],
			     [report values of all configure options]))

report() {
    echo "==============================================================================="
    echo "Configuration summary:"
    echo "-------------------------------------------------------------------------------"
    echo "Optional features enabled:"
    if $use_threads; then
	echo "    Multiprocessing support (--enable-threads)"
	if test "yes" = "$enable_full_report" -o "standard" = "$locktype"; then
	    echo "        Mutex lock type: $locktype"
	fi
    fi
    test "large" = "$use_tuning" && echo "    Large-system tuning (--with-tuning)"
    test "no" = "$use_dnstap" || \
	    echo "    Allow 'dnstap' packet logging (--enable-dnstap)"
    test "no" = "$use_geoip" || echo "    GeoIP access control (--with-geoip)"
    test "no" = "$use_gssapi" || echo "    GSS-API (--with-gssapi)"
    if test "yes" = "$enable_full_report" -o "aes" != "$with_cc_alg"; then
	echo "        Algorithm: $with_cc_alg"
    fi

    # these lines are only printed if run with --enable-full-report
    if test "yes" = "$enable_full_report"; then
	test "no" = "$enable_ipv6" -o "no" = "$found_ipv6" || \
	    echo "    IPv6 support (--enable-ipv6)"
	test "X$CRYPTO" = "X" -o "yes" = "$want_native_pkcs11" || \
		echo "    OpenSSL cryptography/DNSSEC (--with-openssl)"
	test "X$PYTHON" = "X" || echo "    Python tools (--with-python)"
	test "X$XMLSTATS" = "X" || echo "    XML statistics (--with-libxml2)"
	test "X$JSONSTATS" = "X" || echo "    JSON statistics (--with-libjson)"
	test "X$ZLIB" = "X" || echo "    HTTP zlib compression (--with-zlib)"
	test "X$NZD_TOOLS" = "X" || echo "    LMDB database to store configuration for 'addzone' zones (--with-lmdb)"
	test "no" = "$use_libidn2" || echo "    IDN support (--with-libidn2)"
    fi

    if test "no" != "$use_pkcs11"; then
	if test "yes" = "$want_native_pkcs11"; then
	    echo "    Native PKCS#11/Cryptoki support (--enable-native-pkcs11)"
	else
	    echo "    PKCS#11/Cryptoki support using OpenSSL (--with-pkcs11)"
	fi
	echo "        Provider library: $PKCS11_PROVIDER"
    fi
    if test "yes" = "$OPENSSL_GOST" -o "yes" = "$PKCS11_GOST"; then
	echo "    GOST algorithm support (encoding: $gosttype) (--with-gost)"
    fi
    test "yes" = "$OPENSSL_ECDSA" -o "$PKCS11_ECDSA" && \
	echo "    ECDSA algorithm support (--with-ecdsa)"
    test "yes" = "$OPENSSL_ED25519" -o "$PKCS11_ED25519" && \
	echo "    EDDSA algorithm support (--with-eddsa)"
    test "yes" = "$enable_fixed" && \
	echo "    Allow 'fixed' rrset-order (--enable-fixed-rrset)"
    test "yes" = "$enable_filter" && \
	echo "    AAAA filtering (--enable-filter-aaaa)"
    test "yes" = "$enable_seccomp" && \
	echo "    Use libseccomp system call filtering (--enable-seccomp)"
    test "yes" = "$want_backtrace" && \
	echo "    Print backtrace on crash (--enable-backtrace)"
    test "minimal" = "$want_symtable" && \
	echo "    Use symbol table for backtrace, named only (--enable-symtable)"
    test "yes" = "$want_symtable" -o "all" = "$want_symtable" && \
	echo "    Use symbol table for backtrace, all binaries (--enable-symtable=all)"
    test "no" = "$use_libtool" || echo "    Use GNU libtool (--with-libtool)"
    test "yes" = "$want_querytrace" && \
	echo "    Very verbose query trace logging (--enable-querytrace)"
    test "no" = "$with_cmocka" || echo "    CMocka Unit Testing Framework (--with-cmocka)"

    echo "    Dynamically loadable zone (DLZ) drivers:"
    test "no" = "$use_dlz_bdb" || \
	echo "        Berkeley DB (--with-dlz-bdb)"
    test "no" = "$use_dlz_ldap" || \
	echo "        LDAP (--with-dlz-ldap)"
    test "no" = "$use_dlz_mysql" || \
	echo "        MySQL (--with-dlz-mysql)"
    test "no" = "$use_dlz_odbc" || \
	echo "        ODBC (--with-dlz-odbc)"
    test "no" = "$use_dlz_postgres" || \
	echo "        Postgres (--with-dlz-postgres)"
    test "no" = "$use_dlz_filesystem" || \
	echo "        Filesystem (--with-dlz-filesystem)"
    test "no" = "$use_dlz_stub" || \
	echo "        Stub (--with-dlz-stub)"
    test "$use_dlz_bdb $use_dlz_ldap $use_dlz_mysql $use_dlz_odbc $use_dlz_postgres $use_dlz_filesystem $use_dlz_stub" = "no no no no no no no" && echo "        None"

    echo "-------------------------------------------------------------------------------"

    echo "Features disabled or unavailable on this platform:"
    $use_threads || echo "    Multiprocessing support (--enable-threads)"
    test "no" = "$enable_ipv6" -o "no" = "$found_ipv6" && \
	    echo "    IPv6 support (--enable-ipv6)"
    test "large" = "$use_tuning" || echo "    Large-system tuning (--with-tuning)"

    test "no" = "$use_dnstap" && \
	    echo "    Allow 'dnstap' packet logging (--enable-dnstap)"
    test "no" = "$use_geoip" && echo "    GeoIP access control (--with-geoip)"
    test "no" = "$use_gssapi" && echo "    GSS-API (--with-gssapi)"

    test "yes" = "$enable_fixed" || \
	echo "    Allow 'fixed' rrset-order (--enable-fixed-rrset)"

    if test "X$CRYPTO" = "X" -o "yes" = "$want_native_pkcs11"
    then
	echo "    OpenSSL cryptography/DNSSEC (--with-openssl)"
    elif test "no" = "$use_pkcs11"; then
	echo "    PKCS#11/Cryptoki support (--with-pkcs11)"
    fi
    test "yes" = "$want_native_pkcs11" ||
	echo "    Native PKCS#11/Cryptoki support (--enable-native-pkcs11)"
    test "X$CRYPTO" = "X" -o "yes" = "$OPENSSL_GOST" -o "yes" = "$PKCS11_GOST" || \
	echo "    GOST algorithm support (--with-gost)"
    test "X$CRYPTO" = "X" -o "yes" = "$OPENSSL_ECDSA" -o "yes" = "$PKCS11_ECDSA" || \
	echo "    ECDSA algorithm support (--with-ecdsa)"
    test "X$CRYPTO" = "X" -o "yes" = "$OPENSSL_ED25519" -o "yes" = "$PKCS11_ED25519" || \
	echo "    EDDSA algorithm support (--with-eddsa)"

    test "yes" = "$enable_seccomp" || \
	echo "    Use libseccomp system call filtering (--enable-seccomp)"
    test "yes" = "$want_backtrace" || \
	echo "    Print backtrace on crash (--enable-backtrace)"
    test "yes" = "$want_querytrace" || \
	echo "    Very verbose query trace logging (--enable-querytrace)"

    test "yes" = "$use_libtool" || echo "    Use GNU libtool (--with-libtool)"
    test "no" = "$with_cmocka" && echo "    CMocka Unit Testng Framework (--with-cmocka)"

    test "X$PYTHON" = "X" && echo "    Python tools (--with-python)"
    test "X$XMLSTATS" = "X" && echo "    XML statistics (--with-libxml2)"
    test "X$JSONSTATS" = "X" && echo "    JSON statistics (--with-libjson)"
    test "X$ZLIB" = "X" && echo "    HTTP zlib compression (--with-zlib)"
    test "X$NZD_TOOLS" = "X" && echo "    LMDB database to store configuration for 'addzone' zones (--with-lmdb)"
    test "no" = "$use_libidn2" && echo "    IDN support (--with-libidn2)"

    echo "-------------------------------------------------------------------------------"
    echo "Configured paths:"
    echo "    prefix: $prefix"
    echo "    sysconfdir: $sysconfdir"
    echo "    localstatedir: $localstatedir"
    echo "-------------------------------------------------------------------------------"
    echo "Compiler: $CC"
    $CC --version 2>&1 | sed 's/^/    /'

    if test "X$ac_unrecognized_opts" != "X"; then
	echo "Unrecognized options:"
	echo "    $ac_unrecognized_opts"
    fi

    if test "yes" != "$enable_full_report"; then
	echo "-------------------------------------------------------------------------------"
	echo "For more detail, use --enable-full-report."
    fi
    echo "==============================================================================="
}

if test "yes" != "$silent"; then
	report
fi

if test "X$CRYPTO" = "X"; then
cat << \EOF
BIND 9 is being built without cryptography support. This means it will
not have DNSSEC support. Use --with-openssl, or --with-pkcs11 and
--enable-native-pkcs11 to enable cryptography.
EOF
fi

# Tell Emacs to edit this file in shell mode.
# Local Variables:
# mode: sh
# End:
