# Copyright (C) 1998-2001  Internet Software Consortium.
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
# DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
# INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
# FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

AC_REVISION($Revision: 1.294.2.6 $)

AC_INIT(lib/dns/name.c)
AC_PREREQ(2.13)

AC_CONFIG_HEADER(config.h)
AC_CONFIG_SUBDIRS(lib/bind)

AC_CANONICAL_HOST

AC_PROG_MAKE_SET
AC_PROG_RANLIB
AC_PROG_INSTALL

AC_SUBST(STD_CINCLUDES)
AC_SUBST(STD_CDEFINES)
AC_SUBST(STD_CWARNINGS)
AC_SUBST(CCOPT)

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.
#
AC_PATH_PROGS(PERL, perl5 perl)
AC_SUBST(PERL)

#
# Special processing of paths depending on whether --prefix,
# --sysconfdir or --localstatedir arguments were given.  What's
# desired is some compatability 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

#
# 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 "$ac_dir" = "$ac_prog" && ac_dir=.
                test -d "$ac_dir" && ac_dir="`(cd \"$ac_dir\" && pwd)`"
                INSTALL="$ac_dir/$ac_prog"
                ;;
esac

#
# On these hosts, we really want to use cc, not gcc, even if it is
# found.  The gcc that these systems have will not correctly handle
# pthreads.
#
# However, if the user sets $CC to be something, let that override
# our change.
#
if test "X$CC" = "X" ; then
	case "$host" in
		*-dec-osf*)
			CC="cc"
			;;
		*-solaris*)
                        # Use Sun's cc if it is available, but watch
                        # out for /usr/ucb/cc; it will never be the right
                        # compiler to use.
                        #
                        # If setting CC here fails, the AC_PROG_CC done
                        # below might still find gcc.
			IFS="${IFS=	}"; ac_save_ifs="$IFS"; IFS=":"
			for ac_dir in $PATH; do
				test -z "$ac_dir" && ac_dir=.
				case "$ac_dir" in
				/usr/ucb)
					# exclude
					;;
				*)
					if test -f "$ac_dir/cc"; then
						CC="$ac_dir/cc"
						break
					fi
					;;
				esac
			done
			IFS="$ac_save_ifs"
			;;
		*-hp-hpux*)
			CC="cc"
			;;
		mips-sgi-irix*)
			CC="cc"
			;;
	esac
fi

AC_PROG_CC

AC_HEADER_STDC

AC_CHECK_HEADERS(fcntl.h sys/time.h unistd.h sys/sockio.h sys/select.h sys/sysctl.h)

AC_C_CONST
AC_C_INLINE
AC_CHECK_FUNC(sysctlbyname, AC_DEFINE(HAVE_SYSCTLBYNAME))

#
# 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(, [
		foo1();
	}

	static inline int foo1() {
		return 0;
	}

	static inline int foo2() {
		return foo1();
	],
	[AC_MSG_RESULT(no)],
	[AC_MSG_RESULT(yes)
         AC_DEFINE(inline, )])

