1# Copyright (C) 2004-2014  Internet Systems Consortium, Inc. ("ISC")
2# Copyright (C) 1998-2003  Internet Software Consortium.
3#
4# Permission to use, copy, modify, and/or distribute this software for any
5# purpose with or without fee is hereby granted, provided that the above
6# copyright notice and this permission notice appear in all copies.
7#
8# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
9# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10# AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
11# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
13# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14# PERFORMANCE OF THIS SOFTWARE.
15
16dnl
17AC_DIVERT_PUSH(1)dnl
18esyscmd([sed -e 's/^/# /' -e '/Portions of this code/,$d' COPYRIGHT])dnl
19AC_DIVERT_POP()dnl
20
21AC_REVISION($Revision: 1.533 $)
22
23AC_INIT(lib/dns/name.c)
24AC_PREREQ(2.59)
25
26AC_CONFIG_HEADER(config.h)
27AC_CONFIG_MACRO_DIR([libtool.m4])
28
29AC_CANONICAL_HOST
30
31AC_PROG_MAKE_SET
32
33#
34# GNU libtool support
35#
36case $build_os in
37sunos*)
38    # Just set the maximum command line length for sunos as it otherwise
39    # takes a exceptionally long time to work it out. Required for libtool.
40
41    lt_cv_sys_max_cmd_len=4096;
42    ;;
43esac
44
45AC_PROG_LIBTOOL
46AC_PROG_INSTALL
47AC_PROG_LN_S
48
49AC_SUBST(STD_CINCLUDES)
50AC_SUBST(STD_CDEFINES)
51AC_SUBST(STD_CWARNINGS)
52AC_SUBST(CCOPT)
53AC_SUBST(CCNOOPT)
54
55# Warn if the user specified libbind, which is now deprecated
56AC_ARG_ENABLE(libbind, [  --enable-libbind	  deprecated])
57
58case "$enable_libbind" in
59	yes)
60		AC_MSG_ERROR(['libbind' is no longer part of the BIND 9 distribution.
61It is available from http://www.isc.org as a separate download.])
62		;;
63	no|'')
64		;;
65esac
66
67AC_ARG_ENABLE(developer, [  --enable-developer      enable developer build settings])
68case "$enable_developer" in
69yes)
70	STD_CDEFINES="$STD_CDEFINES -DISC_LIST_CHECKINIT=1"
71	test "${enable_fixed_rrset+set}" = set || enable_fixed_rrset=yes
72	test "${with_atf+set}" = set || with_atf=yes
73	test "${enable_filter_aaaa+set}" = set || enable_filter_aaaa=yes
74	test "${enable_rrl+set}" = set || enable_rrl=yes
75	test "${with_dlz_filesystem+set}" = set || with_dlz_filesystem=yes
76	case "$host" in
77	*-darwin*)
78		test "${enable_exportlib+set}" = set || enable_exportlib=yes
79		;;
80	*-linux*)
81		test "${enable_exportlib+set}" = set || enable_exportlib=yes
82		;;
83	esac
84	test "${enable_symtable+set}" = set || enable_symtable=all
85	;;
86esac
87#
88# Make very sure that these are the first files processed by
89# config.status, since we use the processed output as the input for
90# AC_SUBST_FILE() substitutions in other files.
91#
92AC_CONFIG_FILES([make/rules make/includes])
93
94AC_PATH_PROG(AR, ar)
95ARFLAGS="cruv"
96AC_SUBST(AR)
97AC_SUBST(ARFLAGS)
98
99# The POSIX ln(1) program.  Non-POSIX systems may substitute
100# "copy" or something.
101LN=ln
102AC_SUBST(LN)
103
104case "$AR" in
105	"")
106		AC_MSG_ERROR([
107ar program not found.  Please fix your PATH to include the directory in
108which ar resides, or set AR in the environment with the full path to ar.
109])
110
111		;;
112esac
113
114#
115# Etags.
116#
117AC_PATH_PROGS(ETAGS, etags emacs-etags)
118
119#
120# Some systems, e.g. RH7, have the Exuberant Ctags etags instead of
121# GNU emacs etags, and it requires the -L flag.
122#
123if test "X$ETAGS" != "X"; then
124	AC_MSG_CHECKING(for Exuberant Ctags etags)
125	if $ETAGS --version 2>&1 | grep 'Exuberant Ctags' >/dev/null 2>&1; then
126		AC_MSG_RESULT(yes)
127		ETAGS="$ETAGS -L"
128	else
129		AC_MSG_RESULT(no)
130	fi
131fi
132AC_SUBST(ETAGS)
133
134#
135# Perl is optional; it is used only by some of the system test scripts.
136# Note: the backtrace feature (see below) uses perl to build the symbol table,
137# but it still compiles without perl, in which case an empty table will be used.
138#
139AC_PATH_PROGS(PERL, perl5 perl)
140AC_SUBST(PERL)
141
142#
143# Python is also optional; it is used by the tools in bin/python.
144# If python is unavailable, we simply don't build those.
145#
146AC_ARG_WITH(python,
147[  --with-python=PATH      Specify path to python interpreter],
148    use_python="$withval", use_python="unspec")
149
150case "$use_python" in
151	no)
152		AC_MSG_RESULT(disabled)
153		;;
154	unspec|yes|*)
155		case "$use_python" in
156		unspec|yes|'')
157			AC_PATH_PROGS(PYTHON, python)
158			;;
159		*)
160			AC_PATH_PROGS(PYTHON, $use_python)
161			;;
162		esac
163		if test "X$PYTHON" == "X"
164		then
165			case "$use_python" in
166			unspec)
167				AC_MSG_RESULT(disabled)
168				;;
169			yes|*)
170				AC_MSG_ERROR([missing python])
171				;;
172			esac
173			break
174		fi
175                testscript='try: import argparse
176except: exit(1)'
177		AC_MSG_CHECKING([python module 'argparse'])
178                if $PYTHON -c "$testscript"; then
179                        AC_MSG_RESULT([found, using $PYTHON])
180                else
181			case "$use_python" in
182			unspec)
183				PYTHON=""
184				AC_SUBST(CHECKDS)
185				AC_SUBST(COVERAGE)
186				AC_MSG_RESULT([not found, python disabled])
187				;;
188			yes)
189                        AC_MSG_RESULT([no found])
190                        AC_MSG_ERROR([python 'argparse' module not supported])
191				;;
192			esac
193                fi
194		;;
195esac
196
197PYTHON_TOOLS=''
198CHECKDS=''
199COVERAGE=''
200if test "X$PYTHON" != "X"; then
201        PYTHON_TOOLS=python
202	CHECKDS=checkds
203	COVERAGE=coverage
204fi
205AC_SUBST(CHECKDS)
206AC_SUBST(COVERAGE)
207AC_SUBST(PYTHON_TOOLS)
208
209#
210# Special processing of paths depending on whether --prefix,
211# --sysconfdir or --localstatedir arguments were given.  What's
212# desired is some compatibility with the way previous versions
213# of BIND built; they defaulted to /usr/local for most parts of
214# the installation, but named.boot/named.conf was in /etc
215# and named.pid was in /var/run.
216#
217# So ... if none of --prefix, --sysconfdir or --localstatedir are
218# specified, set things up that way.  If --prefix is given, use
219# it for sysconfdir and localstatedir the way configure normally
220# would.  To change the prefix for everything but leave named.conf
221# in /etc or named.pid in /var/run, then do this the usual configure way:
222# ./configure --prefix=/somewhere --sysconfdir=/etc
223# ./configure --prefix=/somewhere --localstatedir=/var
224#
225# To put named.conf and named.pid in /usr/local with everything else,
226# set the prefix explicitly to /usr/local even though that's the default:
227# ./configure --prefix=/usr/local
228#
229case "$prefix" in
230	NONE)
231		case "$sysconfdir" in
232			'${prefix}/etc')
233				sysconfdir=/etc
234				;;
235		esac
236		case "$localstatedir" in
237			'${prefix}/var')
238				localstatedir=/var
239				;;
240		esac
241		;;
242esac
243
244#
245# Make sure INSTALL uses an absolute path, else it will be wrong in all
246# Makefiles, since they use make/rules.in and INSTALL will be adjusted by
247# configure based on the location of the file where it is substituted.
248# Since in BIND9 INSTALL is only substituted into make/rules.in, an immediate
249# subdirectory of install-sh, This relative path will be wrong for all
250# directories more than one level down from install-sh.
251#
252case "$INSTALL" in
253	/*)
254		;;
255	*)
256		#
257		# Not all systems have dirname.
258		#
259		changequote({, })
260		ac_dir="`echo $INSTALL | sed 's%/[^/]*$%%'`"
261		changequote([, ])
262
263		ac_prog="`echo $INSTALL | sed 's%.*/%%'`"
264		test "$ac_dir" = "$ac_prog" && ac_dir=.
265		test -d "$ac_dir" && ac_dir="`(cd \"$ac_dir\" && pwd)`"
266		INSTALL="$ac_dir/$ac_prog"
267		;;
268esac
269
270#
271# On these hosts, we really want to use cc, not gcc, even if it is
272# found.  The gcc that these systems have will not correctly handle
273# pthreads.
274#
275# However, if the user sets $CC to be something, let that override
276# our change.
277#
278if test "X$CC" = "X" ; then
279	case "$host" in
280		*-dec-osf*)
281			CC="cc"
282			;;
283		*-solaris*)
284			# Use Sun's cc if it is available, but watch
285			# out for /usr/ucb/cc; it will never be the right
286			# compiler to use.
287			#
288			# If setting CC here fails, the AC_PROG_CC done
289			# below might still find gcc.
290			IFS="${IFS=	}"; ac_save_ifs="$IFS"; IFS=":"
291			for ac_dir in $PATH; do
292				test -z "$ac_dir" && ac_dir=.
293				case "$ac_dir" in
294				/usr/ucb)
295					# exclude
296					;;
297				*)
298					if test -f "$ac_dir/cc"; then
299						CC="$ac_dir/cc"
300						break
301					fi
302					;;
303				esac
304			done
305			IFS="$ac_save_ifs"
306			;;
307		*-hp-hpux*)
308			CC="cc"
309			;;
310		mips-sgi-irix*)
311			CC="cc"
312			;;
313	esac
314fi
315
316AC_PROG_CC
317
318#
319# gcc's optimiser is broken at -02 for ultrasparc
320#
321if test "$ac_env_CFLAGS_set" != set -a "X$GCC" = "Xyes"; then
322	case "$host" in
323	sparc-*)
324		CCFLAGS="-g -O1"
325		;;
326	esac
327fi
328
329#
330# OS dependent CC flags
331#
332case "$host" in
333	# OSF 5.0: recv/send are only available with -D_POSIX_PII_SOCKET or
334	# -D_XOPEN_SOURCE_EXTENDED.
335	*-dec-osf*)
336		STD_CDEFINES="$STD_CDEFINES -D_POSIX_PII_SOCKET"
337		CPPFLAGS="$CPPFLAGS -D_POSIX_PII_SOCKET"
338		;;
339	#HP-UX: need -D_XOPEN_SOURCE_EXTENDED and -lxnet for CMSG macros
340	*-hp-hpux*)
341		STD_CDEFINES="$STD_CDEFINES -D_XOPEN_SOURCE_EXTENDED"
342		CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED"
343		LIBS="-lxnet $LIBS"
344		;;
345	# Solaris: need -D_XPG4_2 and -D__EXTENSIONS__ for CMSG macros
346	*-solaris*)
347		STD_CDEFINES="$STD_CDEFINES -D_XPG4_2 -D__EXTENSIONS__"
348		CPPFLAGS="$CPPFLAGS -D_XPG4_2 -D__EXTENSIONS__"
349		;;
350	# POSIX doesn't include the IPv6 Advanced Socket API and glibc hides
351	# parts of the IPv6 Advanced Socket API as a result.  This is stupid
352	# as it breaks how the two halves (Basic and Advanced) of the IPv6
353	# Socket API were designed to be used but we have to live with it.
354	# Define _GNU_SOURCE to pull in the IPv6 Advanced Socket API.
355	*-linux* | *-kfreebsd*-gnu)
356		STD_CDEFINES="$STD_CDEFINES -D_GNU_SOURCE"
357		CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE"
358		;;
359	#
360	# Starting with OSX 10.7 (Lion) we must choose which IPv6 API to use.
361	# Setting this is sufficient to select the correct behavior for BIND 9.
362	#
363	*-darwin*)
364	  STD_CDEFINES="$STD_CDEFINES -D__APPLE_USE_RFC_3542"
365	  CPPFLAGS="$CPPFLAGS -D__APPLE_USE_RFC_3542"
366	  ;;
367esac
368
369#
370# CCNOOPT defaults to -O0 on gcc and disables optimization when is last
371#
372if test "X$CCNOOPT" = "X" -a "X$GCC" = "Xyes"; then
373	CCNOOPT="-O0"
374fi
375
376AC_HEADER_STDC
377
378AC_CHECK_HEADERS(fcntl.h regex.h sys/time.h unistd.h sys/sockio.h sys/select.h sys/param.h sys/sysctl.h net/if6.h,,,
379[$ac_includes_default
380#ifdef HAVE_SYS_PARAM_H
381# include <sys/param.h>
382#endif
383])
384
385AC_C_CONST
386AC_C_INLINE
387AC_C_VOLATILE
388AC_CHECK_FUNC(sysctlbyname, AC_DEFINE(HAVE_SYSCTLBYNAME))
389AC_C_FLEXIBLE_ARRAY_MEMBER
390
391#
392# Older versions of HP/UX don't define seteuid() and setegid()
393#
394AC_CHECK_FUNCS(seteuid setresuid)
395AC_CHECK_FUNCS(setegid setresgid)
396
397#
398# UnixWare 7.1.1 with the feature supplement to the UDK compiler
399# is reported to not support "static inline" (RT #1212).
400#
401AC_MSG_CHECKING(for static inline breakage)
402AC_TRY_COMPILE([
403	static inline int foo1() {
404		return 0;
405	}
406
407	static inline int foo2() {
408		return foo1();
409	}
410	], [foo1();],
411	[AC_MSG_RESULT(no)],
412	[AC_MSG_RESULT(yes)
413	 AC_DEFINE(inline, ,[Define to empty if your compiler does not support "static inline".])])
414
415AC_TYPE_SIZE_T
416AC_CHECK_TYPE(ssize_t, int)
417AC_CHECK_TYPE(uintptr_t,unsigned long)
418AC_CHECK_TYPE(socklen_t,
419[AC_DEFINE(ISC_SOCKADDR_LEN_T, socklen_t)],
420[
421AC_TRY_COMPILE(
422[
423#include <sys/types.h>
424#include <sys/socket.h>
425int getsockname(int, struct sockaddr *, size_t *);
426],[],
427[AC_DEFINE(ISC_SOCKADDR_LEN_T, size_t)],
428[AC_DEFINE(ISC_SOCKADDR_LEN_T, int)])
429],
430[
431#include <sys/types.h>
432#include <sys/socket.h>
433])
434AC_SUBST(ISC_SOCKADDR_LEN_T)
435AC_HEADER_TIME
436AC_MSG_CHECKING(for long long)
437AC_TRY_COMPILE([],[long long i = 0; return (0);],
438	[AC_MSG_RESULT(yes)
439		ISC_PLATFORM_HAVELONGLONG="#define ISC_PLATFORM_HAVELONGLONG 1"],
440	[AC_MSG_RESULT(no)
441		ISC_PLATFORM_HAVELONGLONG="#undef ISC_PLATFORM_HAVELONGLONG"])
442AC_SUBST(ISC_PLATFORM_HAVELONGLONG)
443
444#
445# check for GCC noreturn attribute
446#
447AC_MSG_CHECKING(for GCC noreturn attribute)
448AC_TRY_COMPILE([],[void foo() __attribute__((noreturn));],
449	[AC_MSG_RESULT(yes)
450		ISC_PLATFORM_NORETURN_PRE="#define ISC_PLATFORM_NORETURN_PRE"
451		ISC_PLATFORM_NORETURN_POST="#define ISC_PLATFORM_NORETURN_POST __attribute__((noreturn))"],
452	[AC_MSG_RESULT(no)
453		ISC_PLATFORM_NORETURN_PRE="#define ISC_PLATFORM_NORETURN_PRE"
454		ISC_PLATFORM_NORETURN_POST="#define ISC_PLATFORM_NORETURN_POST"])
455AC_SUBST(ISC_PLATFORM_NORETURN_PRE)
456AC_SUBST(ISC_PLATFORM_NORETURN_POST)
457
458#
459# check if we have lifconf
460#
461AC_MSG_CHECKING(for struct lifconf)
462AC_TRY_COMPILE([
463#include <sys/types.h>
464#include <sys/socket.h>
465#include <net/if.h>
466],
467[
468struct lifconf lifconf;
469lifconf.lifc_len = 0;
470]
471,
472	[AC_MSG_RESULT(yes)
473		ISC_PLATFORM_HAVELIFCONF="#define ISC_PLATFORM_HAVELIFCONF 1"],
474	[AC_MSG_RESULT(no)
475		ISC_PLATFORM_HAVELIFCONF="#undef ISC_PLATFORM_HAVELIFCONF"])
476AC_SUBST(ISC_PLATFORM_HAVELIFCONF)
477
478#
479# check if we want the new statistics
480#
481AC_ARG_ENABLE(newstats,
482	[  --enable-newstats       use the new statistics])
483case "$enable_newstats" in
484yes)
485        AC_DEFINE(NEWSTATS, 1, [Use the new XML schema for statistics])
486	;;
487*)
488	;;
489esac
490
491#
492# check if we want DNS RRL
493#
494AC_ARG_ENABLE(rrl,
495	[  --enable-rrl            use DNS Response Rate Limiting])
496case "$enable_rrl" in
497yes)
498        AC_DEFINE(USE_RRL, 1, [Enable DNS Response Rate Limiting])
499        RRLLINKOBJS='${RRLOBJS}'
500        RRLLINKSRCS='${RRLSRCS}'
501	;;
502*)
503        RRLLINKOBJS=""
504        RRLLINKSRCS=""
505	;;
506esac
507AC_SUBST(RRLLINKOBJS)
508AC_SUBST(RRLLINKSRCS)
509
510#
511# check if we have kqueue
512#
513AC_ARG_ENABLE(kqueue,
514	[  --enable-kqueue         use BSD kqueue when available [[default=yes]]],
515	      want_kqueue="$enableval",  want_kqueue="yes")
516case $want_kqueue in
517yes)
518	AC_CHECK_FUNC(kqueue, ac_cv_have_kqueue=yes, ac_cv_have_kqueue=no)
519	case $ac_cv_have_kqueue in
520	yes)
521		ISC_PLATFORM_HAVEKQUEUE="#define ISC_PLATFORM_HAVEKQUEUE 1"
522		;;
523	*)
524		ISC_PLATFORM_HAVEKQUEUE="#undef ISC_PLATFORM_HAVEKQUEUE"
525		;;
526	esac
527	;;
528*)
529	ISC_PLATFORM_HAVEKQUEUE="#undef ISC_PLATFORM_HAVEKQUEUE"
530	;;
531esac
532AC_SUBST(ISC_PLATFORM_HAVEKQUEUE)
533
534#
535# check if we have epoll.  Linux kernel 2.4 has epoll_create() which fails,
536# so we need to try running the code, not just test its existence.
537#
538AC_ARG_ENABLE(epoll,
539[  --enable-epoll          use Linux epoll when available [[default=auto]]],
540	      want_epoll="$enableval",  want_epoll="auto")
541case $want_epoll in
542auto)
543	AC_MSG_CHECKING(epoll support)
544	AC_TRY_RUN([
545#include <sys/epoll.h>
546int main() {
547	if (epoll_create(1) < 0)
548		return (1);
549	return (0);
550}
551],
552	[AC_MSG_RESULT(yes)
553	ISC_PLATFORM_HAVEEPOLL="#define ISC_PLATFORM_HAVEEPOLL 1"],
554	[AC_MSG_RESULT(no)
555	ISC_PLATFORM_HAVEEPOLL="#undef ISC_PLATFORM_HAVEEPOLL"],
556	[AC_MSG_RESULT(no)
557	ISC_PLATFORM_HAVEEPOLL="#undef ISC_PLATFORM_HAVEEPOLL"])
558	;;
559yes)
560	ISC_PLATFORM_HAVEEPOLL="#define ISC_PLATFORM_HAVEEPOLL 1"
561	;;
562*)
563	ISC_PLATFORM_HAVEEPOLL="#undef ISC_PLATFORM_HAVEEPOLL"
564	;;
565esac
566AC_SUBST(ISC_PLATFORM_HAVEEPOLL)
567
568#
569# check if we support /dev/poll
570#
571AC_ARG_ENABLE(devpoll,
572	[  --enable-devpoll        use /dev/poll when available [[default=yes]]],
573	      want_devpoll="$enableval",  want_devpoll="yes")
574case $want_devpoll in
575yes)
576	AC_CHECK_HEADERS(sys/devpoll.h devpoll.h,
577	ISC_PLATFORM_HAVEDEVPOLL="#define ISC_PLATFORM_HAVEDEVPOLL 1"
578	,
579	ISC_PLATFORM_HAVEDEVPOLL="#undef ISC_PLATFORM_HAVEDEVPOLL"
580	)
581	;;
582*)
583	ISC_PLATFORM_HAVEDEVPOLL="#undef ISC_PLATFORM_HAVEDEVPOLL"
584	;;
585esac
586AC_SUBST(ISC_PLATFORM_HAVEDEVPOLL)
587
588#
589# check if we need to #include sys/select.h explicitly
590#
591case $ac_cv_header_unistd_h in
592yes)
593AC_MSG_CHECKING(if unistd.h or sys/types.h defines fd_set)
594AC_TRY_COMPILE([
595#include <sys/types.h> /* Ultrix */
596#include <unistd.h>],
597[fd_set read_set; return (0);],
598	[AC_MSG_RESULT(yes)
599	 ISC_PLATFORM_NEEDSYSSELECTH="#undef ISC_PLATFORM_NEEDSYSSELECTH"
600	 LWRES_PLATFORM_NEEDSYSSELECTH="#undef LWRES_PLATFORM_NEEDSYSSELECTH"],
601	[AC_MSG_RESULT(no)
602	case $ac_cv_header_sys_select_h in
603	yes)
604	 ISC_PLATFORM_NEEDSYSSELECTH="#define ISC_PLATFORM_NEEDSYSSELECTH 1"
605	 LWRES_PLATFORM_NEEDSYSSELECTH="#define LWRES_PLATFORM_NEEDSYSSELECTH 1"
606		;;
607	no)
608		AC_MSG_ERROR([need either working unistd.h or sys/select.h])
609		;;
610	esac
611	])
612	;;
613no)
614	case $ac_cv_header_sys_select_h in
615	yes)
616	     ISC_PLATFORM_NEEDSYSSELECTH="#define ISC_PLATFORM_NEEDSYSSELECTH 1"
617	     LWRES_PLATFORM_NEEDSYSSELECTH="#define LWRES_PLATFORM_NEEDSYSSELECTH 1"
618		;;
619	no)
620		AC_MSG_ERROR([need either unistd.h or sys/select.h])
621		;;
622	esac
623	;;
624esac
625AC_SUBST(ISC_PLATFORM_NEEDSYSSELECTH)
626AC_SUBST(LWRES_PLATFORM_NEEDSYSSELECTH)
627
628#
629# Find the machine's endian flavor.
630#
631AC_C_BIGENDIAN
632
633#
634# was --with-openssl specified?
635#
636OPENSSL_WARNING=
637AC_MSG_CHECKING(for OpenSSL library)
638AC_ARG_WITH(openssl,
639[  --with-openssl[=PATH]     Build with OpenSSL [yes|no|path].
640			  (Required for DNSSEC)],
641    use_openssl="$withval", use_openssl="auto")
642
643openssldirs="/usr /usr/local /usr/local/ssl /usr/pkg /usr/sfw"
644if test "$use_openssl" = "auto"
645then
646	for d in $openssldirs
647	do
648		if test -f $d/include/openssl/opensslv.h
649		then
650			use_openssl=$d
651			break
652		fi
653	done
654fi
655OPENSSL_ECDSA=""
656OPENSSL_GOST=""
657case "$use_openssl" in
658	no)
659		AC_MSG_RESULT(no)
660		DST_OPENSSL_INC=""
661		USE_OPENSSL=""
662		OPENSSLGOSTLINKOBJS=""
663		OPENSSLGOSTLINKSRS=""
664		OPENSSLLINKOBJS=""
665		OPENSSLLINKSRCS=""
666		;;
667	auto)
668		DST_OPENSSL_INC=""
669		USE_OPENSSL=""
670		OPENSSLGOSTLINKOBJS=""
671		OPENSSLGOSTLINKSRS=""
672		OPENSSLLINKOBJS=""
673		OPENSSLLINKSRCS=""
674		AC_MSG_ERROR(
675[OpenSSL was not found in any of $openssldirs; use --with-openssl=/path
676If you don't want OpenSSL, use --without-openssl])
677		;;
678	*)
679		if test "$use_openssl" = "yes"
680		then
681			# User did not specify a path - guess it
682			for d in $openssldirs
683			do
684				if test -f $d/include/openssl/opensslv.h
685				then
686					use_openssl=$d
687					break
688				fi
689			done
690			if test "$use_openssl" = "yes"
691			then
692				AC_MSG_RESULT(not found)
693				AC_MSG_ERROR(
694[OpenSSL was not found in any of $openssldirs; use --with-openssl=/path])
695			fi
696		elif ! test -f "$use_openssl"/include/openssl/opensslv.h
697		then
698			AC_MSG_ERROR(["$use_openssl/include/openssl/opensslv.h" not found])
699		fi
700		USE_OPENSSL='-DOPENSSL'
701		if test "$use_openssl" = "/usr"
702		then
703			DST_OPENSSL_INC=""
704			DNS_OPENSSL_LIBS="-lcrypto"
705		else
706			DST_OPENSSL_INC="-I$use_openssl/include"
707			case $host in
708			*-solaris*)
709				DNS_OPENSSL_LIBS="-L$use_openssl/lib -R$use_openssl/lib -lcrypto"
710				;;
711			*-hp-hpux*)
712				DNS_OPENSSL_LIBS="-L$use_openssl/lib -Wl,+b: -lcrypto"
713				;;
714			*-apple-darwin*)
715				#
716				# Apple's ld seaches for serially for dynamic
717				# then static libraries.  This means you can't
718				# use -L to override dynamic system libraries
719				# with static ones when linking.  Instead
720				# we specify a absolute path.
721				#
722				if test -f "$use_openssl/lib/libcrypto.dylib"
723				then
724					DNS_OPENSSL_LIBS="-L$use_openssl/lib -lcrypto"
725				else
726					DNS_OPENSSL_LIBS="$use_openssl/lib/libcrypto.a"
727				fi
728				;;
729			*)
730				DNS_OPENSSL_LIBS="-L$use_openssl/lib -lcrypto"
731				;;
732			esac
733		fi
734		AC_MSG_RESULT(using OpenSSL from $use_openssl/lib and $use_openssl/include)
735
736		saved_cflags="$CFLAGS"
737		saved_libs="$LIBS"
738		CFLAGS="$CFLAGS $DST_OPENSSL_INC"
739		LIBS="$LIBS $DNS_OPENSSL_LIBS"
740		AC_MSG_CHECKING(whether linking with OpenSSL works)
741		AC_TRY_RUN([
742#include <openssl/err.h>
743int main() {
744	ERR_clear_error();
745	return (0);
746}
747],
748		[AC_MSG_RESULT(yes)],
749		[AC_MSG_RESULT(no)
750		 AC_MSG_ERROR(Could not run test program using OpenSSL from
751$use_openssl/lib and $use_openssl/include.
752Please check the argument to --with-openssl and your
753shared library configuration (e.g., LD_LIBRARY_PATH).)],
754		[AC_MSG_RESULT(assuming it does work on target platform)])
755
756		AC_MSG_CHECKING(whether linking with OpenSSL requires -ldl)
757		AC_TRY_LINK([
758#include <openssl/err.h>],
759[ DSO_METHOD_dlfcn(); ],
760		[AC_MSG_RESULT(no)],
761		[LIBS="$LIBS -ldl"
762		AC_TRY_LINK([
763#include <openssl/err.h>
764],[ DSO_METHOD_dlfcn(); ],
765		[AC_MSG_RESULT(yes)
766		DNS_OPENSSL_LIBS="$DNS_OPENSSL_LIBS -ldl"
767		],
768		 [AC_MSG_RESULT(unknown)
769		 AC_MSG_ERROR(OpenSSL has unsupported dynamic loading)],
770		[AC_MSG_RESULT(assuming it does work on target platform)])
771		],
772		[AC_MSG_RESULT(assuming it does work on target platform)]
773		)
774		
775AC_ARG_ENABLE(openssl-version-check,
776[AC_HELP_STRING([--enable-openssl-version-check],
777	[Check OpenSSL Version @<:@default=yes@:>@])])
778case "$enable_openssl_version_check" in
779yes|'')
780		AC_MSG_CHECKING(OpenSSL library version)
781		AC_TRY_RUN([
782#include <stdio.h>
783#include <openssl/opensslv.h>
784int main() {
785	if ((OPENSSL_VERSION_NUMBER >= 0x009070cfL &&
786	     OPENSSL_VERSION_NUMBER < 0x00908000L) ||
787	     OPENSSL_VERSION_NUMBER >= 0x0090804fL)
788		return (0);
789	printf("\n\nFound   OPENSSL_VERSION_NUMBER %#010x\n",
790		OPENSSL_VERSION_NUMBER);
791	printf("Require OPENSSL_VERSION_NUMBER 0x009070cf or greater (0.9.7l)\n"
792	       "Require OPENSSL_VERSION_NUMBER 0x0090804f or greater (0.9.8d)\n\n");
793	return (1);
794}
795		],
796		[AC_MSG_RESULT(ok)],
797		[AC_MSG_RESULT(not compatible)
798		 OPENSSL_WARNING=yes
799		],
800		[AC_MSG_RESULT(assuming target platform has compatible version)])
801;;
802no)
803	AC_MSG_RESULT(Skipped OpenSSL version check)
804;;
805esac
806
807        AC_MSG_CHECKING(for OpenSSL DSA support)
808        if test -f $use_openssl/include/openssl/dsa.h
809        then
810                AC_DEFINE(HAVE_OPENSSL_DSA)
811                AC_MSG_RESULT(yes)
812        else
813                AC_MSG_RESULT(no)
814        fi
815
816        AC_CHECK_FUNCS(EVP_sha256 EVP_sha384 EVP_sha512)
817
818        AC_MSG_CHECKING(for OpenSSL ECDSA support)
819        have_ecdsa=""
820        AC_TRY_RUN([
821#include <stdio.h>
822#include <openssl/ecdsa.h>
823#include <openssl/objects.h>
824int main() {
825	EC_KEY *ec256, *ec384;
826
827#if !defined(HAVE_EVP_SHA256) || !defined(HAVE_EVP_SHA384)
828	return (1);
829#endif
830	ec256 = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
831	ec384 = EC_KEY_new_by_curve_name(NID_secp384r1);
832	if (ec256 == NULL || ec384 == NULL)
833		return (2);
834	return (0);
835}
836],
837        [AC_MSG_RESULT(yes)
838        have_ecdsa="yes"],
839        [AC_MSG_RESULT(no)
840        have_ecdsa="no"],
841        [AC_MSG_RESULT(using --with-ecdsa)])
842        AC_ARG_WITH(ecdsa, [  --with-ecdsa            OpenSSL ECDSA],
843	            with_ecdsa="$withval", with_ecdsa="auto")
844        case "$with_ecdsa" in
845        yes)
846            case "$have_ecdsa" in
847            no)  AC_MSG_ERROR([ecdsa not supported]) ;;
848            *)  have_ecdsa=yes ;;
849            esac
850            ;;
851        no)
852            have_ecdsa=no ;;
853        *)
854            case "$have_ecdsa" in
855            yes|no) ;;
856            *) AC_MSG_ERROR([need --with-ecdsa=[[yes or no]]]) ;;
857            esac
858            ;;
859        esac
860        case $have_ecdsa in
861        yes)
862                OPENSSL_ECDSA="yes"
863                AC_DEFINE(HAVE_OPENSSL_ECDSA, 1,
864                          [Define if your OpenSSL version supports ECDSA.])
865                ;;
866        *)
867                ;;
868        esac
869
870        AC_MSG_CHECKING(for OpenSSL GOST support)
871        have_gost=""
872        AC_TRY_RUN([
873#include <openssl/conf.h>
874#include <openssl/engine.h>
875int main() {
876#if (OPENSSL_VERSION_NUMBER >= 0x10000000L)
877	ENGINE *e;
878	EC_KEY *ek;
879
880	ek = NULL;
881	OPENSSL_config(NULL);
882
883	e = ENGINE_by_id("gost");
884	if (e == NULL)
885		return (1);
886	if (ENGINE_init(e) <= 0)
887		return (1);
888	return (0);
889#else
890	return (1);
891#endif
892}
893],
894        [AC_MSG_RESULT(yes)
895        have_gost="yes"],
896        [AC_MSG_RESULT(no)
897        have_gost="no"],
898        [AC_MSG_RESULT(using --with-gost)])
899        AC_ARG_WITH(gost, [  --with-gost             OpenSSL GOST],
900                    with_gost="$withval", with_gost="auto")
901        case "$with_gost" in
902        yes)
903            case "$have_gost" in
904            no)  AC_MSG_ERROR([gost not supported]) ;;
905            *)  have_gost=yes ;;
906            esac
907            ;;
908        no)
909            have_gost=no ;;
910        *)
911            case "$have_gost" in
912            yes|no) ;;
913            *) AC_MSG_ERROR([need --with-gost=[[yes or no]]]) ;;
914            esac
915            ;;
916        esac
917        case $have_gost in
918        yes)
919		OPENSSL_GOST="yes"
920		OPENSSLGOSTLINKOBJS='${OPENSSLGOSTLINKOBJS}'
921		OPENSSLGOSTLINKSRCS='${OPENSSLGOSTLINKSRCS}'
922		AC_DEFINE(HAVE_OPENSSL_GOST, 1,
923			  [Define if your OpenSSL version supports GOST.])
924		;;
925        *)
926                ;;
927        esac
928        CFLAGS="$saved_cflags"
929        LIBS="$saved_libs"
930        OPENSSLLINKOBJS='${OPENSSLLINKOBJS}'
931        OPENSSLLINKSRCS='${OPENSSLLINKSRCS}'
932
933        ;;
934esac
935
936#
937# This would include the system openssl path (and linker options to use
938# it as needed) if it is found.
939#
940
941AC_SUBST(USE_OPENSSL)
942AC_SUBST(DST_OPENSSL_INC)
943AC_SUBST(OPENSSLGOSTLINKOBJS)
944AC_SUBST(OPENSSLGOSTLINKSRCS)
945AC_SUBST(OPENSSLLINKOBJS)
946AC_SUBST(OPENSSLLINKSRCS)
947AC_SUBST(OPENSSL_ECDSA)
948AC_SUBST(OPENSSL_GOST)
949
950DNS_CRYPTO_LIBS="$DNS_CRYPTO_LIBS $DNS_OPENSSL_LIBS"
951
952#
953# Use OpenSSL for hash functions
954#
955
956AC_ARG_ENABLE(openssl-hash,
957	[  --enable-openssl-hash   use OpenSSL for hash functions [[default=no]]],
958	want_openssl_hash="$enableval", want_openssl_hash="no")
959case $want_openssl_hash in
960	yes)
961		if test "$USE_OPENSSL" = ""
962		then
963			AC_MSG_ERROR([No OpenSSL for hash functions])
964		fi
965		ISC_PLATFORM_OPENSSLHASH="#define ISC_PLATFORM_OPENSSLHASH 1"
966		ISC_OPENSSL_INC="$DST_OPENSSL_INC"
967		;;
968	no)
969		ISC_PLATFORM_OPENSSLHASH="#undef ISC_PLATFORM_OPENSSLHASH"
970		ISC_OPENSSL_INC=""
971		;;
972esac
973AC_SUBST(ISC_PLATFORM_OPENSSLHASH)
974AC_SUBST(ISC_OPENSSL_INC)
975
976#
977# PKCS11 (aka crypto hardware) support
978#
979# This works only with the right OpenSSL with PKCS11 engine!
980#
981
982AC_MSG_CHECKING(for PKCS11 support)
983AC_ARG_WITH(pkcs11,
984[  --with-pkcs11[=PATH]      Build with PKCS11 support [yes|no|path]
985                          (PATH is for the PKCS11 provider)],
986   use_pkcs11="$withval", use_pkcs11="no")
987
988case "$use_pkcs11" in
989	no|'')
990		AC_MSG_RESULT(disabled)
991		USE_PKCS11=''
992		PKCS11_TOOLS=''
993		;;
994	yes|*)
995		AC_MSG_RESULT(using OpenSSL with PKCS11 support)
996		USE_PKCS11='-DUSE_PKCS11'
997		PKCS11_TOOLS=pkcs11
998		;;
999esac
1000AC_SUBST(USE_PKCS11)
1001AC_SUBST(PKCS11_TOOLS)
1002
1003AC_MSG_CHECKING(for PKCS11 tools)
1004case "$use_pkcs11" in
1005	no|yes|'')
1006		AC_MSG_RESULT(disabled)
1007		PKCS11_PROVIDER="undefined"
1008		;;
1009       *)
1010		AC_MSG_RESULT(PKCS11 provider is "$use_pkcs11")
1011		PKCS11_PROVIDER="$use_pkcs11"
1012		;;
1013esac
1014AC_SUBST(PKCS11_PROVIDER)
1015
1016AC_MSG_CHECKING(for GSSAPI library)
1017AC_ARG_WITH(gssapi,
1018[  --with-gssapi=PATH      Specify path for system-supplied GSSAPI [[default=yes]]],
1019    use_gssapi="$withval", use_gssapi="yes")
1020
1021# gssapi is just the framework, we really require kerberos v5, so
1022# look for those headers (the gssapi headers must be there, too)
1023# The problem with this implementation is that it doesn't allow
1024# for the specification of gssapi and krb5 headers in different locations,
1025# which probably ought to be fixed although fixing might raise the issue of
1026# trying to build with incompatible versions of gssapi and krb5.
1027if test "$use_gssapi" = "yes"
1028then
1029	# first, deal with the obvious
1030	if test \( -f /usr/include/kerberosv5/krb5.h -o \
1031		   -f /usr/include/krb5/krb5.h -o \
1032		   -f /usr/include/krb5.h \)   -a \
1033		\( -f /usr/include/gssapi.h -o \
1034		   -f /usr/include/gssapi/gssapi.h \)
1035	then
1036		use_gssapi=/usr
1037	else
1038	    krb5dirs="/usr/local /usr/local/krb5 /usr/local/kerberosv5 /usr/local/kerberos /usr/pkg /usr/krb5 /usr/kerberosv5 /usr/kerberos /usr"
1039	    for d in $krb5dirs
1040	    do
1041		if test -f $d/include/gssapi/gssapi_krb5.h -o \
1042		        -f $d/include/krb5.h
1043		then
1044			if test -f $d/include/gssapi/gssapi.h -o \
1045			        -f $d/include/gssapi.h
1046			then
1047				use_gssapi=$d
1048				break
1049			fi
1050		fi
1051		use_gssapi="no"
1052	    done
1053	fi
1054fi
1055
1056case "$use_gssapi" in
1057	no)
1058		AC_MSG_RESULT(disabled)
1059		USE_GSSAPI=''
1060		;;
1061	yes)
1062		AC_MSG_ERROR([--with-gssapi must specify a path])
1063		;;
1064	*)
1065		AC_MSG_RESULT(looking in $use_gssapi/lib)
1066		USE_GSSAPI='-DGSSAPI'
1067		saved_cppflags="$CPPFLAGS"
1068		CPPFLAGS="-I$use_gssapi/include $CPPFLAGS"
1069		AC_CHECK_HEADERS(gssapi.h gssapi/gssapi.h,
1070		    [ISC_PLATFORM_GSSAPIHEADER="#define ISC_PLATFORM_GSSAPIHEADER <$ac_header>"])
1071
1072		if test "$ISC_PLATFORM_GSSAPIHEADER" = ""; then
1073		    AC_MSG_ERROR([gssapi.h not found])
1074		fi
1075
1076		AC_CHECK_HEADERS(gssapi_krb5.h gssapi/gssapi_krb5.h,
1077		    [ISC_PLATFORM_GSSAPI_KRB5_HEADER="#define ISC_PLATFORM_GSSAPI_KRB5_HEADER <$ac_header>"])
1078
1079		AC_CHECK_HEADERS(krb5.h krb5/krb5.h kerberosv5/krb5.h,
1080		    [ISC_PLATFORM_KRB5HEADER="#define ISC_PLATFORM_KRB5HEADER <$ac_header>"])
1081
1082		if test "$ISC_PLATFORM_KRB5HEADER" = ""; then
1083		    AC_MSG_ERROR([krb5.h not found])
1084		fi
1085
1086		CPPFLAGS="$saved_cppflags"
1087
1088		#
1089		# XXXDCL This probably doesn't work right on all systems.
1090		# It will need to be worked on as problems become evident.
1091		#
1092		# Essentially the problems here relate to two different
1093		# areas.  The first area is building with either KTH
1094		# or MIT Kerberos, particularly when both are present on
1095		# the machine.  The other is static versus dynamic linking.
1096		#
1097		# On the KTH vs MIT issue, Both have libkrb5 that can mess
1098		# up the works if one implementation ends up trying to
1099		# use the other's krb.  This is unfortunately a situation
1100		# that very easily arises.
1101		#
1102		# Dynamic linking when the dependency information is built
1103		# into MIT's libgssapi_krb5 or KTH's libgssapi magically makes
1104		# all such problems go away, but when that setup is not
1105		# present, because either the dynamic libraries lack
1106		# dependencies or static linking is being done, then the
1107		# problems start to show up.
1108		saved_libs="$LIBS"
1109		for TRY_LIBS in \
1110		    "-lgssapi_krb5" \
1111		    "-lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err" \
1112		    "-lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -lresolv" \
1113		    "-lgssapi" \
1114		    "-lgssapi -lkrb5 -ldes -lcrypt -lasn1 -lroken -lcom_err" \
1115		    "-lgssapi -lkrb5 -lcrypto -lcrypt -lasn1 -lroken -lcom_err" \
1116		    "-lgssapi -lkrb5 -lhx509 -lcrypto -lcrypt -lasn1 -lroken -lcom_err" \
1117		    "-lgss -lkrb5"
1118		do
1119		    # Note that this does not include $saved_libs, because
1120		    # on FreeBSD machines this configure script has added
1121		    # -L/usr/local/lib to LIBS, which can make the
1122		    # -lgssapi_krb5 test succeed with shared libraries even
1123		    # when you are trying to build with KTH in /usr/lib.
1124		    if test "$use_gssapi" = "/usr"
1125		    then
1126			    LIBS="$TRY_LIBS"
1127		    else
1128			    LIBS="-L$use_gssapi/lib $TRY_LIBS"
1129		    fi
1130		    AC_MSG_CHECKING(linking as $TRY_LIBS)
1131		    AC_TRY_LINK( , [gss_acquire_cred();krb5_init_context()],
1132				gssapi_linked=yes, gssapi_linked=no)
1133		    case $gssapi_linked in
1134		    yes) AC_MSG_RESULT(yes); break ;;
1135		    no)  AC_MSG_RESULT(no) ;;
1136		    esac
1137		done
1138
1139		case $gssapi_linked in
1140		no) AC_MSG_ERROR(could not determine proper GSSAPI linkage) ;;
1141		esac
1142
1143		#
1144		# XXXDCL Major kludge.  Tries to cope with KTH in /usr/lib
1145		# but MIT in /usr/local/lib and trying to build with KTH.
1146		# /usr/local/lib can end up earlier on the link lines.
1147		# Like most kludges, this one is not only inelegant it
1148		# is also likely to be the wrong thing to do at least as
1149		# many times as it is the right thing.  Something better
1150		# needs to be done.
1151		#
1152		if test "$use_gssapi" = "/usr" -a \
1153			-f /usr/local/lib/libkrb5.a; then
1154		    FIX_KTH_VS_MIT=yes
1155		fi
1156
1157		case "$FIX_KTH_VS_MIT" in
1158		yes)
1159		    case "$enable_static_linking" in
1160		    yes) gssapi_lib_suffix=".a"  ;;
1161		    *)   gssapi_lib_suffix=".so" ;;
1162		    esac
1163
1164		    for lib in $LIBS; do
1165			case $lib in
1166			-L*)
1167			    ;;
1168			-l*)
1169			    new_lib=`echo $lib |
1170				     sed -e s%^-l%$use_gssapi/lib/lib% \
1171					 -e s%$%$gssapi_lib_suffix%`
1172			    NEW_LIBS="$NEW_LIBS $new_lib"
1173			    ;;
1174			*)
1175			   AC_MSG_ERROR([KTH vs MIT Kerberos confusion!])
1176			    ;;
1177			esac
1178		    done
1179		    LIBS="$NEW_LIBS"
1180		    ;;
1181		esac
1182
1183		DST_GSSAPI_INC="-I$use_gssapi/include"
1184		DNS_GSSAPI_LIBS="$LIBS"
1185
1186		AC_MSG_RESULT(using GSSAPI from $use_gssapi/lib and $use_gssapi/include)
1187		LIBS="$saved_libs"
1188		;;
1189esac
1190
1191AC_SUBST(ISC_PLATFORM_HAVEGSSAPI)
1192AC_SUBST(ISC_PLATFORM_GSSAPIHEADER)
1193AC_SUBST(ISC_PLATFORM_GSSAPI_KRB5_HEADER)
1194AC_SUBST(ISC_PLATFORM_KRB5HEADER)
1195
1196AC_SUBST(USE_GSSAPI)
1197AC_SUBST(DST_GSSAPI_INC)
1198AC_SUBST(DNS_GSSAPI_LIBS)
1199DNS_CRYPTO_LIBS="$DNS_GSSAPI_LIBS $DNS_CRYPTO_LIBS"
1200
1201#
1202# Applications linking with libdns also need to link with these libraries.
1203#
1204
1205AC_SUBST(DNS_CRYPTO_LIBS)
1206
1207#
1208# was --with-randomdev specified?
1209#
1210AC_MSG_CHECKING(for random device)
1211AC_ARG_WITH(randomdev,
1212[  --with-randomdev=PATH   Specify path for random device],
1213    use_randomdev="$withval", use_randomdev="unspec")
1214
1215case "$use_randomdev" in
1216	unspec)
1217		case "$cross_compiling" in
1218		yes)
1219			AC_MSG_RESULT(unspecified)
1220			AC_MSG_ERROR([ need --with-randomdev=PATH or --with-randomdev=no])
1221		esac
1222		case "$host" in
1223			*-openbsd*)
1224				devrandom=/dev/arandom
1225				;;
1226			*)
1227				devrandom=/dev/random
1228				;;
1229		esac
1230		AC_MSG_RESULT($devrandom)
1231		AC_CHECK_FILE($devrandom,
1232			      AC_DEFINE_UNQUOTED(PATH_RANDOMDEV,
1233						 "$devrandom"),)
1234			      
1235		;;
1236	yes)
1237		AC_MSG_ERROR([--with-randomdev must specify a path])
1238		;;
1239	no)
1240		AC_MSG_RESULT(disabled)
1241		;;
1242	*)
1243		AC_DEFINE_UNQUOTED(PATH_RANDOMDEV, "$use_randomdev")
1244		AC_MSG_RESULT(using "$use_randomdev")
1245		;;
1246esac
1247
1248#
1249# Do we have arc4random() ?
1250#
1251AC_CHECK_FUNC(arc4random, AC_DEFINE(HAVE_ARC4RANDOM))
1252
1253sinclude(config.threads.in)dnl
1254
1255if $use_threads
1256then
1257	if test "X$GCC" = "Xyes"; then
1258		case "$host" in
1259		*-freebsd*)
1260			CC="$CC -pthread"
1261			CCOPT="$CCOPT -pthread"
1262			CCNOOPT="$CCNOOPT -pthread"
1263			STD_CDEFINES="$STD_CDEFINES -D_THREAD_SAFE"
1264			;;
1265		*-openbsd*)
1266			CC="$CC -pthread"
1267			CCOPT="$CCOPT -pthread"
1268			CCNOOPT="$CCNOOPT -pthread"
1269			;;
1270		*-solaris*)
1271			LIBS="$LIBS -lthread"
1272			;;
1273		*-ibm-aix*)
1274			STD_CDEFINES="$STD_CDEFINES -D_THREAD_SAFE"
1275			;;
1276		esac
1277	else
1278		case $host in
1279		*-dec-osf*)
1280			CC="$CC -pthread"
1281			CCOPT="$CCOPT -pthread"
1282			CCNOOPT="$CCNOOPT -pthread"
1283			;;
1284		*-solaris*)
1285			CC="$CC -mt"
1286			CCOPT="$CCOPT -mt"
1287			CCNOOPT="$CCNOOPT -mt"
1288			;;
1289		*-ibm-aix*)
1290			STD_CDEFINES="$STD_CDEFINES -D_THREAD_SAFE"
1291			;;
1292		*-sco-sysv*uw*|*-*-sysv*UnixWare*)
1293			CC="$CC -Kthread"
1294			CCOPT="$CCOPT -Kthread"
1295			CCNOOPT="$CCNOOPT -Kthread"
1296			;;
1297		*-*-sysv*OpenUNIX*)
1298			CC="$CC -Kpthread"
1299			CCOPT="$CCOPT -Kpthread"
1300			CCNOOPT="$CCNOOPT -Kpthread"
1301			;;
1302		esac
1303	fi
1304	ALWAYS_DEFINES="-D_REENTRANT"
1305	ISC_PLATFORM_USETHREADS="#define ISC_PLATFORM_USETHREADS 1"
1306	THREADOPTOBJS='${THREADOPTOBJS}'
1307	THREADOPTSRCS='${THREADOPTSRCS}'
1308	thread_dir=pthreads
1309	#
1310	# We'd like to use sigwait() too
1311	#
1312	AC_CHECK_FUNC(sigwait,
1313		      AC_DEFINE(HAVE_SIGWAIT),
1314		      AC_CHECK_LIB(c, sigwait,
1315		      AC_DEFINE(HAVE_SIGWAIT),
1316		      AC_CHECK_LIB(pthread, sigwait,
1317				   AC_DEFINE(HAVE_SIGWAIT),
1318				   AC_CHECK_LIB(pthread, _Psigwait,
1319						AC_DEFINE(HAVE_SIGWAIT),))))
1320
1321	AC_CHECK_FUNC(pthread_attr_getstacksize,
1322		      AC_DEFINE(HAVE_PTHREAD_ATTR_GETSTACKSIZE),)
1323
1324	AC_CHECK_FUNC(pthread_attr_setstacksize,
1325		      AC_DEFINE(HAVE_PTHREAD_ATTR_SETSTACKSIZE),)
1326
1327	AC_CHECK_HEADERS(sched.h)
1328
1329	case "$host" in
1330	*solaris-*)
1331		AC_CHECK_LIB(rt, sched_yield)
1332		;;
1333	esac
1334
1335	AC_CHECK_FUNCS(sched_yield pthread_yield pthread_yield_np)
1336
1337	#
1338	# Additional OS-specific issues related to pthreads and sigwait.
1339	#
1340	case "$host" in
1341		#
1342		# One more place to look for sigwait.
1343		#
1344		*-freebsd*)
1345			AC_CHECK_LIB(c_r, sigwait, AC_DEFINE(HAVE_SIGWAIT),)
1346			case $host in
1347			*-freebsd5.[[012]]|*-freebsd5.[[012]].*);;
1348			*-freebsd5.[[3456789]]|*-freebsd5.[[3456789]].*)
1349				AC_DEFINE(NEED_PTHREAD_SCOPE_SYSTEM)
1350				;;
1351			*-freebsd6.*)
1352				AC_DEFINE(NEED_PTHREAD_SCOPE_SYSTEM)
1353				;;
1354			esac
1355			;;
1356		#
1357		# BSDI 3.0 through 4.0.1 needs pthread_init() to be
1358		# called before certain pthreads calls.	 This is deprecated
1359		# in BSD/OS 4.1.
1360		#
1361		*-bsdi3.*|*-bsdi4.0*)
1362			AC_DEFINE(NEED_PTHREAD_INIT)
1363			;;
1364		#
1365		# LinuxThreads requires some changes to the way we
1366		# deal with signals.
1367		#
1368		*-linux*)
1369			AC_DEFINE(HAVE_LINUXTHREADS)
1370			;;
1371		#
1372		# Ensure the right sigwait() semantics on Solaris and make
1373		# sure we call pthread_setconcurrency.
1374		#
1375		*-solaris*)
1376			AC_DEFINE(_POSIX_PTHREAD_SEMANTICS)
1377			AC_CHECK_FUNC(pthread_setconcurrency,
1378				      AC_DEFINE(CALL_PTHREAD_SETCONCURRENCY))
1379			;;
1380		#
1381		# UnixWare does things its own way.
1382		#
1383		*-sco-sysv*uw*|*-*-sysv*UnixWare*|*-*-sysv*OpenUNIX*)
1384			AC_DEFINE(HAVE_UNIXWARE_SIGWAIT)
1385			;;
1386	esac
1387
1388	#
1389	# Look for sysconf to allow detection of the number of processors.
1390	#
1391	AC_CHECK_FUNC(sysconf, AC_DEFINE(HAVE_SYSCONF),)
1392
1393else
1394	ISC_PLATFORM_USETHREADS="#undef ISC_PLATFORM_USETHREADS"
1395	thread_dir=nothreads
1396	THREADOPTOBJS=""
1397	THREADOPTSRCS=""
1398	ALWAYS_DEFINES=""
1399fi
1400
1401AC_SUBST(ALWAYS_DEFINES)
1402AC_SUBST(ISC_PLATFORM_USETHREADS)
1403AC_SUBST(THREADOPTOBJS)
1404AC_SUBST(THREADOPTSRCS)
1405ISC_THREAD_DIR=$thread_dir
1406AC_SUBST(ISC_THREAD_DIR)
1407
1408#
1409# was --with-libxml2 specified?
1410#
1411AC_MSG_CHECKING(for libxml2 library)
1412AC_ARG_WITH(libxml2,
1413[  --with-libxml2[=PATH]     Build with libxml2 library [yes|no|path]],
1414    use_libxml2="$withval", use_libxml2="auto")
1415
1416case "$use_libxml2" in
1417	no)
1418		DST_LIBXML2_INC=""
1419		;;
1420	auto|yes)
1421		case X`(xml2-config --version) 2>/dev/null` in
1422		X2.[[6789]].*)
1423			libxml2_libs=`xml2-config --libs`
1424			libxml2_cflags=`xml2-config --cflags`
1425			;;
1426		*)
1427			libxml2_libs=
1428			libxml2_cflags=
1429			;;
1430		esac
1431		;;
1432	*)
1433		if test -f "$use_libxml2/bin/xml2-config" ; then
1434			libxml2_libs=`$use_libxml2/bin/xml2-config --libs`
1435			libxml2_cflags=`$use_libxml2/bin/xml2-config --cflags`
1436		fi
1437		;;
1438esac
1439
1440if test "X$libxml2_libs" != "X"
1441then
1442	AC_MSG_RESULT(yes)
1443	CFLAGS="$CFLAGS $libxml2_cflags"
1444	LIBS="$LIBS $libxml2_libs"
1445	AC_DEFINE(HAVE_LIBXML2, 1, [Define if libxml2 was found])
1446else
1447	AC_MSG_RESULT(no)
1448fi
1449
1450#
1451# In solaris 10, SMF can manage named service
1452#
1453AC_CHECK_LIB(scf, smf_enable_instance)
1454
1455#
1456# flockfile is usually provided by pthreads, but we may want to use it
1457# even if compiled with --disable-threads.  getc_unlocked might also not
1458# be defined.
1459#
1460AC_CHECK_FUNC(flockfile, AC_DEFINE(HAVE_FLOCKFILE),)
1461AC_CHECK_FUNC(getc_unlocked, AC_DEFINE(HAVE_GETCUNLOCKED),)
1462
1463#
1464# Indicate what the final decision was regarding threads.
1465#
1466AC_MSG_CHECKING(whether to build with threads)
1467if $use_threads; then
1468	AC_MSG_RESULT(yes)
1469else
1470	AC_MSG_RESULT(no)
1471fi
1472
1473#
1474# End of pthreads stuff.
1475#
1476
1477#
1478# Large File
1479#
1480AC_ARG_ENABLE(largefile, [  --enable-largefile	  64-bit file support],
1481	      want_largefile="yes", want_largefile="no")
1482case $want_largefile in
1483	yes)
1484		ALWAYS_DEFINES="$ALWAYS_DEFINES -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
1485		;;
1486	*)
1487		;;
1488esac
1489
1490#
1491# Additional compiler settings.
1492#
1493MKDEPCC="$CC"
1494MKDEPCFLAGS="-M"
1495IRIX_DNSSEC_WARNINGS_HACK=""
1496
1497if test "X$GCC" = "Xyes"; then
1498	AC_MSG_CHECKING(if "$CC" supports -fno-strict-aliasing)
1499	SAVE_CFLAGS=$CFLAGS
1500	CFLAGS="$CFLAGS -fno-strict-aliasing"
1501	AC_TRY_COMPILE(,, [FNOSTRICTALIASING=yes],[FNOSTRICTALIASING=no])
1502	CFLAGS=$SAVE_CFLAGS
1503	if test "$FNOSTRICTALIASING" = "yes"; then
1504		AC_MSG_RESULT(yes)
1505	STD_CWARNINGS="$STD_CWARNINGS -W -Wall -Wmissing-prototypes -Wcast-qual -Wwrite-strings -Wformat -Wpointer-arith -fno-strict-aliasing"
1506	else
1507		AC_MSG_RESULT(no)
1508	STD_CWARNINGS="$STD_CWARNINGS -W -Wall -Wmissing-prototypes -Wcast-qual -Wwrite-strings -Wformat -Wpointer-arith"
1509	fi
1510	case "$host" in
1511	*-hp-hpux*)
1512		LDFLAGS="-Wl,+vnocompatwarnings $LDFLAGS"
1513		;;
1514	esac
1515else
1516	case $host in
1517	*-dec-osf*)
1518		CC="$CC -std"
1519		CCOPT="$CCOPT -std"
1520		CCNOOPT="$CCNOOPT -std"
1521		MKDEPCC="$CC"
1522		;;
1523	*-hp-hpux*)
1524		CC="$CC -Ae -z"
1525		# The version of the C compiler that constantly warns about
1526		# 'const' as well as alignment issues is unfortunately not
1527		# able to be discerned via the version of the operating
1528		# system, nor does cc have a version flag.
1529		case "`$CC +W 123 2>&1`" in
1530		*Unknown?option*)
1531			STD_CWARNINGS="+w1"
1532			;;
1533		*)
1534			# Turn off the pointlessly noisy warnings.
1535			STD_CWARNINGS="+w1 +W 474,530,2193,2236"
1536			;;
1537		esac
1538		CCOPT="$CCOPT -Ae -z"
1539		CCNOOPT="$CCNOOPT -Ae -z"
1540		LDFLAGS="-Wl,+vnocompatwarnings $LDFLAGS"
1541		MKDEPPROG='cc -Ae -E -Wp,-M >/dev/null 2>>$TMP'
1542		;;
1543	*-sgi-irix*)
1544		STD_CWARNINGS="-fullwarn -woff 1209"
1545		#
1546		# Silence more than 250 instances of
1547		#   "prototyped function redeclared without prototype"
1548		# and 11 instances of
1549		#   "variable ... was set but never used"
1550		# from lib/dns/sec/openssl.
1551		#
1552		IRIX_DNSSEC_WARNINGS_HACK="-woff 1692,1552"
1553		;;
1554	*-solaris*)
1555		MKDEPCFLAGS="-xM"
1556		;;
1557	*-sco-sysv*uw*|*-*-sysv*UnixWare*|*-*-sysv*OpenUNIX*)
1558		# UnixWare
1559		CC="$CC -w"
1560		;;
1561	esac
1562fi
1563
1564AC_SUBST(MKDEPCC)
1565AC_SUBST(MKDEPCFLAGS)
1566AC_SUBST(MKDEPPROG)
1567AC_SUBST(IRIX_DNSSEC_WARNINGS_HACK)
1568
1569#
1570# NLS
1571#
1572AC_CHECK_FUNC(catgets, AC_DEFINE(HAVE_CATGETS),)
1573
1574#
1575# -lxnet buys us one big porting headache...  standards, gotta love 'em.
1576#
1577# AC_CHECK_LIB(xnet, socket, ,
1578#    AC_CHECK_LIB(socket, socket)
1579# )
1580#
1581# Use this for now, instead:
1582#
1583case "$host" in
1584	mips-sgi-irix*)
1585		;;
1586	*-linux*)
1587		;;
1588	*)
1589		AC_CHECK_LIB(socket, socket)
1590		AC_CHECK_LIB(nsl, inet_addr)
1591		;;
1592esac
1593
1594#
1595# Work around Solaris's select() limitations.
1596#
1597case "$host" in
1598	*-solaris2.[[89]]|*-solaris2.1?)
1599	AC_DEFINE(FD_SETSIZE, 65536,
1600		  [Solaris hack to get select_large_fdset.])
1601	;;
1602esac
1603
1604#
1605# Purify support
1606#
1607AC_MSG_CHECKING(whether to use purify)
1608AC_ARG_WITH(purify,
1609	[  --with-purify[=PATH]      use Rational purify],
1610	use_purify="$withval", use_purify="no")
1611
1612case "$use_purify" in
1613	no)
1614		;;
1615	yes)
1616		AC_PATH_PROG(purify_path, purify, purify)
1617		;;
1618	*)
1619		purify_path="$use_purify"
1620		;;
1621esac
1622
1623case "$use_purify" in
1624	no)
1625		AC_MSG_RESULT(no)
1626		PURIFY=""
1627		;;
1628	*)
1629		if test -f $purify_path || test $purify_path = purify; then
1630			AC_MSG_RESULT($purify_path)
1631			PURIFYFLAGS="`echo $PURIFYOPTIONS`"
1632			PURIFY="$purify_path $PURIFYFLAGS"
1633		else
1634			AC_MSG_ERROR([$purify_path not found.
1635
1636Please choose the proper path with the following command:
1637
1638    configure --with-purify=PATH
1639])
1640		fi
1641		;;
1642esac
1643
1644AC_SUBST(PURIFY)
1645
1646
1647AC_ARG_WITH(libtool,
1648	    [  --with-libtool          use GNU libtool],
1649	    use_libtool="$withval", use_libtool="no")
1650
1651case $use_libtool in
1652	yes)
1653		AM_PROG_LIBTOOL
1654		O=lo
1655		A=la
1656		LIBTOOL_MKDEP_SED='s;\.o;\.lo;'
1657		LIBTOOL_MODE_COMPILE='--mode=compile --tag=CC'
1658		LIBTOOL_MODE_INSTALL='--mode=install --tag=CC'
1659		LIBTOOL_MODE_LINK='--mode=link --tag=CC'
1660		case "$host" in
1661		*) LIBTOOL_ALLOW_UNDEFINED= ;;
1662		esac
1663		case "$host" in
1664		*-ibm-aix*) LIBTOOL_IN_MAIN="-Wl,-bI:T_testlist.imp" ;;
1665		*) LIBTOOL_IN_MAIN= ;;
1666		esac;
1667		;;
1668	*)
1669		O=o
1670		A=a
1671		LIBTOOL=
1672		AC_SUBST(LIBTOOL)
1673		LIBTOOL_MKDEP_SED=
1674		LIBTOOL_MODE_COMPILE=
1675		LIBTOOL_MODE_INSTALL=
1676		LIBTOOL_MODE_LINK=
1677		LIBTOOL_ALLOW_UNDEFINED=
1678		LIBTOOL_IN_MAIN=
1679		;;
1680esac
1681
1682#
1683# enable/disable dumping stack backtrace.  Also check if the system supports
1684# glibc-compatible backtrace() function.
1685#
1686AC_ARG_ENABLE(backtrace,
1687[  --enable-backtrace      log stack backtrace on abort [[default=yes]]],
1688	      want_backtrace="$enableval",  want_backtrace="yes")
1689case $want_backtrace in
1690yes)
1691	ISC_PLATFORM_USEBACKTRACE="#define ISC_PLATFORM_USEBACKTRACE 1"
1692	AC_TRY_LINK([#include <execinfo.h>],
1693	[return (backtrace((void **)0, 0));],
1694	[AC_DEFINE([HAVE_LIBCTRACE], [], [if system have backtrace function])],)
1695	;;
1696*)
1697	ISC_PLATFORM_USEBACKTRACE="#undef ISC_PLATFORM_USEBACKTRACE"
1698	;;
1699esac
1700AC_SUBST(ISC_PLATFORM_USEBACKTRACE)
1701
1702AC_ARG_ENABLE(symtable,
1703[  --enable-symtable       use internal symbol table for backtrace
1704                          [[all|minimal(default)|none]]],
1705		want_symtable="$enableval",  want_symtable="minimal")
1706case $want_symtable in
1707yes|all|minimal)     # "yes" is a hidden value equivalent to "minimal"
1708	if test "$PERL" = ""
1709	then
1710		AC_MSG_ERROR([Internal symbol table requires perl but no perl is found.
1711Install perl or explicitly disable the feature by --disable-symtable.])
1712	fi
1713	if test "$use_libtool" = "yes"; then
1714		AC_MSG_WARN([Internal symbol table does not work with libtool.  Disabling symbol table.])
1715	else
1716		# we generate the internal symbol table only for those systems
1717		# known to work to avoid unexpected build failure.  Also, warn
1718		# about unsupported systems when the feature is enabled
1719		#  manually.
1720		case $host_os in
1721		freebsd*|netbsd*|openbsd*|linux*|solaris*|darwin*)
1722			MKSYMTBL_PROGRAM="$PERL"
1723			if test $want_symtable = all; then
1724				ALWAYS_MAKE_SYMTABLE="yes"
1725			fi
1726			;;
1727		*)
1728			if test $want_symtable = yes -o $want_symtable = all
1729			then
1730				AC_MSG_WARN([this system is not known to generate internal symbol table safely; disabling it])
1731			fi
1732		esac
1733	fi
1734	;;
1735*)
1736	;;
1737esac
1738AC_SUBST(MKSYMTBL_PROGRAM)
1739AC_SUBST(ALWAYS_MAKE_SYMTABLE)
1740
1741#
1742# File name extension for static archive files, for those few places
1743# where they are treated differently from dynamic ones.
1744#
1745SA=a
1746
1747AC_SUBST(O)
1748AC_SUBST(A)
1749AC_SUBST(SA)
1750AC_SUBST(LIBTOOL_MKDEP_SED)
1751AC_SUBST(LIBTOOL_MODE_COMPILE)
1752AC_SUBST(LIBTOOL_MODE_INSTALL)
1753AC_SUBST(LIBTOOL_MODE_LINK)
1754AC_SUBST(LIBTOOL_ALLOW_UNDEFINED)
1755AC_SUBST(LIBTOOL_IN_MAIN)
1756
1757#
1758# build exportable DNS library?
1759#
1760AC_ARG_ENABLE(exportlib,
1761	[  --enable-exportlib	  build exportable library (GNU make required)
1762                          [[default=no]]])
1763case "$enable_exportlib" in
1764	yes)
1765		gmake=
1766		for x in gmake gnumake make; do
1767			if $x --version 2>/dev/null | grep GNU > /dev/null; then
1768				gmake=$x
1769				break;
1770			fi
1771		done
1772		if test -z "$gmake"; then
1773			AC_MSG_ERROR([exportlib requires GNU make.  Install it or disable the feature.])
1774		fi
1775		LIBEXPORT=lib/export
1776		AC_SUBST(LIBEXPORT)
1777		BIND9_CO_RULE="%.$O:  \${srcdir}/%.c"
1778		;;
1779	no|*)
1780		BIND9_CO_RULE=".c.$O:"
1781		;;
1782esac
1783AC_SUBST(BIND9_CO_RULE)
1784
1785AC_ARG_WITH(export-libdir,
1786	[  --with-export-libdir[=PATH]
1787                          installation directory for the export library
1788                          [[EPREFIX/lib/bind9]]],
1789	export_libdir="$withval",)
1790if test -z "$export_libdir"; then
1791	export_libdir="\${exec_prefix}/lib/bind9/"
1792fi
1793AC_SUBST(export_libdir)
1794
1795AC_ARG_WITH(export-includedir,
1796	[  --with-export-includedir[=PATH]
1797                          installation directory for the header files of the
1798                          export library [[PREFIX/include/bind9]]],
1799	export_includedir="$withval",)
1800if test -z "$export_includedir"; then
1801	export_includedir="\${prefix}/include/bind9/"
1802fi
1803AC_SUBST(export_includedir)
1804
1805#
1806# Here begins a very long section to determine the system's networking
1807# capabilities.  The order of the tests is significant.
1808#
1809
1810#
1811# IPv6
1812#
1813AC_ARG_ENABLE(ipv6,
1814	[  --enable-ipv6           use IPv6 [default=autodetect]])
1815
1816case "$enable_ipv6" in
1817	yes|''|autodetect)
1818		AC_DEFINE(WANT_IPV6)
1819		;;
1820	no)
1821		;;
1822esac
1823
1824#
1825# We do the IPv6 compilation checking after libtool so that we can put
1826# the right suffix on the files.
1827#
1828AC_MSG_CHECKING(for IPv6 structures)
1829AC_TRY_COMPILE([
1830#include <sys/types.h>
1831#include <sys/socket.h>
1832#include <netinet/in.h>],
1833[struct sockaddr_in6 sin6; return (0);],
1834	[AC_MSG_RESULT(yes)
1835	 found_ipv6=yes],
1836	[AC_MSG_RESULT(no)
1837	 found_ipv6=no])
1838
1839#
1840# See whether IPv6 support is provided via a Kame add-on.
1841# This is done before other IPv6 linking tests to LIBS is properly set.
1842#
1843AC_MSG_CHECKING(for Kame IPv6 support)
1844AC_ARG_WITH(kame,
1845	[  --with-kame[=PATH]	  use Kame IPv6 [default path /usr/local/v6]],
1846	use_kame="$withval", use_kame="no")
1847
1848case "$use_kame" in
1849	no)
1850		;;
1851	yes)
1852		kame_path=/usr/local/v6
1853		;;
1854	*)
1855		kame_path="$use_kame"
1856		;;
1857esac
1858
1859case "$use_kame" in
1860	no)
1861		AC_MSG_RESULT(no)
1862		;;
1863	*)
1864		if test -f $kame_path/lib/libinet6.a; then
1865			AC_MSG_RESULT($kame_path/lib/libinet6.a)
1866			LIBS="-L$kame_path/lib -linet6 $LIBS"
1867		else
1868			AC_MSG_ERROR([$kame_path/lib/libinet6.a not found.
1869
1870Please choose the proper path with the following command:
1871
1872    configure --with-kame=PATH
1873])
1874		fi
1875		;;
1876esac
1877
1878#
1879# Whether netinet6/in6.h is needed has to be defined in isc/platform.h.
1880# Including it on Kame-using platforms is very bad, though, because
1881# Kame uses #error against direct inclusion.   So include it on only
1882# the platform that is otherwise broken without it -- BSD/OS 4.0 through 4.1.
1883# This is done before the in6_pktinfo check because that's what
1884# netinet6/in6.h is needed for.
1885#
1886changequote({, })
1887case "$host" in
1888*-bsdi4.[01]*)
1889	ISC_PLATFORM_NEEDNETINET6IN6H="#define ISC_PLATFORM_NEEDNETINET6IN6H 1"
1890	LWRES_PLATFORM_NEEDNETINET6IN6H="#define LWRES_PLATFORM_NEEDNETINET6IN6H 1"
1891	isc_netinet6in6_hack="#include <netinet6/in6.h>"
1892	;;
1893*)
1894	ISC_PLATFORM_NEEDNETINET6IN6H="#undef ISC_PLATFORM_NEEDNETINET6IN6H"
1895	LWRES_PLATFORM_NEEDNETINET6IN6H="#undef LWRES_PLATFORM_NEEDNETINET6IN6H"
1896	isc_netinet6in6_hack=""
1897	;;
1898esac
1899changequote([, ])
1900
1901#
1902# This is similar to the netinet6/in6.h issue.
1903#
1904case "$host" in
1905*-sco-sysv*uw*|*-*-sysv*UnixWare*|*-*-sysv*OpenUNIX*)
1906	# UnixWare
1907	ISC_PLATFORM_NEEDNETINETIN6H="#define ISC_PLATFORM_NEEDNETINETIN6H 1"
1908	LWRES_PLATFORM_NEEDNETINETIN6H="#define LWRES_PLATFORM_NEEDNETINETIN6H 1"
1909	ISC_PLATFORM_FIXIN6ISADDR="#define ISC_PLATFORM_FIXIN6ISADDR 1"
1910	isc_netinetin6_hack="#include <netinet/in6.h>"
1911	;;
1912*)
1913	ISC_PLATFORM_NEEDNETINETIN6H="#undef ISC_PLATFORM_NEEDNETINETIN6H"
1914	LWRES_PLATFORM_NEEDNETINETIN6H="#undef LWRES_PLATFORM_NEEDNETINETIN6H"
1915	ISC_PLATFORM_FIXIN6ISADDR="#undef ISC_PLATFORM_FIXIN6ISADDR"
1916	isc_netinetin6_hack=""
1917	;;
1918esac
1919
1920#
1921# Now delve deeper into the suitability of the IPv6 support.
1922#
1923case "$found_ipv6" in
1924	yes)
1925		ISC_PLATFORM_HAVEIPV6="#define ISC_PLATFORM_HAVEIPV6 1"
1926		LWRES_PLATFORM_HAVEIPV6="#define LWRES_PLATFORM_HAVEIPV6 1"
1927
1928		AC_MSG_CHECKING(for in6_addr)
1929		AC_TRY_COMPILE([
1930#include <sys/types.h>
1931#include <sys/socket.h>
1932#include <netinet/in.h>
1933$isc_netinetin6_hack
1934$isc_netinet6in6_hack
1935],
1936[struct in6_addr in6; return (0);],
1937		[AC_MSG_RESULT(yes)
1938		 ISC_PLATFORM_HAVEINADDR6="#undef ISC_PLATFORM_HAVEINADDR6"
1939		 LWRES_PLATFORM_HAVEINADDR6="#undef LWRES_PLATFORM_HAVEINADDR6"
1940		 isc_in_addr6_hack=""],
1941		[AC_MSG_RESULT(no)
1942		 ISC_PLATFORM_HAVEINADDR6="#define ISC_PLATFORM_HAVEINADDR6 1"
1943		 LWRES_PLATFORM_HAVEINADDR6="#define LWRES_PLATFORM_HAVEINADDR6 1"
1944		 isc_in_addr6_hack="#define in6_addr in_addr6"])
1945
1946		AC_MSG_CHECKING(for in6addr_any)
1947		AC_TRY_LINK([
1948#include <sys/types.h>
1949#include <sys/socket.h>
1950#include <netinet/in.h>
1951$isc_netinetin6_hack
1952$isc_netinet6in6_hack
1953$isc_in_addr6_hack
1954],
1955		[struct in6_addr in6; in6 = in6addr_any; return (in6.s6_addr[0]);],
1956			[AC_MSG_RESULT(yes)
1957			 ISC_PLATFORM_NEEDIN6ADDRANY="#undef ISC_PLATFORM_NEEDIN6ADDRANY"
1958			 LWRES_PLATFORM_NEEDIN6ADDRANY="#undef LWRES_PLATFORM_NEEDIN6ADDRANY"],
1959			[AC_MSG_RESULT(no)
1960			 ISC_PLATFORM_NEEDIN6ADDRANY="#define ISC_PLATFORM_NEEDIN6ADDRANY 1"
1961			 LWRES_PLATFORM_NEEDIN6ADDRANY="#define LWRES_PLATFORM_NEEDIN6ADDRANY 1"])
1962
1963		AC_MSG_CHECKING(for in6addr_loopback)
1964		AC_TRY_LINK([
1965#include <sys/types.h>
1966#include <sys/socket.h>
1967#include <netinet/in.h>
1968$isc_netinetin6_hack
1969$isc_netinet6in6_hack
1970$isc_in_addr6_hack
1971],
1972		[struct in6_addr in6; in6 = in6addr_loopback; return (in6.s6_addr[0]);],
1973			[AC_MSG_RESULT(yes)
1974			 ISC_PLATFORM_NEEDIN6ADDRLOOPBACK="#undef ISC_PLATFORM_NEEDIN6ADDRLOOPBACK"
1975			 LWRES_PLATFORM_NEEDIN6ADDRLOOPBACK="#undef LWRES_PLATFORM_NEEDIN6ADDRLOOPBACK"],
1976			[AC_MSG_RESULT(no)
1977			 ISC_PLATFORM_NEEDIN6ADDRLOOPBACK="#define ISC_PLATFORM_NEEDIN6ADDRLOOPBACK 1"
1978			 LWRES_PLATFORM_NEEDIN6ADDRLOOPBACK="#define LWRES_PLATFORM_NEEDIN6ADDRLOOPBACK 1"])
1979
1980		AC_MSG_CHECKING(for sin6_scope_id in struct sockaddr_in6)
1981		AC_TRY_COMPILE([
1982#include <sys/types.h>
1983#include <sys/socket.h>
1984#include <netinet/in.h>
1985$isc_netinetin6_hack
1986$isc_netinet6in6_hack
1987],
1988		[struct sockaddr_in6 xyzzy; xyzzy.sin6_scope_id = 0; return (0);],
1989			[AC_MSG_RESULT(yes)
1990			 ISC_PLATFORM_HAVESCOPEID="#define ISC_PLATFORM_HAVESCOPEID 1"
1991			 result="#define LWRES_HAVE_SIN6_SCOPE_ID 1"],
1992			[AC_MSG_RESULT(no)
1993			 ISC_PLATFORM_HAVESCOPEID="#undef ISC_PLATFORM_HAVESCOPEID"
1994			 result="#undef LWRES_HAVE_SIN6_SCOPE_ID"])
1995		LWRES_HAVE_SIN6_SCOPE_ID="$result"
1996
1997		AC_MSG_CHECKING(for in6_pktinfo)
1998		AC_TRY_COMPILE([
1999#include <sys/types.h>
2000#include <sys/socket.h>
2001#include <netinet/in.h>
2002$isc_netinetin6_hack
2003$isc_netinet6in6_hack
2004],
2005		[struct in6_pktinfo xyzzy; return (0);],
2006			[AC_MSG_RESULT(yes)
2007			 ISC_PLATFORM_HAVEIN6PKTINFO="#define ISC_PLATFORM_HAVEIN6PKTINFO 1"],
2008			[AC_MSG_RESULT(no -- disabling runtime ipv6 support)
2009			 ISC_PLATFORM_HAVEIN6PKTINFO="#undef ISC_PLATFORM_HAVEIN6PKTINFO"])
2010		;;
2011	no)
2012		ISC_PLATFORM_HAVEIPV6="#undef ISC_PLATFORM_HAVEIPV6"
2013		LWRES_PLATFORM_HAVEIPV6="#undef LWRES_PLATFORM_HAVEIPV6"
2014		ISC_PLATFORM_NEEDIN6ADDRANY="#undef ISC_PLATFORM_NEEDIN6ADDRANY"
2015		LWRES_PLATFORM_NEEDIN6ADDRANY="#undef LWRES_PLATFORM_NEEDIN6ADDRANY"
2016		ISC_PLATFORM_HAVEIN6PKTINFO="#undef ISC_PLATFORM_HAVEIN6PKTINFO"
2017		LWRES_HAVE_SIN6_SCOPE_ID="#define LWRES_HAVE_SIN6_SCOPE_ID 1"
2018		ISC_PLATFORM_HAVESCOPEID="#define ISC_PLATFORM_HAVESCOPEID 1"
2019		ISC_IPV6_H="ipv6.h"
2020		ISC_IPV6_O="ipv6.$O"
2021		ISC_ISCIPV6_O="unix/ipv6.$O"
2022		ISC_IPV6_C="ipv6.c"
2023		;;
2024esac
2025
2026AC_SUBST(ISC_PLATFORM_HAVEIPV6)
2027AC_SUBST(LWRES_PLATFORM_HAVEIPV6)
2028AC_SUBST(ISC_PLATFORM_NEEDNETINETIN6H)
2029AC_SUBST(LWRES_PLATFORM_NEEDNETINETIN6H)
2030AC_SUBST(ISC_PLATFORM_NEEDNETINET6IN6H)
2031AC_SUBST(LWRES_PLATFORM_NEEDNETINET6IN6H)
2032AC_SUBST(ISC_PLATFORM_HAVEINADDR6)
2033AC_SUBST(LWRES_PLATFORM_HAVEINADDR6)
2034AC_SUBST(ISC_PLATFORM_NEEDIN6ADDRANY)
2035AC_SUBST(LWRES_PLATFORM_NEEDIN6ADDRANY)
2036AC_SUBST(ISC_PLATFORM_NEEDIN6ADDRLOOPBACK)
2037AC_SUBST(LWRES_PLATFORM_NEEDIN6ADDRLOOPBACK)
2038AC_SUBST(ISC_PLATFORM_HAVEIN6PKTINFO)
2039AC_SUBST(ISC_PLATFORM_FIXIN6ISADDR)
2040AC_SUBST(ISC_IPV6_H)
2041AC_SUBST(ISC_IPV6_O)
2042AC_SUBST(ISC_ISCIPV6_O)
2043AC_SUBST(ISC_IPV6_C)
2044AC_SUBST(LWRES_HAVE_SIN6_SCOPE_ID)
2045AC_SUBST(ISC_PLATFORM_HAVESCOPEID)
2046
2047AC_MSG_CHECKING([for struct if_laddrreq])
2048AC_TRY_LINK([
2049#include <sys/types.h>
2050#include <net/if6.h>
2051],[ struct if_laddrreq a; ],
2052	[AC_MSG_RESULT(yes)
2053	ISC_PLATFORM_HAVEIF_LADDRREQ="#define ISC_PLATFORM_HAVEIF_LADDRREQ 1"],
2054	[AC_MSG_RESULT(no)
2055	ISC_PLATFORM_HAVEIF_LADDRREQ="#undef ISC_PLATFORM_HAVEIF_LADDRREQ"])
2056AC_SUBST(ISC_PLATFORM_HAVEIF_LADDRREQ)
2057
2058AC_MSG_CHECKING([for struct if_laddrconf])
2059AC_TRY_LINK([
2060#include <sys/types.h>
2061#include <net/if6.h>
2062],[ struct if_laddrconf a; ],
2063	[AC_MSG_RESULT(yes)
2064	ISC_PLATFORM_HAVEIF_LADDRCONF="#define ISC_PLATFORM_HAVEIF_LADDRCONF 1"],
2065	[AC_MSG_RESULT(no)
2066	ISC_PLATFORM_HAVEIF_LADDRCONF="#undef ISC_PLATFORM_HAVEIF_LADDRCONF"])
2067AC_SUBST(ISC_PLATFORM_HAVEIF_LADDRCONF)
2068
2069#
2070# Check for network functions that are often missing.  We do this
2071# after the libtool checking, so we can put the right suffix on
2072# the files.  It also needs to come after checking for a Kame add-on,
2073# which provides some (all?) of the desired functions.
2074#
2075
2076AC_MSG_CHECKING([for inet_ntop with IPv6 support])
2077AC_TRY_RUN([
2078#include <sys/types.h>
2079#include <sys/socket.h>
2080#include <netinet/in.h>
2081#include <arpa/inet.h>
2082main() {
2083char a[16],b[64]; return(inet_ntop(AF_INET6, a, b, sizeof(b)) == (char*)0);}],
2084	[AC_MSG_RESULT(yes)
2085	ISC_PLATFORM_NEEDNTOP="#undef ISC_PLATFORM_NEEDNTOP"],
2086
2087	[AC_MSG_RESULT(no)
2088	ISC_EXTRA_OBJS="$ISC_EXTRA_OBJS inet_ntop.$O"
2089	ISC_EXTRA_SRCS="$ISC_EXTRA_SRCS inet_ntop.c"
2090	ISC_PLATFORM_NEEDNTOP="#define ISC_PLATFORM_NEEDNTOP 1"],
2091	[AC_MSG_RESULT(assuming inet_ntop not needed)
2092	ISC_PLATFORM_NEEDNTOP="#undef ISC_PLATFORM_NEEDNTOP"])
2093
2094
2095# On NetBSD 1.4.2 and maybe others, inet_pton() incorrectly accepts
2096# addresses with less than four octets, like "1.2.3".  Also leading
2097# zeros should also be rejected.
2098
2099AC_MSG_CHECKING([for working inet_pton with IPv6 support])
2100AC_TRY_RUN([
2101#include <sys/types.h>
2102#include <sys/socket.h>
2103#include <netinet/in.h>
2104#include <arpa/inet.h>
2105main() { char a[16]; return (inet_pton(AF_INET, "1.2.3", a) == 1 ? 1 :
2106			     inet_pton(AF_INET, "1.2.3.04", a) == 1 ? 1 :
2107			     (inet_pton(AF_INET6, "::1.2.3.4", a) != 1)); }],
2108	[AC_MSG_RESULT(yes)
2109	ISC_PLATFORM_NEEDPTON="#undef ISC_PLATFORM_NEEDPTON"],
2110	[AC_MSG_RESULT(no)
2111	ISC_EXTRA_OBJS="$ISC_EXTRA_OBJS inet_pton.$O"
2112	ISC_EXTRA_SRCS="$ISC_EXTRA_SRCS inet_pton.c"
2113	ISC_PLATFORM_NEEDPTON="#define ISC_PLATFORM_NEEDPTON 1"],
2114	[AC_MSG_RESULT(assuming inet_pton needed)
2115	ISC_EXTRA_OBJS="$ISC_EXTRA_OBJS inet_pton.$O"
2116	ISC_EXTRA_SRCS="$ISC_EXTRA_SRCS inet_pton.c"
2117	ISC_PLATFORM_NEEDPTON="#define ISC_PLATFORM_NEEDPTON 1"])
2118
2119AC_SUBST(ISC_PLATFORM_NEEDNTOP)
2120AC_SUBST(ISC_PLATFORM_NEEDPTON)
2121
2122#
2123# Look for a 4.4BSD-style sa_len member in struct sockaddr.
2124#
2125case "$host" in
2126	*-dec-osf*)
2127		# Turn on 4.4BSD style sa_len support.
2128		AC_DEFINE(_SOCKADDR_LEN)
2129		;;
2130esac
2131
2132AC_MSG_CHECKING(for sa_len in struct sockaddr)
2133AC_TRY_COMPILE([
2134#include <sys/types.h>
2135#include <sys/socket.h>],
2136[struct sockaddr sa; sa.sa_len = 0; return (0);],
2137	[AC_MSG_RESULT(yes)
2138	ISC_PLATFORM_HAVESALEN="#define ISC_PLATFORM_HAVESALEN 1"
2139	LWRES_PLATFORM_HAVESALEN="#define LWRES_PLATFORM_HAVESALEN 1"],
2140	[AC_MSG_RESULT(no)
2141	ISC_PLATFORM_HAVESALEN="#undef ISC_PLATFORM_HAVESALEN"
2142	LWRES_PLATFORM_HAVESALEN="#undef LWRES_PLATFORM_HAVESALEN"])
2143AC_SUBST(ISC_PLATFORM_HAVESALEN)
2144AC_SUBST(LWRES_PLATFORM_HAVESALEN)
2145
2146#
2147# Look for a 4.4BSD or 4.3BSD struct msghdr
2148#
2149AC_MSG_CHECKING(for struct msghdr flavor)
2150AC_TRY_COMPILE([
2151#include <sys/types.h>
2152#include <sys/socket.h>],
2153[struct msghdr msg; msg.msg_flags = 0; return (0);],
2154	[AC_MSG_RESULT(4.4BSD)
2155	ISC_PLATFORM_MSGHDRFLAVOR="#define ISC_NET_BSD44MSGHDR 1"],
2156	[AC_MSG_RESULT(4.3BSD)
2157	ISC_PLATFORM_MSGHDRFLAVOR="#define ISC_NET_BSD43MSGHDR 1"])
2158AC_SUBST(ISC_PLATFORM_MSGHDRFLAVOR)
2159
2160#
2161# Look for in_port_t.
2162#
2163AC_MSG_CHECKING(for type in_port_t)
2164AC_TRY_COMPILE([
2165#include <sys/types.h>
2166#include <netinet/in.h>],
2167[in_port_t port = 25; return (0);],
2168	[AC_MSG_RESULT(yes)
2169	ISC_PLATFORM_NEEDPORTT="#undef ISC_PLATFORM_NEEDPORTT"],
2170	[AC_MSG_RESULT(no)
2171	ISC_PLATFORM_NEEDPORTT="#define ISC_PLATFORM_NEEDPORTT 1"])
2172AC_SUBST(ISC_PLATFORM_NEEDPORTT)
2173
2174#
2175# Check for addrinfo
2176#
2177AC_MSG_CHECKING(for struct addrinfo)
2178AC_TRY_COMPILE([
2179#include <netdb.h>],
2180[struct addrinfo a; return (0);],
2181	[AC_MSG_RESULT(yes)
2182	ISC_LWRES_NEEDADDRINFO="#undef ISC_LWRES_NEEDADDRINFO"
2183	ISC_IRS_NEEDADDRINFO="#undef ISC_IRS_NEEDADDRINFO"
2184	AC_DEFINE(HAVE_ADDRINFO)],
2185	[AC_MSG_RESULT(no)
2186	ISC_LWRES_NEEDADDRINFO="#define ISC_LWRES_NEEDADDRINFO 1"
2187	ISC_IRS_NEEDADDRINFO="#define ISC_IRS_NEEDADDRINFO 1"])
2188AC_SUBST(ISC_LWRES_NEEDADDRINFO)
2189AC_SUBST(ISC_IRS_NEEDADDRINFO)
2190
2191#
2192# Check for rrsetinfo
2193#
2194AC_MSG_CHECKING(for struct rrsetinfo)
2195AC_TRY_COMPILE([
2196#include <netdb.h>],
2197[struct rrsetinfo r; return (0);],
2198	[AC_MSG_RESULT(yes)
2199	ISC_LWRES_NEEDRRSETINFO="#undef ISC_LWRES_NEEDRRSETINFO"],
2200	[AC_MSG_RESULT(no)
2201	ISC_LWRES_NEEDRRSETINFO="#define ISC_LWRES_NEEDRRSETINFO 1"])
2202AC_SUBST(ISC_LWRES_NEEDRRSETINFO)
2203
2204AC_MSG_CHECKING(for int sethostent)
2205AC_TRY_COMPILE([
2206#include <netdb.h>],
2207[int i = sethostent(0); return(0);],
2208	[AC_MSG_RESULT(yes)
2209	ISC_LWRES_SETHOSTENTINT="#define ISC_LWRES_SETHOSTENTINT 1"],
2210	[AC_MSG_RESULT(no)
2211	ISC_LWRES_SETHOSTENTINT="#undef ISC_LWRES_SETHOSTENTINT"])
2212AC_SUBST(ISC_LWRES_SETHOSTENTINT)
2213
2214AC_MSG_CHECKING(for int endhostent)
2215AC_TRY_COMPILE([
2216#include <netdb.h>],
2217[int i = endhostent(); return(0);],
2218	[AC_MSG_RESULT(yes)
2219	ISC_LWRES_ENDHOSTENTINT="#define ISC_LWRES_ENDHOSTENTINT 1"],
2220	[AC_MSG_RESULT(no)
2221	ISC_LWRES_ENDHOSTENTINT="#undef ISC_LWRES_ENDHOSTENTINT"])
2222AC_SUBST(ISC_LWRES_ENDHOSTENTINT)
2223
2224AC_MSG_CHECKING(for getnetbyaddr(in_addr_t, ...))
2225AC_TRY_COMPILE([
2226#include <netdb.h>
2227struct netent *getnetbyaddr(in_addr_t, int);],
2228[],
2229	[AC_MSG_RESULT(yes)
2230	ISC_LWRES_GETNETBYADDRINADDR="#define ISC_LWRES_GETNETBYADDRINADDR 1"],
2231	[AC_MSG_RESULT(no)
2232	ISC_LWRES_GETNETBYADDRINADDR="#undef ISC_LWRES_GETNETBYADDRINADDR"])
2233AC_SUBST(ISC_LWRES_GETNETBYADDRINADDR)
2234
2235AC_MSG_CHECKING(for int setnetent)
2236AC_TRY_COMPILE([
2237#include <netdb.h>],
2238[int i = setnetent(0); return(0);],
2239	[AC_MSG_RESULT(yes)
2240	ISC_LWRES_SETNETENTINT="#define ISC_LWRES_SETNETENTINT 1"],
2241	[AC_MSG_RESULT(no)
2242	ISC_LWRES_SETNETENTINT="#undef ISC_LWRES_SETNETENTINT"])
2243AC_SUBST(ISC_LWRES_SETNETENTINT)
2244
2245AC_MSG_CHECKING(for int endnetent)
2246AC_TRY_COMPILE([
2247#include <netdb.h>],
2248[int i = endnetent(); return(0);],
2249	[AC_MSG_RESULT(yes)
2250	ISC_LWRES_ENDNETENTINT="#define ISC_LWRES_ENDNETENTINT 1"],
2251	[AC_MSG_RESULT(no)
2252	ISC_LWRES_ENDNETENTINT="#undef ISC_LWRES_ENDNETENTINT"])
2253AC_SUBST(ISC_LWRES_ENDNETENTINT)
2254
2255AC_MSG_CHECKING(for gethostbyaddr(const void *, size_t, ...))
2256AC_TRY_COMPILE([
2257#include <netdb.h>
2258struct hostent *gethostbyaddr(const void *, size_t, int);],
2259[return(0);],
2260	[AC_MSG_RESULT(yes)
2261	ISC_LWRES_GETHOSTBYADDRVOID="#define ISC_LWRES_GETHOSTBYADDRVOID 1"],
2262	[AC_MSG_RESULT(no)
2263	ISC_LWRES_GETHOSTBYADDRVOID="#undef ISC_LWRES_GETHOSTBYADDRVOID"])
2264AC_SUBST(ISC_LWRES_GETHOSTBYADDRVOID)
2265
2266AC_MSG_CHECKING(for h_errno in netdb.h)
2267AC_TRY_COMPILE([
2268#include <netdb.h>],
2269[h_errno = 1; return(0);],
2270	[AC_MSG_RESULT(yes)
2271	ISC_LWRES_NEEDHERRNO="#undef ISC_LWRES_NEEDHERRNO"],
2272	[AC_MSG_RESULT(no)
2273	ISC_LWRES_NEEDHERRNO="#define ISC_LWRES_NEEDHERRNO 1"])
2274AC_SUBST(ISC_LWRES_NEEDHERRNO)
2275
2276#
2277# Sadly, the definitions of system-supplied getnameinfo(3) vary.  Try to catch
2278# known variations here:
2279#
2280AC_MSG_CHECKING(for getnameinfo prototype definitions)
2281AC_TRY_COMPILE([
2282#include <sys/types.h>
2283#include <sys/socket.h>
2284#include <netdb.h>
2285int getnameinfo(const struct sockaddr *, socklen_t, char *,
2286                socklen_t, char *, socklen_t, unsigned int);],
2287[ return (0);],
2288	[AC_MSG_RESULT(socklen_t for buflen; u_int for flags)
2289	 AC_DEFINE(IRS_GETNAMEINFO_BUFLEN_T, socklen_t,
2290		   [Define to the buffer length type used by getnameinfo(3).])
2291	 AC_DEFINE(IRS_GETNAMEINFO_FLAGS_T, unsigned int,
2292		   [Define to the flags type used by getnameinfo(3).])],
2293[AC_TRY_COMPILE([
2294#include <sys/types.h>
2295#include <sys/socket.h>
2296#include <netdb.h>
2297int getnameinfo(const struct sockaddr *, socklen_t, char *,
2298                size_t, char *, size_t, int);],
2299[ return (0);],
2300	[AC_MSG_RESULT(size_t for buflen; int for flags)
2301	 AC_DEFINE(IRS_GETNAMEINFO_BUFLEN_T, size_t)
2302	 AC_DEFINE(IRS_GETNAMEINFO_FLAGS_T, int)],
2303[AC_MSG_RESULT(not match any subspecies; assume standard definition)
2304AC_DEFINE(IRS_GETNAMEINFO_BUFLEN_T, socklen_t)
2305AC_DEFINE(IRS_GETNAMEINFO_FLAGS_T, int)])])
2306
2307#
2308# ...and same for gai_strerror().
2309#
2310AC_MSG_CHECKING(for gai_strerror prototype definitions)
2311AC_TRY_COMPILE([
2312#include <sys/types.h>
2313#include <sys/socket.h>
2314#include <netdb.h>
2315char *gai_strerror(int ecode);],
2316[ return (0); ],
2317	[AC_MSG_RESULT(returning char *)
2318	 AC_DEFINE([IRS_GAISTRERROR_RETURN_T], [char *],
2319	 [return type of gai_strerror])],
2320[AC_MSG_RESULT(not match any subspecies; assume standard definition)
2321AC_DEFINE([IRS_GAISTRERROR_RETURN_T], [const char *])])
2322
2323AC_CHECK_FUNC(getipnodebyname,
2324	[ISC_LWRES_GETIPNODEPROTO="#undef ISC_LWRES_GETIPNODEPROTO"],
2325	[ISC_LWRES_GETIPNODEPROTO="#define ISC_LWRES_GETIPNODEPROTO 1"])
2326AC_CHECK_FUNC(getnameinfo,
2327	[ISC_LWRES_GETNAMEINFOPROTO="#undef ISC_LWRES_GETNAMEINFOPROTO"],
2328	[ISC_LWRES_GETNAMEINFOPROTO="#define ISC_LWRES_GETNAMEINFOPROTO 1"])
2329AC_CHECK_FUNC(getaddrinfo,
2330	[ISC_LWRES_GETADDRINFOPROTO="#undef ISC_LWRES_GETADDRINFOPROTO"
2331	AC_DEFINE(HAVE_GETADDRINFO)],
2332	[ISC_LWRES_GETADDRINFOPROTO="#define ISC_LWRES_GETADDRINFOPROTO 1"])
2333AC_CHECK_FUNC(gai_strerror, AC_DEFINE(HAVE_GAISTRERROR))
2334AC_SUBST(ISC_LWRES_GETIPNODEPROTO)
2335AC_SUBST(ISC_LWRES_GETADDRINFOPROTO)
2336AC_SUBST(ISC_LWRES_GETNAMEINFOPROTO)
2337AC_SUBST(ISC_IRS_GETNAMEINFOSOCKLEN)
2338
2339AC_ARG_ENABLE(getifaddrs,
2340[  --enable-getifaddrs     Enable the use of getifaddrs() [[yes|no]].],
2341    want_getifaddrs="$enableval",  want_getifaddrs="yes")
2342
2343#
2344# This interface iteration code for getifaddrs() will fall back to using
2345# /proc/net/if_inet6 if getifaddrs() in glibc doesn't return any IPv6
2346# addresses.
2347#
2348case $want_getifaddrs in
2349glibc)
2350AC_MSG_WARN("--enable-getifaddrs=glibc is no longer required")
2351AC_CHECK_FUNC(getifaddrs, AC_DEFINE(HAVE_GETIFADDRS))
2352;;
2353yes)
2354AC_CHECK_FUNC(getifaddrs, AC_DEFINE(HAVE_GETIFADDRS))
2355;;
2356no)
2357;;
2358esac
2359
2360#
2361# Look for a sysctl call to get the list of network interfaces.
2362#
2363case $ac_cv_header_sys_sysctl_h in
2364yes)
2365AC_MSG_CHECKING(for interface list sysctl)
2366AC_EGREP_CPP(found_rt_iflist, [
2367#include <sys/param.h>
2368#include <sys/sysctl.h>
2369#include <sys/socket.h>
2370#ifdef NET_RT_IFLIST
2371found_rt_iflist
2372#endif
2373],
2374	[AC_MSG_RESULT(yes)
2375	 AC_DEFINE(HAVE_IFLIST_SYSCTL)],
2376	[AC_MSG_RESULT(no)])
2377;;
2378esac
2379
2380#
2381# Check for some other useful functions that are not ever-present.
2382#
2383
2384# We test for strsep() using AC_TRY_LINK instead of AC_CHECK_FUNC
2385# because AIX 4.3.3 with patches for bos.adt.include to version 4.3.3.77
2386# reportedly defines strsep() without declaring it in <string.h> when
2387# -D_LINUX_SOURCE_COMPAT is not defined [RT #2190], and
2388# AC_CHECK_FUNC() incorrectly succeeds because it declares
2389# the function itself.
2390AC_MSG_CHECKING(for correctly declared strsep())
2391AC_TRY_LINK([#include <string.h>], [char *sp; char *foo = strsep(&sp, ".");],
2392	[AC_MSG_RESULT(yes); ISC_PLATFORM_NEEDSTRSEP="#undef ISC_PLATFORM_NEEDSTRSEP"],
2393	[AC_MSG_RESULT(no); ISC_PLATFORM_NEEDSTRSEP="#define ISC_PLATFORM_NEEDSTRSEP 1"])
2394AC_SUBST(ISC_PLATFORM_NEEDSTRSEP)
2395
2396AC_CHECK_FUNC(memmove,
2397	[ISC_PLATFORM_NEEDMEMMOVE="#undef ISC_PLATFORM_NEEDMEMMOVE"],
2398	[ISC_PLATFORM_NEEDMEMMOVE="#define ISC_PLATFORM_NEEDMEMMOVE 1"])
2399AC_SUBST(ISC_PLATFORM_NEEDMEMMOVE)
2400
2401AC_CHECK_FUNC(strtoul,
2402	[ISC_PLATFORM_NEEDSTRTOUL="#undef ISC_PLATFORM_NEEDSTRTOUL"
2403	 LWRES_PLATFORM_NEEDSTRTOUL="#undef LWRES_PLATFORM_NEEDSTRTOUL"
2404	 GENRANDOMLIB=""],
2405	[ISC_PLATFORM_NEEDSTRTOUL="#define ISC_PLATFORM_NEEDSTRTOUL 1"
2406	 LWRES_PLATFORM_NEEDSTRTOUL="#define LWRES_PLATFORM_NEEDSTRTOUL 1"
2407	 GENRANDOMLIB='${ISCLIBS}'])
2408AC_SUBST(ISC_PLATFORM_NEEDSTRTOUL)
2409AC_SUBST(LWRES_PLATFORM_NEEDSTRTOUL)
2410AC_SUBST(GENRANDOMLIB)
2411
2412AC_CHECK_FUNC(strlcpy,
2413	[ISC_PLATFORM_NEEDSTRLCPY="#undef ISC_PLATFORM_NEEDSTRLCPY"],
2414	[ISC_PLATFORM_NEEDSTRLCPY="#define ISC_PLATFORM_NEEDSTRLCPY 1"])
2415AC_SUBST(ISC_PLATFORM_NEEDSTRLCPY)
2416
2417AC_CHECK_FUNC(strlcat,
2418	[ISC_PLATFORM_NEEDSTRLCAT="#undef ISC_PLATFORM_NEEDSTRLCAT"],
2419	[ISC_PLATFORM_NEEDSTRLCAT="#define ISC_PLATFORM_NEEDSTRLCAT 1"])
2420AC_SUBST(ISC_PLATFORM_NEEDSTRLCAT)
2421
2422AC_CHECK_FUNC(strcasestr,
2423	[ISC_PLATFORM_NEEDSTRCASESTR="#undef ISC_PLATFORM_NEEDSTRCASESTR"],
2424	[ISC_PLATFORM_NEEDSTRCASESTR="#define ISC_PLATFORM_NEEDSTRCASESTR 1"])
2425AC_SUBST(ISC_PLATFORM_NEEDSTRCASESTR)
2426
2427AC_SUBST(READLINE_LIB)
2428AC_ARG_WITH(readline,
2429        [  --with-readline[=LIBSPEC]    specify readline library [default -lreadline]],
2430        readline="$withval", readline="-lreadline")
2431case "$readline" in
2432no)	;;
2433*)
2434	if test "x$readline" = "xyes"
2435	then
2436		readline=-lreadline
2437	fi
2438	saved_LIBS="$LIBS"
2439	LIBS="$readline"
2440	AC_CHECK_FUNCS(readline)
2441	if test "$ac_cv_func_readline" = "yes"
2442	then
2443		READLINE_LIB="$readline"
2444	fi
2445	LIBS="$saved_LIBS"
2446        ;;
2447esac
2448
2449ISC_PRINT_OBJS=
2450ISC_PRINT_SRCS=
2451AC_MSG_CHECKING(sprintf)
2452AC_TRY_COMPILE([
2453#include <stdio.h>
2454],
2455[ char buf[2]; return(*sprintf(buf,"x"));],
2456[
2457ISC_PRINT_OBJS="print.$O"
2458ISC_PRINT_SRCS="print.c"
2459ISC_PLATFORM_NEEDSPRINTF="#define ISC_PLATFORM_NEEDSPRINTF"
2460LWRES_PLATFORM_NEEDSPRINTF="#define LWRES_PLATFORM_NEEDSPRINTF"
2461],
2462[ISC_PLATFORM_NEEDSPRINTF="#undef ISC_PLATFORM_NEEDSPRINTF"
2463 LWRES_PLATFORM_NEEDSPRINTF="#undef LWRES_PLATFORM_NEEDSPRINTF"]
2464)
2465AC_SUBST(ISC_PLATFORM_NEEDSPRINTF)
2466AC_SUBST(LWRES_PLATFORM_NEEDSPRINTF)
2467
2468AC_CHECK_FUNC(vsnprintf,
2469	[ISC_PLATFORM_NEEDVSNPRINTF="#undef ISC_PLATFORM_NEEDVSNPRINTF"
2470	 LWRES_PLATFORM_NEEDVSNPRINTF="#undef LWRES_PLATFORM_NEEDVSNPRINTF"],
2471	[ISC_PRINT_OBJS="print.$O"
2472	 ISC_PRINT_SRCS="print.c"
2473	 ISC_PLATFORM_NEEDVSNPRINTF="#define ISC_PLATFORM_NEEDVSNPRINTF 1"
2474	 LWRES_PLATFORM_NEEDVSNPRINTF="#define LWRES_PLATFORM_NEEDVSNPRINTF 1"])
2475AC_SUBST(ISC_PLATFORM_NEEDVSNPRINTF)
2476AC_SUBST(LWRES_PLATFORM_NEEDVSNPRINTF)
2477ISC_EXTRA_OBJS="$ISC_EXTRA_OBJS $ISC_PRINT_OBJS"
2478ISC_EXTRA_SRCS="$ISC_EXTRA_SRCS $ISC_PRINT_SRCS"
2479
2480AC_CHECK_FUNC(strerror, AC_DEFINE(HAVE_STRERROR))
2481
2482AC_SUBST(ISC_EXTRA_OBJS)
2483AC_SUBST(ISC_EXTRA_SRCS)
2484
2485#
2486# Use our own SPNEGO implementation?
2487#
2488AC_ARG_ENABLE(isc-spnego,
2489	[  --disable-isc-spnego    use SPNEGO from GSSAPI library])
2490
2491if test -n "$USE_GSSAPI"
2492then
2493	case "$enable_isc_spnego" in
2494		yes|'')
2495			USE_ISC_SPNEGO='-DUSE_ISC_SPNEGO'
2496			DST_EXTRA_OBJS="$DST_EXTRA_OBJS spnego.$O"
2497			DST_EXTRA_SRCS="$DST_EXTRA_SRCS spnego.c"
2498			AC_MSG_RESULT(using SPNEGO from lib/dns)
2499			;;
2500		no)
2501			AC_MSG_RESULT(using SPNEGO from GSSAPI library)
2502			;;
2503	esac
2504fi
2505
2506AC_SUBST(USE_ISC_SPNEGO)
2507
2508AC_SUBST(DST_EXTRA_OBJS)
2509AC_SUBST(DST_EXTRA_SRCS)
2510
2511# Determine the printf format characters to use when printing
2512# values of type isc_int64_t. This will normally be "ll", but where
2513# the compiler treats "long long" as a alias for "long" and printf
2514# doesn't know about "long long" use "l".  Hopefully the sprintf
2515# will produce a inconsistent result in the later case.  If the compiler
2516# fails due to seeing "%lld" we fall back to "l".
2517#
2518# Digital Unix 4.0 (gcc?) (long long) is 64 bits as is its long. It uses
2519# %ld even for (long long)/
2520#
2521# Win32 uses "%I64d", but that's defined elsewhere since we don't use
2522# configure on Win32.
2523#
2524AC_MSG_CHECKING(printf format modifier for 64-bit integers)
2525AC_TRY_RUN([
2526#include <stdio.h>
2527main() {
2528	long long int j = 0;
2529	char buf[100];
2530	buf[0] = 0;
2531	sprintf(buf, "%lld", j);
2532	exit((sizeof(long long int) != sizeof(long int))? 0 :
2533	     (strcmp(buf, "0") != 0));
2534}
2535],
2536	[AC_MSG_RESULT(ll)
2537	ISC_PLATFORM_QUADFORMAT='#define ISC_PLATFORM_QUADFORMAT "ll"'
2538	LWRES_PLATFORM_QUADFORMAT='#define LWRES_PLATFORM_QUADFORMAT "ll"'],
2539	[AC_MSG_RESULT(l)
2540	ISC_PLATFORM_QUADFORMAT='#define ISC_PLATFORM_QUADFORMAT "l"'
2541	LWRES_PLATFORM_QUADFORMAT='#define LWRES_PLATFORM_QUADFORMAT "l"'],
2542	[AC_MSG_RESULT(assuming target platform uses ll)
2543	ISC_PLATFORM_QUADFORMAT='#define ISC_PLATFORM_QUADFORMAT "ll"'
2544	LWRES_PLATFORM_QUADFORMAT='#define LWRES_PLATFORM_QUADFORMAT "ll"'])
2545AC_SUBST(ISC_PLATFORM_QUADFORMAT)
2546AC_SUBST(LWRES_PLATFORM_QUADFORMAT)
2547
2548#
2549# Security Stuff
2550#
2551# Note it is very recommended to *not* disable chroot(),
2552# this is only because chroot() was made obsolete by Posix.
2553AC_ARG_ENABLE(chroot,
2554	[  --disable-chroot        disable chroot])
2555case "$enable_chroot" in
2556	yes|'')
2557		AC_CHECK_FUNCS(chroot)
2558		;;
2559	no)
2560		;;
2561esac
2562AC_ARG_ENABLE(linux-caps,
2563	[  --disable-linux-caps	  disable linux capabilities])
2564case "$enable_linux_caps" in
2565	yes|'')
2566		AC_CHECK_HEADERS(linux/types.h)
2567		AC_CHECK_HEADERS([sys/capability.h])
2568		AC_CHECK_HEADERS([linux/capability.h], [], [],
2569				 [#ifdef HAVE_LINUX_TYPES_H
2570				  #include <linux/types.h>
2571				  #endif
2572				 ])
2573		AC_CHECK_LIB(cap, cap_set_proc)
2574		;;
2575	no)
2576		;;
2577esac
2578AC_CHECK_HEADERS(sys/prctl.h)
2579
2580AC_CHECK_HEADERS(sys/un.h,
2581ISC_PLATFORM_HAVESYSUNH="#define ISC_PLATFORM_HAVESYSUNH 1"
2582,
2583ISC_PLATFORM_HAVESYSUNH="#undef ISC_PLATFORM_HAVESYSUNH"
2584)
2585AC_SUBST(ISC_PLATFORM_HAVESYSUNH)
2586
2587case "$host" in
2588*-solaris*)
2589	AC_DEFINE(NEED_SECURE_DIRECTORY, 1,
2590		  [Define if connect does not honour the permission on the UNIX domain socket.])
2591	;;
2592*-sunos*)
2593	AC_DEFINE(NEED_SECURE_DIRECTORY, 1,
2594		  [Define if connect does not honour the permission on the UNIX domain socket.])
2595	;;
2596esac
2597
2598#
2599# Time Zone Stuff
2600#
2601AC_CHECK_FUNC(tzset, AC_DEFINE(HAVE_TZSET))
2602
2603AC_MSG_CHECKING(for optarg declaration)
2604AC_TRY_COMPILE([
2605#include <unistd.h>
2606],
2607[optarg = 0;],
2608[AC_MSG_RESULT(yes)],
2609[AC_MSG_RESULT(no)
2610GEN_NEED_OPTARG="-DNEED_OPTARG=1"
2611AC_DEFINE(NEED_OPTARG, 1, [Defined if extern char *optarg is not declared.])])
2612
2613#
2614# BSD/OS, and perhaps some others, don't define rlim_t.
2615#
2616AC_MSG_CHECKING(for type rlim_t)
2617AC_TRY_COMPILE([
2618#include <sys/types.h>
2619#include <sys/time.h>
2620#include <sys/resource.h>],
2621[rlim_t rl = 19671212; return (0);],
2622[AC_MSG_RESULT(yes)
2623 ISC_PLATFORM_RLIMITTYPE="#define ISC_PLATFORM_RLIMITTYPE rlim_t"],
2624[AC_MSG_RESULT(no)
2625
2626AC_MSG_CHECKING(type of rlim_cur)
2627AC_TRY_RUN([
2628#include <sys/types.h>
2629#include <sys/time.h>
2630#include <sys/resource.h>
2631main() { struct rlimit r; exit(!(sizeof(r.rlim_cur) == sizeof(int)));}],
2632[AC_MSG_RESULT(int)
2633ISC_PLATFORM_RLIMITTYPE="#define ISC_PLATFORM_RLIMITTYPE int"],
2634[
2635AC_TRY_RUN([
2636#include <sys/types.h>
2637#include <sys/time.h>
2638#include <sys/resource.h>
2639main() { struct rlimit r; exit(!(sizeof(r.rlim_cur) == sizeof(long int)));}],
2640[AC_MSG_RESULT(long int)
2641ISC_PLATFORM_RLIMITTYPE="#define ISC_PLATFORM_RLIMITTYPE long int"],
2642[
2643AC_TRY_RUN([
2644#include <sys/types.h>
2645#include <sys/time.h>
2646#include <sys/resource.h>
2647main() { struct rlimit r; exit((!sizeof(r.rlim_cur) == sizeof(long long int)));}],
2648[AC_MSG_RESULT(long long int)
2649ISC_PLATFORM_RLIMITTYPE="#define ISC_PLATFORM_RLIMITTYPE long long int"],
2650[AC_MSG_ERROR([unable to determine sizeof rlim_cur])
2651],[AC_MSG_ERROR(this cannot happen)])
2652],[AC_MSG_ERROR(this cannot happen)])
2653],[
2654AC_ARG_WITH(rlimtype, , rlimtype="$withval", rlimtype="long long int")
2655ISC_PLATFORM_RLIMITTYPE="#define ISC_PLATFORM_RLIMITTYPE $rlimtype"
2656AC_MSG_RESULT(cannot determine type of rlim_cur when cross compiling - assuming $rlimtype)])
2657])
2658AC_SUBST(ISC_PLATFORM_RLIMITTYPE)
2659
2660#
2661# Older HP-UX doesn't have gettune
2662#
2663case "$host" in
2664  	*-hp-hpux*)
2665		AC_CHECK_HEADERS(sys/dyntune.h)
2666		;;
2667	*)
2668		;;
2669esac
2670
2671
2672#
2673# Compaq TruCluster requires more code for handling cluster IP aliases
2674#
2675case "$host" in
2676	*-dec-osf*)
2677		AC_CHECK_LIB(clua, clua_getaliasaddress, LIBS="-lclua $LIBS")
2678		AC_CHECK_FUNC(clua_getaliasaddress,
2679				AC_DEFINE(HAVE_TRUCLUSTER, 1,
2680					[Define if running under Compaq TruCluster]))
2681		;;
2682	*)
2683		;;
2684esac
2685
2686#
2687# Some hosts need msg_namelen to match the size of the socket structure.
2688# Some hosts don't set msg_namelen appropriately on return from recvmsg().
2689#
2690case $host in
2691*os2*|*hp-mpeix*)
2692	AC_DEFINE(BROKEN_RECVMSG, 1,
2693		  [Define if recvmsg() does not meet all of the BSD socket API specifications.])
2694	;;
2695esac
2696
2697#
2698# Microsoft has their own way of handling shared libraries that requires
2699# additional qualifiers on extern variables.  Unix systems don't need it.
2700#
2701AC_SUBST(ISC_PLATFORM_USEDECLSPEC)
2702ISC_PLATFORM_USEDECLSPEC="#undef ISC_PLATFORM_USEDECLSPEC"
2703AC_SUBST(LWRES_PLATFORM_USEDECLSPEC)
2704LWRES_PLATFORM_USEDECLSPEC="#undef LWRES_PLATFORM_USEDECLSPEC"
2705AC_SUBST(IRS_PLATFORM_USEDECLSPEC)
2706IRS_PLATFORM_USEDECLSPEC="#undef IRS_PLATFORM_USEDECLSPEC"
2707
2708#
2709# Random remaining OS-specific issues involving compiler warnings.
2710# XXXDCL print messages to indicate some compensation is being done?
2711#
2712AC_SUBST(ISC_PLATFORM_BRACEPTHREADONCEINIT)
2713ISC_PLATFORM_BRACEPTHREADONCEINIT="#undef ISC_PLATFORM_BRACEPTHREADONCEINIT"
2714
2715case "$host" in
2716	*-aix5.[[123]].*)
2717		hack_shutup_pthreadonceinit=yes
2718		;;
2719	*-bsdi3.1*)
2720		hack_shutup_sputaux=yes
2721		;;
2722	*-bsdi4.0*)
2723		hack_shutup_sigwait=yes
2724		hack_shutup_sputaux=yes
2725		;;
2726	[*-bsdi4.[12]*])
2727		hack_shutup_stdargcast=yes
2728		;;
2729	[*-solaris2.[89]])
2730		hack_shutup_pthreadonceinit=yes
2731		;;
2732	*-solaris2.1[[0-9]])
2733		AC_TRY_COMPILE([ #include <pthread.h> ], [ static pthread_once_t once_test = { PTHREAD_ONCE_INIT }; ], [hack_shutup_pthreadonceinit=yes], )
2734		;;
2735esac
2736
2737case "$hack_shutup_pthreadonceinit" in
2738	yes)
2739		#
2740		# Shut up PTHREAD_ONCE_INIT unbraced initializer warnings.
2741		#
2742		ISC_PLATFORM_BRACEPTHREADONCEINIT="#define ISC_PLATFORM_BRACEPTHREADONCEINIT 1"
2743		;;
2744esac
2745
2746case "$hack_shutup_sigwait" in
2747	yes)
2748		#
2749		# Shut up a -Wmissing-prototypes warning for sigwait().
2750		#
2751		AC_DEFINE(SHUTUP_SIGWAIT)
2752		;;
2753esac
2754
2755case "$hack_shutup_sputaux" in
2756	yes)
2757		#
2758		# Shut up a -Wmissing-prototypes warning from <stdio.h>.
2759		#
2760		AC_DEFINE(SHUTUP_SPUTAUX)
2761		;;
2762esac
2763
2764case "$hack_shutup_stdargcast" in
2765	yes)
2766		#
2767		# Shut up a -Wcast-qual warning from va_start().
2768		#
2769		AC_DEFINE(SHUTUP_STDARG_CAST)
2770		;;
2771esac
2772
2773AC_CHECK_HEADERS(strings.h,
2774  ISC_PLATFORM_HAVESTRINGSH="#define ISC_PLATFORM_HAVESTRINGSH 1"
2775,
2776  ISC_PLATFORM_HAVESTRINGSH="#undef ISC_PLATFORM_HAVESTRINGSH"
2777)
2778AC_SUBST(ISC_PLATFORM_HAVESTRINGSH)
2779
2780#
2781# Check for if_nametoindex() for IPv6 scoped addresses support
2782#
2783AC_CHECK_FUNC(if_nametoindex, ac_cv_have_if_nametoindex=yes,
2784		ac_cv_have_if_nametoindex=no)
2785case $ac_cv_have_if_nametoindex in
2786no)
2787	case "$host" in
2788	*-hp-hpux*)
2789		AC_CHECK_LIB(ipv6, if_nametoindex,
2790				ac_cv_have_if_nametoindex=yes
2791				LIBS="-lipv6 $LIBS",)
2792	;;
2793	esac
2794esac
2795case $ac_cv_have_if_nametoindex in
2796yes)
2797	ISC_PLATFORM_HAVEIFNAMETOINDEX="#define ISC_PLATFORM_HAVEIFNAMETOINDEX 1"
2798	;;
2799*)
2800	ISC_PLATFORM_HAVEIFNAMETOINDEX="#undef ISC_PLATFORM_HAVEIFNAMETOINDEX"
2801	;;
2802esac
2803AC_SUBST(ISC_PLATFORM_HAVEIFNAMETOINDEX)
2804
2805AC_CHECK_FUNCS(nanosleep usleep)
2806
2807#
2808# Machine architecture dependent features
2809#
2810AC_ARG_ENABLE(atomic,
2811	[  --enable-atomic	  enable machine specific atomic operations
2812			  [[default=autodetect]]],
2813			enable_atomic="$enableval",
2814			enable_atomic="autodetect")
2815case "$enable_atomic" in
2816	yes|''|autodetect)
2817		case "$host" in
2818		powerpc-ibm-aix*)
2819			if test "X$GCC" = "Xyes"; then
2820				AC_MSG_CHECKING([if asm("isc"); works])
2821				AC_TRY_COMPILE(,[
2822				main() { asm("ics"); exit(0); }
2823				],
2824				[AC_MSG_RESULT(yes)
2825				 use_atomic=yes],
2826				[
2827				saved_cflags="$CFLAGS"
2828				CFLAGS="$CFLAGS -Wa,-many"
2829				AC_TRY_RUN([
2830				main() { asm("ics"); exit(0); }
2831				],
2832				[AC_MSG_RESULT([yes, required -Wa,-many])
2833				 use_atomic=yes],
2834				[AC_MSG_RESULT([no, use_atomic disabled])
2835				 CFLAGS="$saved_cflags"
2836				 use_atomic=no],
2837				[AC_MSG_RESULT([cross compile, assume yes])
2838				 CFLAGS="$saved_cflags"
2839				 use_atomic=yes])
2840				]
2841				)
2842			else
2843				use_atomic=yes
2844			fi
2845			;;
2846		*)
2847			use_atomic=yes
2848			;;
2849		esac
2850		;;
2851	no)
2852		use_atomic=no
2853		arch=noatomic
2854		;;
2855esac
2856
2857ISC_PLATFORM_USEOSFASM="#undef ISC_PLATFORM_USEOSFASM"
2858if test "$use_atomic" = "yes"; then
2859	AC_MSG_CHECKING([architecture type for atomic operations])
2860	have_atomic=yes		# set default
2861	case "$host" in
2862	[i[3456]86-*])
2863		# XXX: some old x86 architectures actually do not support
2864		#      (some of) these operations.  Do we need stricter checks?
2865                AC_CHECK_SIZEOF([void *])
2866		if test $ac_cv_sizeof_void_p = 8; then
2867			arch=x86_64
2868			have_xaddq=yes
2869		else
2870			arch=x86_32
2871		fi
2872	;;
2873	x86_64-*|amd64-*)
2874                AC_CHECK_SIZEOF([void *])
2875		if test $ac_cv_sizeof_void_p = 8; then
2876			arch=x86_64
2877			have_xaddq=yes
2878		else
2879			arch=x86_32
2880		fi
2881	;;
2882	alpha*-*)
2883		arch=alpha
2884	;;
2885	powerpc-*|powerpc64-*)
2886		arch=powerpc
2887	;;
2888	mips-*|mipsel-*|mips64-*|mips64el-*)
2889		arch=mips
2890	;;
2891	ia64-*)
2892		arch=ia64
2893	;;
2894	*)
2895		have_atomic=no
2896		arch=noatomic
2897	;;
2898	esac
2899	AC_MSG_RESULT($arch)
2900fi
2901
2902if test "$have_atomic" = "yes"; then
2903	AC_MSG_CHECKING([compiler support for inline assembly code])
2904
2905	compiler=generic
2906	# Check whether the compiler supports the assembly syntax we provide.
2907	if test "X$GCC" = "Xyes"; then
2908		# GCC's ASM extension always works
2909		compiler=gcc
2910		if test $arch = "x86_64"; then
2911			# We can share the same code for gcc with x86_32
2912			arch=x86_32
2913		fi
2914		if test $arch = "powerpc"; then
2915			#
2916			# The MacOS (and maybe others) uses "r0" for register
2917			# zero. Under linux/ibm it is "0" for register 0.
2918			# Probe to see if we have a MacOS style assembler.
2919			#
2920			AC_MSG_CHECKING([Checking for MacOS style assembler syntax])
2921			AC_TRY_COMPILE(, [
2922			__asm__ volatile ("li r0, 0x0\n"::);
2923			], [
2924			AC_MSG_RESULT(yes)
2925			compiler="mac"
2926			ISC_PLATFORM_USEMACASM="#define ISC_PLATFORM_USEMACASM 1"
2927			], [AC_MSG_RESULT(no)])
2928		fi
2929	else
2930		case "$host" in
2931		alpha*-dec-osf*)
2932			# Tru64 compiler has its own syntax for inline
2933			# assembly.
2934			AC_TRY_COMPILE(, [
2935#ifndef __DECC
2936#error "unexpected compiler"
2937#endif
2938				return (0);],
2939				[compiler=osf],)
2940		;;
2941		powerpc-ibm-aix*)
2942			compiler=aix
2943		;;
2944		esac
2945	fi
2946	case "$compiler" in
2947	gcc)
2948		ISC_PLATFORM_USEGCCASM="#define ISC_PLATFORM_USEGCCASM 1"
2949		;;
2950	osf)
2951		ISC_PLATFORM_USEOSFASM="#define ISC_PLATFORM_USEOSFASM 1"
2952		;;
2953	aix)
2954		;;
2955	mac)
2956		;;
2957	*)
2958		# See if the generic __asm function works.  If not,
2959		# we need to disable the atomic operations.
2960		AC_TRY_LINK(, [
2961					__asm("nop")
2962				],
2963		[compiler="standard"
2964		ISC_PLATFORM_USESTDASM="#define ISC_PLATFORM_USESTDASM 1"],
2965		[compiler="not supported (atomic operations disabled)"
2966		have_atomic=no
2967		arch=noatomic ]);
2968		;;
2969	esac
2970
2971	AC_MSG_RESULT($compiler)
2972fi
2973
2974if test "$have_atomic" = "yes"; then
2975	ISC_PLATFORM_HAVEXADD="#define ISC_PLATFORM_HAVEXADD 1"
2976	ISC_PLATFORM_HAVECMPXCHG="#define ISC_PLATFORM_HAVECMPXCHG 1"
2977	ISC_PLATFORM_HAVEATOMICSTORE="#define ISC_PLATFORM_HAVEATOMICSTORE 1"
2978else
2979	ISC_PLATFORM_HAVEXADD="#undef ISC_PLATFORM_HAVEXADD"
2980	ISC_PLATFORM_HAVECMPXCHG="#undef ISC_PLATFORM_HAVECMPXCHG"
2981	ISC_PLATFORM_HAVEATOMICSTORE="#undef ISC_PLATFORM_HAVEATOMICSTORE"
2982fi
2983
2984if test "$have_xaddq" = "yes"; then
2985	ISC_PLATFORM_HAVEXADDQ="#define ISC_PLATFORM_HAVEXADDQ 1"
2986else
2987	ISC_PLATFORM_HAVEXADDQ="#undef ISC_PLATFORM_HAVEXADDQ"
2988fi
2989
2990AC_SUBST(ISC_PLATFORM_HAVEXADD)
2991AC_SUBST(ISC_PLATFORM_HAVEXADDQ)
2992AC_SUBST(ISC_PLATFORM_HAVECMPXCHG)
2993AC_SUBST(ISC_PLATFORM_HAVEATOMICSTORE)
2994
2995AC_SUBST(ISC_PLATFORM_USEGCCASM)
2996AC_SUBST(ISC_PLATFORM_USEOSFASM)
2997AC_SUBST(ISC_PLATFORM_USESTDASM)
2998AC_SUBST(ISC_PLATFORM_USEMACASM)
2999
3000ISC_ARCH_DIR=$arch
3001AC_SUBST(ISC_ARCH_DIR)
3002
3003#
3004# Activate "rrset-order fixed" or not?
3005#
3006AC_ARG_ENABLE(fixed-rrset,
3007	[  --enable-fixed-rrset    enable fixed rrset ordering
3008			  [[default=no]]],
3009			enable_fixed="$enableval",
3010			enable_fixed="no")
3011case "$enable_fixed" in
3012	yes)
3013		AC_DEFINE(DNS_RDATASET_FIXED, 1,
3014			  [Define to enable "rrset-order fixed" syntax.])
3015		;;
3016	no)
3017		;;
3018	*)
3019		;;
3020esac
3021
3022#
3023# Enable response policy rewriting using NS IP addresses
3024#
3025AC_ARG_ENABLE(rpz-nsip,
3026	[  --disable-rpz-nsip	  disable rpz-nsip rules [[default=enabled]]],
3027			enable_nsip="$enableval",
3028			enable_nsip="yes")
3029case "$enable_nsip" in
3030	yes)
3031		AC_DEFINE(ENABLE_RPZ_NSIP, 1,
3032			  [Define to enable rpz-nsip rules.])
3033		;;
3034	no)
3035		;;
3036	*)
3037		;;
3038esac
3039
3040#
3041# Enable response policy rewriting using NS name
3042#
3043AC_ARG_ENABLE(rpz-nsdname,
3044	[  --disable-rpz-nsdname	  disable rpz-nsdname rules [[default=enabled]]],
3045			enable_nsdname="$enableval",
3046			enable_nsdname="yes")
3047case "$enable_nsdname" in
3048	yes)
3049		AC_DEFINE(ENABLE_RPZ_NSDNAME, 1,
3050			  [Define to enable rpz-nsdname rules.])
3051		;;
3052	no)
3053		;;
3054	*)
3055		;;
3056esac
3057
3058#
3059# Activate "filter-aaaa-on-v4" or not?
3060#
3061AC_ARG_ENABLE(filter-aaaa,
3062	[  --enable-filter-aaaa    enable filtering of AAAA records over IPv4
3063			  [[default=no]]],
3064			enable_filter="$enableval",
3065			enable_filter="no")
3066case "$enable_filter" in
3067	yes)
3068		AC_DEFINE(ALLOW_FILTER_AAAA_ON_V4, 1,
3069			  [Define to enable the "filter-aaaa-on-v4" option.])
3070		;;
3071	no)
3072		;;
3073	*)
3074		;;
3075esac
3076
3077#
3078#  The following sets up how non-blocking i/o is established.
3079#  Sunos, cygwin and solaris 2.x (x<5) require special handling.
3080#
3081case "$host" in
3082*-sunos*) AC_DEFINE(PORT_NONBLOCK, O_NDELAY);;
3083*-cygwin*) AC_DEFINE(PORT_NONBLOCK, O_NDELAY);;
3084*-solaris2.[[01234]])
3085	AC_DEFINE(PORT_NONBLOCK, O_NONBLOCK)
3086	AC_DEFINE(USE_FIONBIO_IOCTL, 1,
3087		  [Defined if you need to use ioctl(FIONBIO) instead a fcntl call to make non-blocking.])
3088	;;
3089*) AC_DEFINE(PORT_NONBLOCK, O_NONBLOCK,
3090	     [Sets which flag to pass to open/fcntl to make non-blocking (O_NDELAY/O_NONBLOCK).])
3091	;;
3092esac
3093#
3094# Solaris 2.5.1 and earlier cannot bind() then connect() a TCP socket.
3095# This prevents the source address being set.
3096#
3097case "$host" in
3098*-solaris2.[[012345]]|*-solaris2.5.1)
3099	AC_DEFINE(BROKEN_TCP_BIND_BEFORE_CONNECT, 1,
3100		  [Define if you cannot bind() before connect() for TCP sockets.])
3101	;;
3102esac
3103#
3104# The following sections deal with tools used for formatting
3105# the documentation.  They are all optional, unless you are
3106# a developer editing the documentation source.
3107#
3108
3109#
3110# Look for TeX.
3111#
3112
3113AC_PATH_PROGS(LATEX, latex, latex)
3114AC_SUBST(LATEX)
3115
3116AC_PATH_PROGS(PDFLATEX, pdflatex, pdflatex)
3117AC_SUBST(PDFLATEX)
3118
3119#
3120# Look for w3m
3121#
3122
3123AC_PATH_PROGS(W3M, w3m, w3m)
3124AC_SUBST(W3M)
3125
3126#
3127# Look for xsltproc (libxslt)
3128#
3129
3130AC_PATH_PROG(XSLTPROC, xsltproc, xsltproc)
3131AC_SUBST(XSLTPROC)
3132
3133#
3134# Look for xmllint (libxml2)
3135#
3136
3137AC_PATH_PROG(XMLLINT, xmllint, xmllint)
3138AC_SUBST(XMLLINT)
3139
3140#
3141# Look for Doxygen
3142#
3143
3144AC_PATH_PROG(DOXYGEN, doxygen, doxygen)
3145AC_SUBST(DOXYGEN)
3146
3147#
3148# Subroutine for searching for an ordinary file (e.g., a stylesheet)
3149# in a number of directories:
3150#
3151#   NOM_PATH_FILE(VARIABLE, FILENAME, DIRECTORIES)
3152#
3153# If the file FILENAME is found in one of the DIRECTORIES, the shell
3154# variable VARIABLE is defined to its absolute pathname.  Otherwise,
3155# it is set to FILENAME, with no directory prefix (that's not terribly
3156# useful, but looks less confusing in substitutions than leaving it
3157# empty).  The variable VARIABLE will be substituted into output files.
3158#
3159
3160AC_DEFUN(NOM_PATH_FILE, [
3161$1=""
3162AC_MSG_CHECKING(for $2)
3163for d in $3
3164do
3165	f=$d/$2
3166	if test -f $f
3167	then
3168		$1=$f
3169		AC_MSG_RESULT($f)
3170		break
3171	fi
3172done
3173if test "X[$]$1" = "X"
3174then
3175	AC_MSG_RESULT("not found");
3176	$1=$2
3177fi
3178AC_SUBST($1)
3179])
3180
3181#
3182# Look for Docbook-XSL stylesheets.  Location probably varies by system.
3183# If it's not explicitly specified, guess where it might be found, based on
3184# where SGML stuff lives on some systems (FreeBSD is the only one we're sure
3185# of at the moment).
3186#
3187AC_MSG_CHECKING(for Docbook-XSL path)
3188AC_ARG_WITH(docbook-xsl,
3189[  --with-docbook-xsl=PATH Specify path for Docbook-XSL stylesheets],
3190   docbook_path="$withval", docbook_path="auto")
3191case "$docbook_path" in
3192auto)
3193	AC_MSG_RESULT(auto)
3194	docbook_xsl_trees="/usr/pkg/share/xsl/docbook /usr/local/share/xsl/docbook /usr/share/xsl/docbook /opt/local/share/xsl/docbook-xsl"
3195	;;
3196*)
3197	docbook_xsl_trees="$withval"
3198    	AC_MSG_RESULT($docbook_xsl_trees)
3199	;;
3200esac
3201
3202#
3203# Look for stylesheets we need.
3204#
3205
3206NOM_PATH_FILE(XSLT_DOCBOOK_STYLE_HTML, html/docbook.xsl, $docbook_xsl_trees)
3207NOM_PATH_FILE(XSLT_DOCBOOK_STYLE_XHTML, xhtml/docbook.xsl, $docbook_xsl_trees)
3208NOM_PATH_FILE(XSLT_DOCBOOK_STYLE_MAN, manpages/docbook.xsl, $docbook_xsl_trees)
3209NOM_PATH_FILE(XSLT_DOCBOOK_CHUNK_HTML, html/chunk.xsl, $docbook_xsl_trees)
3210NOM_PATH_FILE(XSLT_DOCBOOK_CHUNK_XHTML, xhtml/chunk.xsl, $docbook_xsl_trees)
3211NOM_PATH_FILE(XSLT_DOCBOOK_CHUNKTOC_HTML, html/chunktoc.xsl, $docbook_xsl_trees)
3212NOM_PATH_FILE(XSLT_DOCBOOK_CHUNKTOC_XHTML, xhtml/chunktoc.xsl, $docbook_xsl_trees)
3213NOM_PATH_FILE(XSLT_DOCBOOK_MAKETOC_HTML, html/maketoc.xsl, $docbook_xsl_trees)
3214NOM_PATH_FILE(XSLT_DOCBOOK_MAKETOC_XHTML, xhtml/maketoc.xsl, $docbook_xsl_trees)
3215
3216#
3217# Same dance for db2latex
3218#
3219# No idea where this lives except on FreeBSD.
3220#
3221
3222db2latex_xsl_trees="/usr/local/share"
3223
3224#
3225# Look for stylesheets we need.
3226#
3227
3228NOM_PATH_FILE(XSLT_DB2LATEX_STYLE, db2latex/xsl/docbook.xsl, $db2latex_xsl_trees)
3229
3230#
3231# Look for "admonition" image directory.  Can't use NOM_PATH_FILE()
3232# because it's a directory, so just do the same things, inline.
3233#
3234
3235AC_MSG_CHECKING(for db2latex/xsl/figures)
3236for d in $db2latex_xsl_trees
3237do
3238	dd=$d/db2latex/xsl/figures
3239	if test -d $dd
3240	then
3241		XSLT_DB2LATEX_ADMONITIONS=$dd
3242		AC_MSG_RESULT($dd)
3243		break
3244	fi
3245done
3246if test "X$XSLT_DB2LATEX_ADMONITIONS" = "X"
3247then
3248	AC_MSG_RESULT(not found)
3249	XSLT_DB2LATEX_ADMONITIONS=db2latex/xsl/figures
3250fi
3251AC_SUBST(XSLT_DB2LATEX_ADMONITIONS)
3252
3253#
3254# IDN support
3255#
3256AC_ARG_WITH(idn,
3257	[  --with-idn[=MPREFIX]      enable IDN support using idnkit [default PREFIX]],
3258	use_idn="$withval", use_idn="no")
3259case "$use_idn" in
3260yes)
3261	if test X$prefix = XNONE ; then
3262		idn_path=/usr/local
3263	else
3264		idn_path=$prefix
3265	fi
3266	;;
3267no)
3268	;;
3269*)
3270	idn_path="$use_idn"
3271	;;
3272esac
3273
3274iconvinc=
3275iconvlib=
3276AC_ARG_WITH(libiconv,
3277	[  --with-libiconv[=IPREFIX] GNU libiconv are in IPREFIX [default PREFIX]],
3278	use_libiconv="$withval", use_libiconv="no")
3279case "$use_libiconv" in
3280yes)
3281	if test X$prefix = XNONE ; then
3282		iconvlib="-L/usr/local/lib -R/usr/local/lib -liconv"
3283	else
3284		iconvlib="-L$prefix/lib -R$prefix/lib -liconv"
3285	fi
3286	;;
3287no)
3288	iconvlib=
3289	;;
3290*)
3291	iconvlib="-L$use_libiconv/lib -R$use_libiconv/lib -liconv"
3292	;;
3293esac
3294
3295AC_ARG_WITH(iconv,
3296	[  --with-iconv[=LIBSPEC]    specify iconv library [default -liconv]],
3297	iconvlib="$withval")
3298case "$iconvlib" in
3299no)
3300	iconvlib=
3301	;;
3302yes)
3303	iconvlib=-liconv
3304	;;
3305esac
3306
3307AC_ARG_WITH(idnlib,
3308	[  --with-idnlib=ARG       specify libidnkit],
3309	idnlib="$withval", idnlib="no")
3310if test "$idnlib" = yes; then
3311	AC_MSG_ERROR([You must specify ARG for --with-idnlib.])
3312fi
3313
3314IDNLIBS=
3315if test "$use_idn" != no; then
3316	AC_DEFINE(WITH_IDN, 1, [define if idnkit support is to be included.])
3317	STD_CINCLUDES="$STD_CINCLUDES -I$idn_path/include"
3318	if test "$idnlib" != no; then
3319		IDNLIBS="$idnlib $iconvlib"
3320	else
3321		IDNLIBS="-L$idn_path/lib -lidnkit $iconvlib"
3322	fi
3323fi
3324AC_SUBST(IDNLIBS)
3325
3326#
3327# Check whether to build Automated Test Framework unit tests
3328#
3329AC_ARG_WITH(atf,
3330	[  --with-atf=ARG          Automated Test Framework support],
3331	atf="$withval", atf="no")
3332if test "$atf" = yes; then
3333	atf=`pwd`/unit/atf
3334	ATFBUILD=atf-src
3335	AC_SUBST(ATFBUILD)
3336	AC_CONFIG_COMMANDS([atf-config],
3337		[(
3338		 mkdir -p unit/atf-src;
3339		 cd unit/atf-src;
3340		 case "$srcdir" in
3341		 /*) ;;
3342		 *) srcdir="../../$srcdir";;
3343		 esac
3344		 ${SHELL} "${srcdir}${srcdir:+/unit/atf-src/}./configure" --enable-tools --disable-shared MISSING=: --prefix $atfdir;
3345		) ],
3346		[atfdir=`pwd`/unit/atf])
3347	AC_MSG_RESULT(building ATF from bind9/unit/atf-src)
3348fi
3349
3350ATFLIBS=
3351if test "$atf" != no; then
3352	AC_DEFINE(ATF_TEST, 1, [define if ATF unit tests are to be built.])
3353	STD_CINCLUDES="$STD_CINCLUDES -I$atf/include"
3354	ATFBIN="$atf/bin"
3355	ATFLIBS="-L$atf/lib -latf-c"
3356	if test "$want_openssl_hash" = yes; then
3357		ATFLIBS="-L$atf/lib -latf-c $DNS_CRYPTO_LIBS"
3358	fi
3359	UNITTESTS=tests
3360fi
3361AC_SUBST(ATFBIN)
3362AC_SUBST(ATFLIBS)
3363AC_SUBST(UNITTESTS)
3364
3365AC_CHECK_HEADERS(locale.h)
3366AC_CHECK_FUNCS(setlocale)
3367
3368#
3369# Substitutions
3370#
3371AC_SUBST(BIND9_TOP_BUILDDIR)
3372BIND9_TOP_BUILDDIR=`pwd`
3373
3374AC_SUBST(BIND9_ISC_BUILDINCLUDE)
3375AC_SUBST(BIND9_ISCCC_BUILDINCLUDE)
3376AC_SUBST(BIND9_ISCCFG_BUILDINCLUDE)
3377AC_SUBST(BIND9_DNS_BUILDINCLUDE)
3378AC_SUBST(BIND9_LWRES_BUILDINCLUDE)
3379AC_SUBST(BIND9_BIND9_BUILDINCLUDE)
3380if test "X$srcdir" != "X"; then
3381	BIND9_ISC_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/isc/include"
3382	BIND9_ISCCC_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/isccc/include"
3383	BIND9_ISCCFG_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/isccfg/include"
3384	BIND9_DNS_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/dns/include"
3385	BIND9_LWRES_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/lwres/include"
3386	BIND9_BIND9_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/bind9/include"
3387else
3388	BIND9_ISC_BUILDINCLUDE=""
3389	BIND9_ISCCC_BUILDINCLUDE=""
3390	BIND9_ISCCFG_BUILDINCLUDE=""
3391	BIND9_DNS_BUILDINCLUDE=""
3392	BIND9_LWRES_BUILDINCLUDE=""
3393	BIND9_BIND9_BUILDINCLUDE=""
3394fi
3395
3396AC_SUBST_FILE(BIND9_MAKE_INCLUDES)
3397BIND9_MAKE_INCLUDES=$BIND9_TOP_BUILDDIR/make/includes
3398
3399AC_SUBST_FILE(BIND9_MAKE_RULES)
3400BIND9_MAKE_RULES=$BIND9_TOP_BUILDDIR/make/rules
3401
3402. "$srcdir/version"
3403BIND9_PRODUCT="PRODUCT=\"${PRODUCT}\""
3404AC_SUBST(BIND9_PRODUCT)
3405BIND9_DESCRIPTION="DESCRIPTION=\"${DESCRIPTION}\""
3406AC_SUBST(BIND9_DESCRIPTION)
3407BIND9_VERSION="VERSION=${MAJORVER}.${MINORVER}${PATCHVER:+.}${PATCHVER}${RELEASETYPE}${RELEASEVER}${EXTENSIONS}"
3408AC_SUBST(BIND9_VERSION)
3409
3410BIND9_SRCID="SRCID=unset"
3411if test -f "${srcdir}/srcid"; then
3412	. "${srcdir}/srcid"
3413	BIND9_SRCID="SRCID=$SRCID"
3414elif test -d "${srcdir}/.git"; then
3415	BIND9_SRCID="SRCID="`(cd "${srcdir}";git log -n 1 --format=%h)`
3416fi
3417
3418AC_SUBST(BIND9_SRCID)
3419
3420if test -z "$ac_configure_args"; then
3421	BIND9_CONFIGARGS="defaults"
3422else
3423	for a in $ac_configure_args
3424	do
3425		BIND9_CONFIGARGS="$BIND9_CONFIGARGS $a"
3426	done
3427fi
3428BIND9_CONFIGARGS="`echo $BIND9_CONFIGARGS | sed 's/^ //'`"
3429BIND9_CONFIGARGS="CONFIGARGS=${BIND9_CONFIGARGS}"
3430AC_SUBST(BIND9_CONFIGARGS)
3431
3432AC_SUBST_FILE(LIBISC_API)
3433LIBISC_API="$srcdir/lib/isc/api"
3434
3435AC_SUBST_FILE(LIBISCCC_API)
3436LIBISCCC_API="$srcdir/lib/isccc/api"
3437
3438AC_SUBST_FILE(LIBISCCFG_API)
3439LIBISCCFG_API="$srcdir/lib/isccfg/api"
3440
3441AC_SUBST_FILE(LIBDNS_API)
3442LIBDNS_API="$srcdir/lib/dns/api"
3443
3444AC_SUBST_FILE(LIBBIND9_API)
3445LIBBIND9_API="$srcdir/lib/bind9/api"
3446
3447AC_SUBST_FILE(LIBLWRES_API)
3448LIBLWRES_API="$srcdir/lib/lwres/api"
3449
3450AC_SUBST_FILE(LIBIRS_API)
3451LIBIRS_API="$srcdir/lib/irs/api"
3452
3453#
3454# Configure any DLZ drivers.
3455#
3456# If config.dlz.in selects one or more DLZ drivers, it will set
3457# CONTRIB_DLZ to a non-empty value, which will be our clue to
3458# build DLZ drivers in contrib.
3459#
3460# This section has to come after the libtool stuff because it needs to
3461# know how to name the driver object files.
3462#
3463
3464CONTRIB_DLZ=""
3465DLZ_DRIVER_INCLUDES=""
3466DLZ_DRIVER_LIBS=""
3467DLZ_DRIVER_SRCS=""
3468DLZ_DRIVER_OBJS=""
3469DLZ_SYSTEM_TEST=""
3470
3471#
3472# Configure support for building a shared library object
3473#
3474# Even when libtool is available it can't always be relied upon
3475# to build an object that can be dlopen()'ed, but this is necessary
3476# for building the dlzexternal system test, so we'll try it the
3477# old-fashioned way.
3478#
3479SO="so"
3480SO_CFLAGS=""
3481SO_LD=""
3482SO_TARGETS=""
3483
3484AC_ARG_WITH(dlopen,
3485	[  --with-dlopen=ARG       Support dynamically loadable DLZ drivers],
3486	dlopen="$withval", dlopen="yes")
3487
3488case $host in
3489	*-sunos*) dlopen="no"
3490		;;
3491esac
3492
3493if test "$dlopen" = "yes"; then
3494	AC_CHECK_LIB(dl, dlopen, have_dl=yes, have_dl=no)
3495	if test "$have_dl" = "yes"; then
3496		LIBS="-ldl $LIBS"
3497	fi
3498        AC_CHECK_FUNCS(dlopen dlclose dlsym,,dlopen=no)
3499fi
3500
3501if test "$dlopen" = "yes"; then
3502	case $host in
3503		*-linux*)
3504			SO_CFLAGS="-fPIC"
3505			if test "$have_dl" = "yes"
3506			then
3507				if test "$use_libtool" = "yes"; then
3508					SO_LD="${CC} -Xcompiler -shared"
3509				else
3510					SO_LD="${CC} -shared"
3511				fi
3512			else
3513				SO_LD="ld -shared"
3514			fi
3515			;;
3516		*-freebsd*|*-openbsd*|*-netbsd*)
3517			SO_CFLAGS="-fpic"
3518			SO_LD="ld -Bshareable -x"
3519			;;
3520		*-solaris*)
3521			SO_CFLAGS="-KPIC"
3522			SO_LD="ld -G -z text"
3523                        ;;
3524		*-hp-hpux*)
3525			SO=sl
3526			SO_CFLAGS="+z"
3527			SO_LD="ld -b"
3528                        ;;
3529		*)
3530			SO_CFLAGS="-fPIC"
3531			;;
3532	esac
3533
3534	if test "X$GCC" = "Xyes"; then
3535		SO_CFLAGS="-fPIC"
3536                test -n "$SO_LD" || SO_LD="${CC} -shared"
3537	fi
3538
3539	# If we still don't know how to make shared objects, don't make any.
3540	if test -n "$SO_LD"; then
3541		SO_TARGETS="\${SO_TARGETS}"
3542		AC_DEFINE(ISC_DLZ_DLOPEN, 1,
3543			  [Define to allow building of objects for dlopen().])
3544	fi
3545fi
3546
3547AC_SUBST(SO)
3548AC_SUBST(SO_CFLAGS)
3549AC_SUBST(SO_LD)
3550AC_SUBST(SO_TARGETS)
3551
3552sinclude(contrib/dlz/config.dlz.in)
3553AC_MSG_CHECKING(contributed DLZ drivers)
3554
3555if test -n "$CONTRIB_DLZ"
3556then
3557	AC_MSG_RESULT(yes)
3558	DLZ_DRIVER_RULES=contrib/dlz/drivers/rules
3559	AC_CONFIG_FILES([$DLZ_DRIVER_RULES])
3560else
3561	AC_MSG_RESULT(no)
3562	DLZ_DRIVER_RULES=/dev/null
3563fi
3564
3565AC_SUBST(CONTRIB_DLZ)
3566AC_SUBST(DLZ_DRIVER_INCLUDES)
3567AC_SUBST(DLZ_DRIVER_LIBS)
3568AC_SUBST(DLZ_DRIVER_SRCS)
3569AC_SUBST(DLZ_DRIVER_OBJS)
3570AC_SUBST(DLZ_SYSTEM_TEST)
3571AC_SUBST_FILE(DLZ_DRIVER_RULES)
3572
3573if test "$cross_compiling" = "yes"; then
3574	if test -z "$BUILD_CC"; then
3575		AC_ERROR([BUILD_CC not set])
3576	fi
3577	BUILD_CFLAGS="$BUILD_CFLAGS"
3578	BUILD_CPPFLAGS="$BUILD_CPPFLAGS"
3579	BUILD_LDFLAGS="$BUILD_LDFLAGS"
3580	BUILD_LIBS="$BUILD_LIBS"
3581else
3582	BUILD_CC="$CC"
3583	BUILD_CFLAGS="$CFLAGS"
3584	BUILD_CPPFLAGS="$CPPFLAGS $GEN_NEED_OPTARG"
3585	BUILD_LDFLAGS="$LDFLAGS"
3586	BUILD_LIBS="$LIBS"
3587fi
3588
3589NEWFLAGS=""
3590for e in $BUILD_LDFLAGS ; do
3591    case $e in
3592	-L*)
3593	    case $host_os in
3594		netbsd*)
3595		    ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'`
3596		    NEWFLAGS="$NEWFLAGS $e $ee"
3597		    ;;
3598		freebsd*)
3599		    ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'`
3600		    NEWFLAGS="$NEWFLAGS $e $ee"
3601		    ;;
3602		solaris*)
3603		    ee=`echo $e | sed -e 's%^-L%-R%'`
3604		    NEWFLAGS="$NEWFLAGS $e $ee"
3605		    ;;
3606		*)
3607		    NEWFLAGS="$NEWFLAGS $e"
3608		    ;;
3609		esac
3610	    ;;
3611	*)
3612	    NEWFLAGS="$NEWFLAGS $e"
3613	    ;;
3614    esac
3615done
3616BUILD_LDFLAGS="$NEWFLAGS"
3617
3618NEWFLAGS=""
3619for e in $DNS_GSSAPI_LIBS ; do
3620    case $e in
3621	-L*)
3622	    case $host_os in
3623		netbsd*)
3624		    ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'`
3625		    NEWFLAGS="$NEWFLAGS $e $ee"
3626		    ;;
3627		freebsd*)
3628		    ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'`
3629		    NEWFLAGS="$NEWFLAGS $e $ee"
3630		    ;;
3631		solaris*)
3632		    ee=`echo $e | sed -e 's%^-L%-R%'`
3633		    NEWFLAGS="$NEWFLAGS $e $ee"
3634		    ;;
3635		*)
3636		    NEWFLAGS="$NEWFLAGS $e"
3637		    ;;
3638		esac
3639	    ;;
3640	*)
3641	    NEWFLAGS="$NEWFLAGS $e"
3642	    ;;
3643    esac
3644done
3645DNS_GSSAPI_LIBS="$NEWFLAGS"
3646
3647NEWFLAGS=""
3648for e in $DNS_CRYPTO_LIBS ; do
3649    case $e in
3650	-L*)
3651	    case $host_os in
3652		netbsd*)
3653		    ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'`
3654		    NEWFLAGS="$NEWFLAGS $e $ee"
3655		    ;;
3656		freebsd*)
3657		    ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'`
3658		    NEWFLAGS="$NEWFLAGS $e $ee"
3659		    ;;
3660		solaris*)
3661		    ee=`echo $e | sed -e 's%^-L%-R%'`
3662		    NEWFLAGS="$NEWFLAGS $e $ee"
3663		    ;;
3664		*)
3665		    NEWFLAGS="$NEWFLAGS $e"
3666		    ;;
3667		esac
3668	    ;;
3669	*)
3670	    NEWFLAGS="$NEWFLAGS $e"
3671	    ;;
3672    esac
3673done
3674DNS_CRYPTO_LIBS="$NEWFLAGS"
3675
3676AC_SUBST(BUILD_CC)
3677AC_SUBST(BUILD_CFLAGS)
3678AC_SUBST(BUILD_CPPFLAGS)
3679AC_SUBST(BUILD_LDFLAGS)
3680AC_SUBST(BUILD_LIBS)
3681
3682#
3683# Commands to run at the end of config.status.
3684# Don't just put these into configure, it won't work right if somebody
3685# runs config.status directly (which autoconf allows).
3686#
3687
3688AC_CONFIG_COMMANDS(
3689	[chmod],
3690	[chmod a+x isc-config.sh doc/doxygen/doxygen-input-filter])
3691
3692#
3693# Files to configure.  These are listed here because we used to
3694# specify them as arguments to AC_OUTPUT.  It's (now) ok to move these
3695# elsewhere if there's a good reason for doing so.
3696#
3697
3698AC_CONFIG_FILES([
3699  make/Makefile
3700  make/mkdep
3701	Makefile
3702	bin/Makefile
3703	bin/check/Makefile
3704	bin/confgen/Makefile
3705	bin/confgen/unix/Makefile
3706	bin/dig/Makefile
3707	bin/dnssec/Makefile
3708	bin/named/Makefile
3709	bin/named/unix/Makefile
3710	bin/nsupdate/Makefile
3711	bin/pkcs11/Makefile
3712	bin/python/Makefile
3713	bin/python/dnssec-checkds.py
3714	bin/python/dnssec-coverage.py
3715	bin/rndc/Makefile
3716	bin/tests/Makefile
3717	bin/tests/atomic/Makefile
3718	bin/tests/db/Makefile
3719	bin/tests/dst/Makefile
3720	bin/tests/dst/Kdh.+002+18602.key
3721	bin/tests/dst/Kdh.+002+18602.private
3722	bin/tests/dst/Kdh.+002+48957.key
3723	bin/tests/dst/Kdh.+002+48957.private
3724	bin/tests/dst/Ktest.+001+00002.key
3725	bin/tests/dst/Ktest.+001+54622.key
3726	bin/tests/dst/Ktest.+001+54622.private
3727	bin/tests/dst/Ktest.+003+23616.key
3728	bin/tests/dst/Ktest.+003+23616.private
3729	bin/tests/dst/Ktest.+003+49667.key
3730	bin/tests/dst/dst_2_data
3731	bin/tests/dst/t2_data_1
3732	bin/tests/dst/t2_data_2
3733	bin/tests/dst/t2_dsasig
3734	bin/tests/dst/t2_rsasig
3735	bin/tests/hashes/Makefile
3736	bin/tests/headerdep_test.sh
3737	bin/tests/master/Makefile
3738	bin/tests/mem/Makefile
3739	bin/tests/names/Makefile
3740	bin/tests/net/Makefile
3741	bin/tests/rbt/Makefile
3742	bin/tests/resolver/Makefile
3743	bin/tests/sockaddr/Makefile
3744	bin/tests/system/Makefile
3745	bin/tests/system/conf.sh
3746	bin/tests/system/dlz/prereq.sh
3747	bin/tests/system/dlzexternal/Makefile
3748	bin/tests/system/dlzexternal/ns1/named.conf
3749	bin/tests/system/ecdsa/prereq.sh
3750	bin/tests/system/filter-aaaa/Makefile
3751	bin/tests/system/gost/prereq.sh
3752	bin/tests/system/inline/checkdsa.sh
3753	bin/tests/system/lwresd/Makefile
3754	bin/tests/system/rpz/Makefile
3755	bin/tests/system/rrl/Makefile
3756	bin/tests/system/rsabigexponent/Makefile
3757	bin/tests/system/tkey/Makefile
3758	bin/tests/system/tsiggss/Makefile
3759	bin/tests/tasks/Makefile
3760	bin/tests/timers/Makefile
3761	bin/tests/virtual-time/Makefile
3762	bin/tests/virtual-time/conf.sh
3763	bin/tools/Makefile
3764	contrib/check-secure-delegation.pl
3765	contrib/zone-edit.sh
3766	doc/Makefile
3767	doc/arm/Makefile
3768	doc/doxygen/Doxyfile
3769	doc/doxygen/Makefile
3770	doc/doxygen/doxygen-input-filter
3771	doc/misc/Makefile
3772	doc/xsl/Makefile
3773	doc/xsl/isc-docbook-chunk.xsl
3774	doc/xsl/isc-docbook-html.xsl
3775	doc/xsl/isc-docbook-latex.xsl
3776	doc/xsl/isc-manpage.xsl
3777	isc-config.sh
3778	lib/Makefile
3779	lib/bind9/Makefile
3780	lib/bind9/include/Makefile
3781	lib/bind9/include/bind9/Makefile
3782	lib/dns/Makefile
3783	lib/dns/include/Makefile
3784	lib/dns/include/dns/Makefile
3785	lib/dns/include/dst/Makefile
3786	lib/dns/tests/Makefile
3787	lib/export/Makefile
3788	lib/export/dns/Makefile
3789	lib/export/dns/include/Makefile
3790	lib/export/dns/include/dns/Makefile
3791	lib/export/dns/include/dst/Makefile
3792	lib/export/irs/Makefile
3793	lib/export/irs/include/Makefile
3794	lib/export/irs/include/irs/Makefile
3795	lib/export/isc/$thread_dir/Makefile
3796	lib/export/isc/$thread_dir/include/Makefile
3797	lib/export/isc/$thread_dir/include/isc/Makefile
3798	lib/export/isc/Makefile
3799	lib/export/isc/include/Makefile
3800	lib/export/isc/include/isc/Makefile
3801	lib/export/isc/nls/Makefile
3802	lib/export/isc/unix/Makefile
3803	lib/export/isc/unix/include/Makefile
3804	lib/export/isc/unix/include/isc/Makefile
3805	lib/export/isccfg/Makefile
3806	lib/export/isccfg/include/Makefile
3807	lib/export/isccfg/include/isccfg/Makefile
3808	lib/export/samples/Makefile
3809	lib/export/samples/Makefile-postinstall
3810	lib/irs/Makefile
3811	lib/irs/include/Makefile
3812	lib/irs/include/irs/Makefile
3813	lib/irs/include/irs/netdb.h
3814	lib/irs/include/irs/platform.h
3815	lib/isc/$arch/Makefile
3816	lib/isc/$arch/include/Makefile
3817	lib/isc/$arch/include/isc/Makefile
3818	lib/isc/$thread_dir/Makefile
3819	lib/isc/$thread_dir/include/Makefile
3820	lib/isc/$thread_dir/include/isc/Makefile
3821	lib/isc/Makefile
3822	lib/isc/include/Makefile
3823	lib/isc/include/isc/Makefile
3824	lib/isc/include/isc/platform.h
3825	lib/isc/tests/Makefile
3826	lib/isc/nls/Makefile
3827	lib/isc/unix/Makefile
3828	lib/isc/unix/include/Makefile
3829	lib/isc/unix/include/isc/Makefile
3830	lib/isccc/Makefile
3831	lib/isccc/include/Makefile
3832	lib/isccc/include/isccc/Makefile
3833	lib/isccfg/Makefile
3834	lib/isccfg/include/Makefile
3835	lib/isccfg/include/isccfg/Makefile
3836	lib/lwres/Makefile
3837	lib/lwres/include/Makefile
3838	lib/lwres/include/lwres/Makefile
3839	lib/lwres/include/lwres/netdb.h
3840	lib/lwres/include/lwres/platform.h
3841	lib/lwres/man/Makefile
3842	lib/lwres/unix/Makefile
3843	lib/lwres/unix/include/Makefile
3844	lib/lwres/unix/include/lwres/Makefile
3845	lib/tests/Makefile
3846	lib/tests/include/Makefile
3847	lib/tests/include/tests/Makefile
3848	unit/Makefile
3849	unit/unittest.sh
3850])
3851
3852#
3853# Do it
3854#
3855
3856AC_OUTPUT
3857
3858#
3859# Now that the Makefiles exist we can ensure that everything is rebuilt.
3860#
3861AC_ARG_WITH(make-clean,
3862[  --with-make-clean      Run "make clean" at end of configure [[yes|no]].],
3863    make_clean="$withval", make_clean="yes")
3864case "$make_clean" in
3865yes)
3866	make clean
3867	;;
3868esac
3869
3870AC_ARG_ENABLE(full-report,
3871	[  --enable-full-report	  report values of all configure options])
3872
3873echo "========================================================================"
3874echo "Configuration summary:"
3875echo "------------------------------------------------------------------------"
3876echo "Optional features enabled:"
3877$use_threads && echo "    Multiprocessing support (--enable-threads)"
3878
3879test "$enable_rrl" = "yes" && \
3880    echo "    Response Rate Limiting (--enable-rrl)"
3881test "$use_gssapi" = "no" || echo "    GSS-API (--with-gssapi)"
3882test "$use_pkcs11" = "no" || echo "    PKCS#11/Cryptoki support (--with-pkcs11)"
3883test "$enable_newstats" = "yes" && \
3884    echo "    New statistics (--enable-newstats)"
3885test "$enable_fixed" = "yes" && \
3886    echo "    Allow 'fixed' rrset-order (--enable-fixed-rrset)"
3887test "$enable_filter" = "yes" && \
3888    echo "    AAAA filtering (--enable-filter-aaaa)"
3889test "$want_backtrace" = "yes" && \
3890    echo "    Print backtrace on crash (--enable-backtrace)"
3891test "$want_symtable" = "minimal" && \
3892    echo "    Use symbol table for backtrace, named only (--enable-symtable)"
3893test "$want_symtable" = "yes" -o "$want_symtable" = "all" && \
3894    echo "    Use symbol table for backtrace, all binaries (--enable-symtable=all)"
3895test "$atf" = "no" || echo "    Automated Testing Framework (--with-atf)"
3896
3897# these lines are only printed if run with --enable-full-report 
3898if test "$enable_full_report" = "yes"; then
3899    test "$enable_ipv6" = "no" -o "$found_ipv6" = "no" || \
3900        echo "    IPv6 support (--enable-ipv6)"
3901    test "X$USE_OPENSSL" = "X" || \
3902            echo "    OpenSSL cryptography/DNSSEC (--with-openssl)"
3903    test "$OPENSSL_GOST" != "yes" || \
3904            echo "    GOST algorithm support (--with-gost)"
3905    test "$OPENSSL_ECDSA" != "yes" || \
3906            echo "    ECDSA algorithm support (--with-ecdsa)"
3907    test "X$PYTHON" = "X" || echo "    Python tools (--with-python)"
3908    test "X$libxml2_libs" = "X" || echo "    XML statistics (--with-libxml2)"
3909fi
3910
3911echo "    Dynamically loadable zone (DLZ) drivers:"
3912test "$use_dlz_bdb" = "no" || \
3913    echo "        Berkeley DB (--with-dlz-bdb)"
3914test "$use_dlz_ldap" = "no" || \
3915    echo "        LDAP (--with-dlz-ldap)"
3916test "$use_dlz_mysql" = "no" || \
3917    echo "        MySQL (--with-dlz-mysql)"
3918test "$use_dlz_odbc" = "no" || \
3919    echo "        ODBC (--with-dlz-bdb)"
3920test "$use_dlz_postgres" = "no" || \
3921    echo "        Postgres (--with-dlz-postgres)"
3922test "$use_dlz_filesystem" = "no" || \
3923    echo "        Filesystem (--with-dlz-filesystem)"
3924test "$use_dlz_stub" = "no" || \
3925    echo "        Stub (--with-dlz-stub)"
3926test "$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"
3927echo
3928
3929echo "Features disabled or unavailable on this platform:"
3930$use_threads || echo "    Multiprocessing support (--enable-threads)"
3931test "$enable_ipv6" = "no" -o "$found_ipv6" = "no" && \
3932        echo "    IPv6 support (--enable-ipv6)"
3933test "$enable_rrl" = "yes" || \
3934    echo "    Response Rate Limiting (--enable-rrl)"
3935test "$use_gssapi" = "no" && echo "    GSS-API (--with-gssapi)"
3936test "$use_pkcs11" = "no" && echo "    PKCS#11/Cryptoki support (--with-pkcs11)"
3937test "X$enable_newstats" = "X" && echo "    New statistics (--enable-newstats)"
3938test "$enable_fixed" = "yes" || \
3939    echo "    Allow 'fixed' rrset-order (--enable-fixed-rrset)"
3940test "$want_backtrace" = "yes" || \
3941    echo "    Print backtrace on crash (--enable-backtrace)"
3942test "$atf" = "no" && echo "    Automated Testing Framework (--with-atf)"
3943test "X$USE_OPENSSL" = "X" && \
3944        echo "    OpenSSL cryptography/DNSSEC (--with-openssl)"
3945test "X$USE_OPENSSL" != "X" -a "$OPENSSL_GOST" != "yes" && \
3946    echo "    GOST algorithm support (--with-gost)"
3947test "X$USE_OPENSSL" != "X" -a "$OPENSSL_ECDSA" != "yes" && \
3948    echo "    ECDSA algorithm support (--with-ecdsa)"
3949test "X$PYTHON" = "X" && echo "    Python tools (--with-python)"
3950test "X$libxml2_libs" = "X" && echo "    XML statistics (--with-libxml2)"
3951
3952echo "========================================================================"
3953
3954if test "X$USE_OPENSSL" = "X"; then
3955cat << \EOF
3956BIND is being built without OpenSSL. This means it will not have DNSSEC support.
3957EOF
3958fi
3959
3960if test "X$OPENSSL_WARNING" != "X"; then
3961cat << \EOF
3962WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
3963WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
3964WARNING                                                                 WARNING
3965WARNING         Your OpenSSL crypto library may be vulnerable to        WARNING
3966WARNING         one or more of the the following known security         WARNING
3967WARNING         flaws:                                                  WARNING
3968WARNING                                                                 WARNING
3969WARNING         CAN-2002-0659, CAN-2006-4339, CVE-2006-2937 and         WARNING
3970WARNING         CVE-2006-2940.                                          WARNING
3971WARNING                                                                 WARNING
3972WARNING         It is recommended that you upgrade to OpenSSL           WARNING
3973WARNING         version 0.9.8d/0.9.7l (or greater).                     WARNING
3974WARNING                                                                 WARNING
3975WARNING         You can disable this warning by specifying:             WARNING
3976WARNING                                                                 WARNING
3977WARNING               --disable-openssl-version-check          	        WARNING
3978WARNING                                                                 WARNING
3979WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
3980WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
3981EOF
3982fi
3983
3984# Tell Emacs to edit this file in shell mode.
3985# Local Variables:
3986# mode: sh
3987# End:
3988