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