AC_TYPE_SIZE_T
AC_CHECK_TYPE(ssize_t, int)
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 if we need to #include sys/select.h explicitly
#
case $ac_cv_header_unistd_h in
yes)
AC_MSG_CHECKING(if unistd.h defines fd_set)
AC_TRY_COMPILE([
#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

#
# was --with-openssl specified?
#
AC_MSG_CHECKING(for OpenSSL library)
AC_ARG_WITH(openssl,
[  --with-openssl[=PATH]   Build with OpenSSL [yes|no|path].
                          (Required for DNSSEC)],
    use_openssl="$withval", use_openssl="no")

case "$use_openssl" in
	no)
		AC_MSG_RESULT(no)
		DST_OPENSSL_INC=""
		USE_OPENSSL=""
		;;
	*)
		if test "$use_openssl" = "yes"
		then
		    	# User did not specify a path - guess it
			openssldirs="/usr /usr/local /usr/local/ssl /usr/pkg"
			for d in $openssldirs
			do
				if test -f $d/include/openssl/opensslv.h
				then
				 	use_openssl=$d
					break
				fi
			done
			if test "$use_openssl" = "yes"
			then
			    	AC_MSG_RESULT(not found)
				AC_MSG_ERROR(
[OpenSSL was not found in any of $openssldirs; use --with-openssl=/path])
			fi
		fi
		USE_OPENSSL='-DOPENSSL'
		DST_OPENSSL_INC="-I$use_openssl/include"
		DNS_OPENSSL_LIBS="-L$use_openssl/lib -lcrypto"
		AC_MSG_RESULT(using openssl from $use_openssl/lib and $use_openssl/include)

		AC_MSG_CHECKING(OpenSSL library version)
		saved_cflags="$CFLAGS"
		saved_libs="$LIBS"
		CFLAGS="$CFLAGS $DST_OPENSSL_INC"
		LIBS="$LIBS $DNS_OPENSSL_LIBS"
		AC_TRY_RUN([
#include <stdio.h>
#include <openssl/opensslv.h>
int main() {
        if (OPENSSL_VERSION_NUMBER >= 0x0090581fL)
                return (0);
	printf("\n\nFound   OPENSSL_VERSION_NUMBER %#010x\n",
		OPENSSL_VERSION_NUMBER);
	printf("Require OPENSSL_VERSION_NUMBER 0x0090581f or greater\n\n");
        return (1);
}
],
	        [AC_MSG_RESULT(ok)],
		[AC_MSG_RESULT(not compatible)
		 AC_MSG_ERROR(you need OpenSSL 0.9.5a or newer)],
		[AC_MSG_RESULT(assuming target platform has compatible version)])
		CFLAGS="$saved_cflags"
		LIBS="$saved_libs"
		;;
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(DNS_OPENSSL_LIBS)
AC_SUBST(USE_OPENSSL)

#
# was --with-gssapi specified?
#
#AC_MSG_CHECKING(for GSSAPI library)
#AC_ARG_WITH(gssapi,
#[  --with-gssapi=PATH   Specify path for system-supplied GSSAPI],
#    use_gssapi="$withval", use_gssapi="no")
#
#case "$use_gssapi" in
#	no)
#		USE_GSSAPI=''
#		DST_GSSAPI_INC=''
#		DNS_GSSAPI_LIBS=''
#		AC_MSG_RESULT(not specified)
#		;;
#	yes)
#		AC_MSG_ERROR([--with-gssapi must specify a path])
#		;;
#	*)
#		USE_GSSAPI='-DGSSAPI'
#		DST_GSSAPI_INC="-I$use_gssapi/include"
#		DNS_GSSAPI_LIBS="-L$use_gssapi/lib -lgssapi_krb5"
#		AC_MSG_RESULT(using gssapi from $use_gssapi/lib and $use_gssapi/include)
#		;;
#esac

USE_GSSAPI=''
DST_GSSAPI_INC=''
DNS_GSSAPI_LIBS=''

AC_SUBST(USE_GSSAPI)
AC_SUBST(DST_GSSAPI_INC)
AC_SUBST(DNS_GSSAPI_LIBS)

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

case "$use_randomdev" in
	unspec)
		case "$host" in
			*-openbsd*)
				devrandom=/dev/srandom
				;;
			*)
				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

#
# Begin pthreads checking.
#
# First, decide whether to use multithreading or not.
#
# Enable multithreading by default on systems where it is known
# to work well, and where debugging of multithreaded programs
# is supported.
#

AC_MSG_CHECKING(whether to build with thread support)

case $host in
*-dec-osf*)
	use_threads=true ;;
[*-solaris2.[0-6]])
	# Thread signals are broken on Solaris 2.6; they are sometimes
	# delivered to the wrong thread.
	use_threads=false ;;
*-solaris*)
	use_threads=true ;;
*-ibm-aix*)
	use_threads=true ;;
*-hp-hpux10*)
	use_threads=false ;;
*-hp-hpux11*)
	use_threads=true ;;
*-sgi-irix*)
	use_threads=true ;;
*-sco-sysv*uw*)
        # UnixWare
	use_threads=false ;;
*-netbsd*)
	# Socket I/O optimizations introduced in 9.2 expose a
	# bug in unproven-pthreads; see PR #12650
	use_threads=false ;;
*-openbsd*)
	# OpenBSD users have reported that named dumps core on
	# startup when built with threads.
	use_threads=false ;;
*-freebsd*)
	use_threads=false ;;
*-bsdi*)
	# Thread signals do not appear to work reliably on BSDI.
	use_threads=false ;;
*-linux*)
   	# Threads are disabled on Linux by default because most
	# Linux kernels produce unusable core dumps from multithreaded
	# programs, and because of limitations in setuid().
	use_threads=false ;;	
*)
	use_threads=false ;;
esac

AC_ARG_ENABLE(threads,
	[  --enable-threads	enable multithreading])
case "$enable_threads" in
	yes)
		use_threads=true
		;;
	no)
		use_threads=false
		;;
	'')
		# Use system-dependent default
		;;
	*)
	    	AC_MSG_ERROR([--enable-threads takes yes or no])
		;;
esac

if $use_threads
then
	AC_MSG_RESULT(yes)
else
	AC_MSG_RESULT(no)	
fi

if $use_threads
then
	#
	# Search for / configure pthreads in a system-dependent fashion.
	#
	case "$host" in
	  *-netbsd*)
		# NetBSD has multiple pthreads implementations.	 The
		# recommended one to use is "unproven-pthreads".  The
		# older "mit-pthreads" may also work on some NetBSD
		# versions.  The PTL2 thread library does not
		# currently work with bind9, but can be chosen with
		# the --with-ptl2 option for those who wish to
		# experiment with it.
		CC="gcc"
		AC_MSG_CHECKING(which NetBSD thread library to use)

		AC_ARG_WITH(ptl2,
[  --with-ptl2		on NetBSD, use the ptl2 thread library (experimental)],
		    use_ptl2="$withval", use_ptl2="no")

		: ${LOCALBASE:=/usr/pkg}

		if test "X$use_ptl2" = "Xyes"
		then
			AC_MSG_RESULT(PTL2)
			AC_MSG_WARN(
[linking with PTL2 is highly experimental and not expected to work])
			CC=ptlgcc
		else
			if test ! -d $LOCALBASE/pthreads
			then
				AC_MSG_RESULT(none)
				AC_MSG_ERROR("could not find thread libraries")
			fi

			if $use_threads
			then
				AC_MSG_RESULT(mit-pthreads/unproven-pthreads)
				pkg="$LOCALBASE/pthreads"
				lib1="-L$pkg/lib -Wl,-R$pkg/lib"
				lib2="-lpthread -lm -lgcc -lpthread"
				LIBS="$lib1 $lib2 $LIBS"
				CPPFLAGS="$CPPFLAGS -I$pkg/include"
				STD_CINCLUDES="$STD_CINCLUDES -I$pkg/include"
			fi
		fi
		;;
		*)
			AC_CHECK_LIB(pthread, pthread_create,,
				AC_CHECK_LIB(pthread, __pthread_create,,
				AC_CHECK_LIB(pthread, __pthread_create_system,,
				AC_CHECK_LIB(c_r, pthread_create,,
				AC_CHECK_LIB(c, pthread_create,,
				AC_MSG_ERROR("could not find thread libraries"))))))
		;;
	esac
fi

if $use_threads
then
	#
	# We'd like to use sigwait() too
	#
	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),)

	#
	# 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),)
			;;
		#
		# 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*)
			AC_DEFINE(HAVE_UNIXWARE_SIGWAIT)
			;;
	esac

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

	if test "X$GCC" = "Xyes"; then
		case "$host" in
		*-freebsd*)
			CC="$CC -pthread"
			CCOPT="$CCOPT -pthread"
			STD_CDEFINES="$STD_CDEFINES -D_THREAD_SAFE"
			;;
		*-openbsd*)
			CC="$CC -pthread"
			CCOPT="$CCOPT -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"
			;;
		*-solaris*)
			CC="$CC -mt"
			CCOPT="$CCOPT -mt"
			;;
		*-ibm-aix*)
			STD_CDEFINES="$STD_CDEFINES -D_THREAD_SAFE"
			;;
		*-sco-sysv*uw*)
			CC="$CC -Kthread"
			CCOPT="$CCOPT -Kthread"
			;;
		esac
	fi
	ALWAYS_DEFINES="-D_REENTRANT"
	ISC_PLATFORM_USETHREADS="#define ISC_PLATFORM_USETHREADS 1"
	thread_dir=pthreads
else
	ISC_PLATFORM_USETHREADS="#undef ISC_PLATFORM_USETHREADS"
	thread_dir=nothreads
	ALWAYS_DEFINES=""
fi

AC_SUBST(ALWAYS_DEFINES)
AC_SUBST(ISC_PLATFORM_USETHREADS)

ISC_THREAD_DIR=$thread_dir
AC_SUBST(ISC_THREAD_DIR)

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

#
# 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"
else
	case $host in
	*-dec-osf*)
		CC="$CC -std"
		CCOPT="$CCOPT -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"
			;;
		esac
		CCOPT="$CCOPT -Ae -z"
		LIBS="-Wl,+vnocompatwarnings $LIBS"
		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*)
                # 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)
#    AC_CHECK_LIB(nsl, inet_ntoa)
# )
#
# Use this for now, instead:
#
case "$host" in
	mips-sgi-irix*)
		;;
	*)
		AC_CHECK_LIB(socket, socket)
		AC_CHECK_LIB(nsl, inet_ntoa)
		;;
esac

#
# Purify support
#
AC_MSG_CHECKING(whether to use purify)
AC_ARG_WITH(purify,
	[  --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_path = purify; 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)

#
# GNU libtool support
#
AC_ARG_WITH(libtool,
	    [  --with-libtool	use GNU libtool (following indented options supported)],
	    use_libtool="$withval", use_libtool="no")

case $use_libtool in
	yes)
		AM_PROG_LIBTOOL
		O=lo
		A=la
		LIBTOOL_MKDEP_SED='s;\.o;\.lo;'
		;;
	*)
		O=o
		A=a
		LIBTOOL=
		AC_SUBST(LIBTOOL)
		LIBTOOL_MKDEP_SED=
		;;
esac

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

#
# build libbind?
#
AC_ARG_ENABLE(libbind,
	[  --enable-libbind		build libbind [default=no]])

case "$enable_libbind" in
	yes)
		LIBBIND=lib/bind
		AC_SUBST(LIBBIND)
		;;
	no|'')
		;;
esac

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

#
# IPv6
#
AC_ARG_ENABLE(ipv6,
	[  --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,
	[  --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*)
        # 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)
			 result="#define LWRES_HAVE_SIN6_SCOPE_ID 1"],
			[AC_MSG_RESULT(no)
			 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_IPV6_H="ipv6.h"
		ISC_IPV6_O="ipv6.$O"
		ISC_ISCIPV6_O="unix/ipv6.$O"
		ISC_IPV6_C="ipv6.c"
		;;
esac

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_IPV6_H)
AC_SUBST(ISC_IPV6_O)
AC_SUBST(ISC_ISCIPV6_O)
AC_SUBST(ISC_IPV6_C)
AC_SUBST(LWRES_HAVE_SIN6_SCOPE_ID)

#
# 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])
AC_TRY_LINK([
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>],
        [inet_ntop(0, 0, 0, 0); return (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"])


# 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 inet_pton])
AC_TRY_RUN([
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
main() { char a[4]; return (inet_pton(AF_INET, "1.2.3", a) == 1 ? 1 :
			    inet_pton(AF_INET, "1.2.3.04", a) == 1 ? 1 : 0); }],
        [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 target platform has working inet_pton)
	ISC_PLATFORM_NEEDPTON="#undef ISC_PLATFORM_NEEDPTON"])

AC_MSG_CHECKING([for inet_aton])
AC_TRY_LINK([
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>],
        [struct in_addr in; inet_aton(0, &in); return (0);],
        [AC_MSG_RESULT(yes)
        ISC_PLATFORM_NEEDATON="#undef ISC_PLATFORM_NEEDATON"],

        [AC_MSG_RESULT(no)
        ISC_EXTRA_OBJS="$ISC_EXTRA_OBJS inet_aton.$O"
        ISC_EXTRA_SRCS="$ISC_EXTRA_SRCS inet_aton.c"
        ISC_PLATFORM_NEEDATON="#define ISC_PLATFORM_NEEDATON 1"])

AC_SUBST(ISC_PLATFORM_NEEDNTOP)
AC_SUBST(ISC_PLATFORM_NEEDPTON)
AC_SUBST(ISC_PLATFORM_NEEDATON)

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

#
# 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"
	AC_DEFINE(HAVE_ADDRINFO)],
	[AC_MSG_RESULT(no)
	ISC_LWRES_NEEDADDRINFO="#define ISC_LWRES_NEEDADDRINFO 1"])
AC_SUBST(ISC_LWRES_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)

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)

#
# Look for a sysctl call to get the list of network interfaces.
#
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)])

#
# Check for some other useful functions that are not ever-present.
#
AC_CHECK_FUNC(strsep,
	[ISC_PLATFORM_NEEDSTRSEP="#undef ISC_PLATFORM_NEEDSTRSEP"],
	[ISC_PLATFORM_NEEDSTRSEP="#define ISC_PLATFORM_NEEDSTRSEP 1"])
AC_CHECK_FUNC(vsnprintf,
	[ISC_PLATFORM_NEEDVSNPRINTF="#undef ISC_PLATFORM_NEEDVSNPRINTF"],
	[ISC_EXTRA_OBJS="$ISC_EXTRA_OBJS print.$O"
	 ISC_EXTRA_SRCS="$ISC_EXTRA_SRCS print.c"
	 ISC_PLATFORM_NEEDVSNPRINTF="#define ISC_PLATFORM_NEEDVSNPRINTF 1"])
AC_SUBST(ISC_PLATFORM_NEEDSTRSEP)
AC_SUBST(ISC_PLATFORM_NEEDVSNPRINTF)
AC_CHECK_FUNC(strerror, AC_DEFINE(HAVE_STRERROR))

AC_SUBST(ISC_EXTRA_OBJS)
AC_SUBST(ISC_EXTRA_SRCS)

#
# Determine the printf format characters to use when printing
# values of type isc_int64_t.  We make the assumption that platforms
# where a "long long" is the same size as a "long" (e.g., Alpha/OSF1)
# want "%ld" and everyone else can use "%lld".  Win32 uses "%I64d",
# but that's defined elsewhere since we don't use configure on Win32.
#
AC_MSG_CHECKING(printf format modifier for 64-bit integers)
AC_TRY_RUN([main() { exit(!(sizeof(long long int) == sizeof(long int))); }],
	[AC_MSG_RESULT(l)
	ISC_PLATFORM_QUADFORMAT='#define ISC_PLATFORM_QUADFORMAT "l"'],
	[AC_MSG_RESULT(ll)
	ISC_PLATFORM_QUADFORMAT='#define ISC_PLATFORM_QUADFORMAT "ll"'],
	[AC_MSG_RESULT(assuming target platform uses ll)
	ISC_PLATFORM_QUADFORMAT='#define ISC_PLATFORM_QUADFORMAT "ll"'])
AC_SUBST(ISC_PLATFORM_QUADFORMAT)

#
# Security Stuff
#
AC_CHECK_FUNC(chroot, AC_DEFINE(HAVE_CHROOT))
AC_ARG_ENABLE(linux-caps,
	[  --disable-linux-caps	disable linux capabilities])
case "$enable_linux_caps" in
	yes|'')
		AC_CHECK_HEADERS(linux/capability.h)
		;;
	no)
		;;
esac
AC_CHECK_HEADERS(sys/prctl.h)

#
# 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_MSG_ERROR(cannot determine type of rlim_cur when cross compiling - define rlim_t)])
])
AC_SUBST(ISC_PLATFORM_RLIMITTYPE)

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

#
# 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
	*-bsdi3.1*)
		hack_shutup_sputaux=yes
		;;
	*-bsdi4.0*)
		hack_shutup_sigwait=yes
		hack_shutup_sputaux=yes
		;;
	[*-bsdi4[12]*])
		hack_shutup_stdargcast=yes
		;;
	*-solaris2.8)
		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

#
# The following sections deal with tools used for formatting
# the documentation.  They are all optional, unless you are
# a developer editing the documentation source.
#

# Directory trees where SGML files are commonly found.
sgmltrees="/usr/pkg/share/sgml /usr/local/share/sgml"

#
# Look for openjade.  Plain jade is no longer supported.
#

AC_PATH_PROGS(OPENJADE, openjade, openjade)
AC_SUBST(OPENJADE)

#
# Look for TeX.
#

AC_PATH_PROGS(JADETEX, jadetex, jadetex)
AC_SUBST(JADETEX)

AC_PATH_PROGS(PDFJADETEX, pdfjadetex, pdfjadetex)
AC_SUBST(PDFJADETEX)

#
# 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)
])

NOM_PATH_FILE(SGMLCATALOG, catalog, $sgmltrees)

#
# Look for the HTML stylesheet html/docbook.dsl, used for
# formatting man pages in HTML.  Its location varies,
# so far we have seen:
#
# 	NetBSD 	/usr/pkg/share/docbook/dsssl/modular/
# 	FreeBSD	/usr/local/share/docbook/dsssl/modular/
#	Linux	/usr/local/share/dsssl/docbook/
#
# Ditto for the print stylesheet print/docbook.dsl.
#

stylepath=""
for d in $sgmltrees 
do
	for s in docbook/dsssl/modular dsssl/docbook
	do
		stylepath="$stylepath $d/$s"
	done
done
NOM_PATH_FILE(HTMLSTYLE, html/docbook.dsl, $stylepath)
NOM_PATH_FILE(PRINTSTYLE, print/docbook.dsl, $stylepath)

#
# Look for XML declarations
#

NOM_PATH_FILE(XMLDCL, docbook/dsssl/modular/dtds/decls/xml.dcl, $sgmltrees)

#
# Look for docbook2man-spec.pl
#

NOM_PATH_FILE(DOCBOOK2MANSPEC, docbook2X/docbook2man-spec.pl, $sgmltrees)

#
# 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)
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"
else
	BIND9_ISC_BUILDINCLUDE=""
	BIND9_ISCCC_BUILDINCLUDE=""
	BIND9_ISCCFG_BUILDINCLUDE=""
	BIND9_DNS_BUILDINCLUDE=""
	BIND9_LWRES_BUILDINCLUDE=""
fi

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

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

. $srcdir/version
BIND9_VERSION="VERSION=${MAJORVER}.${MINORVER}.${PATCHVER}${RELEASETYPE}${RELEASEVER}"
AC_SUBST(BIND9_VERSION)

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(LIBLWRES_API)
LIBLWRES_API=$srcdir/lib/lwres/api

AC_OUTPUT(
	make/rules
	make/includes
	Makefile
	make/Makefile
	make/mkdep
	lib/Makefile
	lib/isc/Makefile
	lib/isc/include/Makefile
	lib/isc/include/isc/Makefile
	lib/isc/include/isc/platform.h
	lib/isc/unix/Makefile
	lib/isc/unix/include/Makefile
	lib/isc/unix/include/isc/Makefile
	lib/isc/nls/Makefile
	lib/isc/$thread_dir/Makefile
	lib/isc/$thread_dir/include/Makefile
	lib/isc/$thread_dir/include/isc/Makefile
	lib/isccc/Makefile
	lib/isccc/include/Makefile
	lib/isccc/include/isccc/Makefile
	lib/isccfg/Makefile
	lib/isccfg/include/Makefile
	lib/isccfg/include/isccfg/Makefile
	lib/dns/Makefile
	lib/dns/include/Makefile
	lib/dns/include/dns/Makefile
	lib/dns/sec/Makefile
	lib/dns/sec/dst/Makefile
	lib/dns/sec/dst/include/Makefile
	lib/dns/sec/dst/include/dst/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/unix/Makefile
	lib/lwres/unix/include/Makefile
	lib/lwres/unix/include/lwres/Makefile
	lib/lwres/win32/Makefile
	lib/lwres/win32/include/Makefile
	lib/lwres/win32/include/lwres/Makefile
	lib/tests/Makefile
	lib/tests/include/Makefile
	lib/tests/include/tests/Makefile
	bin/Makefile
	bin/check/Makefile
	bin/named/Makefile
	bin/named/unix/Makefile
	bin/rndc/Makefile
	bin/rndc/unix/Makefile
	bin/dig/Makefile
	bin/nsupdate/Makefile
	bin/tests/Makefile
	bin/tests/names/Makefile
	bin/tests/master/Makefile
	bin/tests/rbt/Makefile
	bin/tests/db/Makefile
	bin/tests/tasks/Makefile
	bin/tests/timers/Makefile
	bin/tests/dst/Makefile
	bin/tests/mem/Makefile
	bin/tests/net/Makefile
	bin/tests/sockaddr/Makefile
	bin/tests/system/Makefile
	bin/tests/system/conf.sh
	bin/tests/system/lwresd/Makefile
	bin/tests/system/tkey/Makefile
	bin/tests/headerdep_test.sh
	bin/dnssec/Makefile
	doc/Makefile
	doc/arm/Makefile
	doc/arm/nominum-docbook-html.dsl
	doc/arm/nominum-docbook-print.dsl
	doc/arm/validate.sh
	doc/misc/Makefile
	docutil/docbook2man-wrapper.sh
	isc-config.sh
)
chmod a+x isc-config.sh

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