configure.in revision 143731
1# Copyright (C) 2004  Internet Systems Consortium, Inc. ("ISC")
2# Copyright (C) 1998-2003  Internet Software Consortium.
3#
4# Permission to use, copy, modify, and 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.294.2.23.2.39 $)
22
23AC_INIT(lib/dns/name.c)
24AC_PREREQ(2.13)
25
26AC_CONFIG_HEADER(config.h)
27AC_CONFIG_SUBDIRS(lib/bind)
28
29AC_CANONICAL_HOST
30
31AC_PROG_MAKE_SET
32AC_PROG_RANLIB
33AC_PROG_INSTALL
34
35AC_SUBST(STD_CINCLUDES)
36AC_SUBST(STD_CDEFINES)
37AC_SUBST(STD_CWARNINGS)
38AC_SUBST(CCOPT)
39
40AC_PATH_PROG(AR, ar)
41ARFLAGS="cruv"
42AC_SUBST(AR)
43AC_SUBST(ARFLAGS)
44
45# The POSIX ln(1) program.  Non-POSIX systems may substitute
46# "copy" or something.
47LN=ln
48AC_SUBST(LN)
49
50case "$AR" in
51	"")
52		AC_MSG_ERROR([
53ar program not found.  Please fix your PATH to include the directory in
54which ar resides, or set AR in the environment with the full path to ar.
55])
56
57		;;
58esac
59
60#
61# Etags.
62#
63AC_PATH_PROGS(ETAGS, etags emacs-etags)
64
65#
66# Some systems, e.g. RH7, have the Exuberant Ctags etags instead of
67# GNU emacs etags, and it requires the -L flag.
68#
69if test "X$ETAGS" != "X"; then
70	AC_MSG_CHECKING(for Exuberant Ctags etags)
71	if $ETAGS --version 2>&1 | grep 'Exuberant Ctags' >/dev/null 2>&1; then
72		AC_MSG_RESULT(yes)
73		ETAGS="$ETAGS -L"
74	else
75		AC_MSG_RESULT(no)
76	fi
77fi
78AC_SUBST(ETAGS)
79
80#
81# Perl is optional; it is used only by some of the system test scripts.
82#
83AC_PATH_PROGS(PERL, perl5 perl)
84AC_SUBST(PERL)
85
86#
87# Special processing of paths depending on whether --prefix,
88# --sysconfdir or --localstatedir arguments were given.  What's
89# desired is some compatibility with the way previous versions
90# of BIND built; they defaulted to /usr/local for most parts of
91# the installation, but named.boot/named.conf was in /etc
92# and named.pid was in /var/run.
93#
94# So ... if none of --prefix, --sysconfdir or --localstatedir are
95# specified, set things up that way.  If --prefix is given, use
96# it for sysconfdir and localstatedir the way configure normally
97# would.  To change the prefix for everything but leave named.conf
98# in /etc or named.pid in /var/run, then do this the usual configure way:
99# ./configure --prefix=/somewhere --sysconfdir=/etc
100# ./configure --prefix=/somewhere --localstatedir=/var
101#
102# To put named.conf and named.pid in /usr/local with everything else,
103# set the prefix explicitly to /usr/local even though that's the default:
104# ./configure --prefix=/usr/local
105#
106case "$prefix" in
107        NONE)
108                case "$sysconfdir" in
109                        '${prefix}/etc')
110                                sysconfdir=/etc
111                                ;;
112                esac
113                case "$localstatedir" in
114                        '${prefix}/var')
115                                localstatedir=/var
116                                ;;
117                esac
118                ;;
119esac
120
121#
122# Make sure INSTALL uses an absolute path, else it will be wrong in all
123# Makefiles, since they use make/rules.in and INSTALL will be adjusted by
124# configure based on the location of the file where it is substituted.
125# Since in BIND9 INSTALL is only substituted into make/rules.in, an immediate
126# subdirectory of install-sh, This relative path will be wrong for all
127# directories more than one level down from install-sh.
128#
129case "$INSTALL" in
130	/*)
131                ;;
132        *)
133                #
134                # Not all systems have dirname.
135                #
136                changequote({, })
137                ac_dir="`echo $INSTALL | sed 's%/[^/]*$%%'`"
138                changequote([, ])
139
140                ac_prog="`echo $INSTALL | sed 's%.*/%%'`"
141                test "$ac_dir" = "$ac_prog" && ac_dir=.
142                test -d "$ac_dir" && ac_dir="`(cd \"$ac_dir\" && pwd)`"
143                INSTALL="$ac_dir/$ac_prog"
144                ;;
145esac
146
147#
148# On these hosts, we really want to use cc, not gcc, even if it is
149# found.  The gcc that these systems have will not correctly handle
150# pthreads.
151#
152# However, if the user sets $CC to be something, let that override
153# our change.
154#
155if test "X$CC" = "X" ; then
156	case "$host" in
157		*-dec-osf*)
158			CC="cc"
159			;;
160		*-solaris*)
161                        # Use Sun's cc if it is available, but watch
162                        # out for /usr/ucb/cc; it will never be the right
163                        # compiler to use.
164                        #
165                        # If setting CC here fails, the AC_PROG_CC done
166                        # below might still find gcc.
167			IFS="${IFS=	}"; ac_save_ifs="$IFS"; IFS=":"
168			for ac_dir in $PATH; do
169				test -z "$ac_dir" && ac_dir=.
170				case "$ac_dir" in
171				/usr/ucb)
172					# exclude
173					;;
174				*)
175					if test -f "$ac_dir/cc"; then
176						CC="$ac_dir/cc"
177						break
178					fi
179					;;
180				esac
181			done
182			IFS="$ac_save_ifs"
183			;;
184		*-hp-hpux*)
185			CC="cc"
186			;;
187		mips-sgi-irix*)
188			CC="cc"
189			;;
190	esac
191fi
192
193AC_PROG_CC
194
195#
196# gcc's optimiser is broken at -02 for ultrasparc
197#
198if test "$ac_env_CFLAGS_set" != set -a "X$GCC" = "Xyes"; then
199	case "$host" in
200	sparc-*)
201		CCFLAGS="-g -O1"
202		;;
203	esac
204fi
205
206#
207# OS dependent CC flags
208#
209case "$host" in
210	# OSF 5.0: recv/send are only avaliable with -D_POSIX_PII_SOCKET or
211	# -D_XOPEN_SOURCE_EXTENDED.
212	*-dec-osf*)
213		STD_CDEFINES="$STD_CDEFINES -D_POSIX_PII_SOCKET"
214		CPPFLAGS="$CPPFLAGS -D_POSIX_PII_SOCKET"
215		;;
216	#HP-UX: need -D_XOPEN_SOURCE_EXTENDED and -lxnet for CMSG macros
217	*-hp-hpux*)
218		STD_CDEFINES="$STD_CDEFINES -D_XOPEN_SOURCE_EXTENDED"
219		CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED"
220		LIBS="-lxnet $LIBS"
221		;;
222	# Solaris: need -D_XPG4_2 and -D__EXTENSIONS__ for CMSG macros
223	*-solaris*)
224		STD_CDEFINES="$STD_CDEFINES -D_XPG4_2 -D__EXTENSIONS__"
225		CPPFLAGS="$CPPFLAGS -D_XPG4_2 -D__EXTENSIONS__"
226		;;
227esac
228
229AC_HEADER_STDC
230
231AC_CHECK_HEADERS(fcntl.h sys/time.h unistd.h sys/sockio.h sys/select.h sys/param.h sys/sysctl.h net/if6.h,,,
232[$ac_includes_default
233#ifdef HAVE_SYS_PARAM_H
234# include <sys/param.h>
235#endif
236])
237
238AC_C_CONST
239AC_C_INLINE
240AC_CHECK_FUNC(sysctlbyname, AC_DEFINE(HAVE_SYSCTLBYNAME))
241
242#
243# UnixWare 7.1.1 with the feature supplement to the UDK compiler
244# is reported to not support "static inline" (RT #1212).
245#
246AC_MSG_CHECKING(for static inline breakage)
247AC_TRY_COMPILE(, [
248		foo1();
249	}
250
251	static inline int foo1() {
252		return 0;
253	}
254
255	static inline int foo2() {
256		return foo1();
257	],
258	[AC_MSG_RESULT(no)],
259	[AC_MSG_RESULT(yes)
260         AC_DEFINE(inline, )])
261
262AC_TYPE_SIZE_T
263AC_CHECK_TYPE(ssize_t, int)
264AC_CHECK_TYPE(socklen_t,
265[AC_DEFINE(ISC_SOCKADDR_LEN_T, socklen_t)],
266[
267AC_TRY_COMPILE(
268[
269#include <sys/types.h>
270#include <sys/socket.h>
271int getsockname(int, struct sockaddr *, size_t *);
272],[],
273[AC_DEFINE(ISC_SOCKADDR_LEN_T, size_t)],
274[AC_DEFINE(ISC_SOCKADDR_LEN_T, int)])
275],
276[
277#include <sys/types.h>
278#include <sys/socket.h>
279])
280AC_SUBST(ISC_SOCKADDR_LEN_T)
281AC_HEADER_TIME
282AC_MSG_CHECKING(for long long)
283AC_TRY_COMPILE([],[long long i = 0; return (0);],
284	[AC_MSG_RESULT(yes)
285		ISC_PLATFORM_HAVELONGLONG="#define ISC_PLATFORM_HAVELONGLONG 1"],
286	[AC_MSG_RESULT(no)
287		ISC_PLATFORM_HAVELONGLONG="#undef ISC_PLATFORM_HAVELONGLONG"])
288AC_SUBST(ISC_PLATFORM_HAVELONGLONG)
289
290#
291# check if we have lifconf
292#
293AC_MSG_CHECKING(for struct lifconf)
294AC_TRY_COMPILE([
295#include <sys/types.h>
296#include <sys/socket.h>
297#include <net/if.h>
298],
299[
300struct lifconf lifconf;
301lifconf.lifc_len = 0;
302]
303,
304	[AC_MSG_RESULT(yes)
305		ISC_PLATFORM_HAVELIFCONF="#define ISC_PLATFORM_HAVELIFCONF 1"],
306	[AC_MSG_RESULT(no)
307		ISC_PLATFORM_HAVELIFCONF="#undef ISC_PLATFORM_HAVELIFCONF"])
308AC_SUBST(ISC_PLATFORM_HAVELIFCONF)
309
310
311#
312# check if we need to #include sys/select.h explicitly
313#
314case $ac_cv_header_unistd_h in
315yes)
316AC_MSG_CHECKING(if unistd.h or sys/types.h defines fd_set)
317AC_TRY_COMPILE([
318#include <sys/types.h> /* Ultrix */
319#include <unistd.h>],
320[fd_set read_set; return (0);],
321	[AC_MSG_RESULT(yes)
322	 ISC_PLATFORM_NEEDSYSSELECTH="#undef ISC_PLATFORM_NEEDSYSSELECTH"
323	 LWRES_PLATFORM_NEEDSYSSELECTH="#undef LWRES_PLATFORM_NEEDSYSSELECTH"],
324	[AC_MSG_RESULT(no)
325	case $ac_cv_header_sys_select_h in
326	yes)
327         ISC_PLATFORM_NEEDSYSSELECTH="#define ISC_PLATFORM_NEEDSYSSELECTH 1"
328	 LWRES_PLATFORM_NEEDSYSSELECTH="#define LWRES_PLATFORM_NEEDSYSSELECTH 1"
329		;;
330	no)
331		AC_MSG_ERROR([need either working unistd.h or sys/select.h])
332		;;
333	esac
334	])
335	;;
336no)
337	case $ac_cv_header_sys_select_h in
338	yes)
339             ISC_PLATFORM_NEEDSYSSELECTH="#define ISC_PLATFORM_NEEDSYSSELECTH 1"
340	     LWRES_PLATFORM_NEEDSYSSELECTH="#define LWRES_PLATFORM_NEEDSYSSELECTH 1"
341		;;
342	no)
343		AC_MSG_ERROR([need either unistd.h or sys/select.h])
344		;;
345	esac
346	;;
347esac
348AC_SUBST(ISC_PLATFORM_NEEDSYSSELECTH)
349AC_SUBST(LWRES_PLATFORM_NEEDSYSSELECTH)
350
351#
352# Find the machine's endian flavor.
353#
354AC_C_BIGENDIAN
355
356#
357# was --with-openssl specified?
358#
359AC_MSG_CHECKING(for OpenSSL library)
360AC_ARG_WITH(openssl,
361[  --with-openssl[=PATH]   Build with OpenSSL [yes|no|path].
362                          (Required for DNSSEC)],
363    use_openssl="$withval", use_openssl="auto")
364
365openssldirs="/usr /usr/local /usr/local/ssl /usr/pkg"
366if test "$use_openssl" = "auto"
367then
368	for d in $openssldirs
369	do
370		if test -f $d/include/openssl/opensslv.h
371		then
372			use_openssl=$d
373			break
374		fi
375	done
376fi
377case "$use_openssl" in
378	no)
379		AC_MSG_RESULT(no)
380		DST_OPENSSL_INC=""
381		USE_OPENSSL=""
382		;;
383	auto)
384		DST_OPENSSL_INC=""
385		USE_OPENSSL=""
386		AC_MSG_RESULT(not found)
387		;;
388	*)
389		if test "$use_openssl" = "yes"
390		then
391		    	# User did not specify a path - guess it
392			for d in $openssldirs
393			do
394				if test -f $d/include/openssl/opensslv.h
395				then
396				 	use_openssl=$d
397					break
398				fi
399			done
400			if test "$use_openssl" = "yes"
401			then
402			    	AC_MSG_RESULT(not found)
403				AC_MSG_ERROR(
404[OpenSSL was not found in any of $openssldirs; use --with-openssl=/path])
405			fi
406		fi
407		USE_OPENSSL='-DOPENSSL'
408		if test "$use_openssl" = "/usr"
409		then
410			DST_OPENSSL_INC=""
411			DNS_OPENSSL_LIBS="-lcrypto"
412		else
413			DST_OPENSSL_INC="-I$use_openssl/include"
414			case $host in
415			*-solaris*)
416				DNS_OPENSSL_LIBS="-L$use_openssl/lib -R$use_openssl/lib -lcrypto"
417				;;
418			*)
419				DNS_OPENSSL_LIBS="-L$use_openssl/lib -lcrypto"
420				;;
421			esac
422		fi
423		AC_MSG_RESULT(using openssl from $use_openssl/lib and $use_openssl/include)
424
425		saved_cflags="$CFLAGS"
426		saved_libs="$LIBS"
427		CFLAGS="$CFLAGS $DST_OPENSSL_INC"
428		LIBS="$LIBS $DNS_OPENSSL_LIBS"
429		AC_MSG_CHECKING(whether linking with OpenSSL works)
430		AC_TRY_RUN([
431#include <openssl/err.h>
432int main() {
433	ERR_clear_error();
434	return (0);
435}
436],
437	        [AC_MSG_RESULT(yes)],
438		[AC_MSG_RESULT(no)
439		 AC_MSG_ERROR(Could not run test program using OpenSSL from
440$use_openssl/lib and $use_openssl/include.
441Please check the argument to --with-openssl and your
442shared library configuration (e.g., LD_LIBRARY_PATH).)],
443		[AC_MSG_RESULT(assuming it does work on target platform)])
444
445		AC_MSG_CHECKING(whether linking with OpenSSL requires -ldl)
446		AC_TRY_LINK([
447#include <openssl/err.h>],
448[ DSO_METHOD_dlfcn(); ],
449		[AC_MSG_RESULT(no)],
450		[LIBS="$LIBS -ldl"
451		AC_TRY_LINK([
452#include <openssl/err.h>
453],[ DSO_METHOD_dlfcn(); ],
454		[AC_MSG_RESULT(yes)
455		DNS_OPENSSL_LIBS="$DNS_OPENSSL_LIBS -ldl"
456		],
457		 [AC_MSG_RESULT(unknown)
458		 AC_MSG_ERROR(OpenSSL has unsupported dynamic loading)],
459		[AC_MSG_RESULT(assuming it does work on target platform)])
460		],
461		[AC_MSG_RESULT(assuming it does work on target platform)]
462		)
463		 
464#
465#	OpenSSLDie is new with CERT CS-2002-23.  If we see it we have may
466#	have a patched library otherwise check that we are greater than
467#	the fixed versions
468#
469		AC_CHECK_FUNC(OpenSSLDie,
470		AC_MSG_CHECKING(OpenSSL library version)
471		AC_TRY_RUN([
472#include <stdio.h>
473#include <openssl/opensslv.h>
474int main() {
475        if (OPENSSL_VERSION_NUMBER >= 0x0090581fL)
476                return (0);
477	printf("\n\nFound   OPENSSL_VERSION_NUMBER %#010x\n",
478		OPENSSL_VERSION_NUMBER);
479	printf("Require OPENSSL_VERSION_NUMBER 0x0090581f or greater\n\n");
480        return (1);
481}
482],
483	        [AC_MSG_RESULT(ok)],
484		[AC_MSG_RESULT(not compatible)
485		 AC_MSG_ERROR(you need OpenSSL 0.9.5a or newer)],
486		[AC_MSG_RESULT(assuming target platform has compatible version)])
487		,
488	        AC_MSG_RESULT(did not find fixes for CERT CA-2002-23)
489		AC_MSG_CHECKING(OpenSSL library version)
490		AC_TRY_RUN([
491#include <stdio.h>
492#include <openssl/opensslv.h>
493int main() {
494        if ((OPENSSL_VERSION_NUMBER >= 0x0090605fL &&
495	     OPENSSL_VERSION_NUMBER < 0x009070000L) ||
496	     OPENSSL_VERSION_NUMBER >= 0x00907003L)
497                return (0);
498	printf("\n\nFound   OPENSSL_VERSION_NUMBER %#010x\n",
499		OPENSSL_VERSION_NUMBER);
500	printf("Require OPENSSL_VERSION_NUMBER 0x0090605f or greater (0.9.6e)\n"
501	       "Require OPENSSL_VERSION_NUMBER 0x00907003 or greater (0.9.7-beta2)\n\n");
502        return (1);
503}
504],
505	        [AC_MSG_RESULT(ok)],
506		[AC_MSG_RESULT(not compatible)
507		 AC_MSG_ERROR(you need OpenSSL 0.9.6e/0.9.7-beta2 (or newer): CERT CA-2002-23)],
508		[AC_MSG_RESULT(assuming target platform has compatible version)]))
509		AC_MSG_CHECKING(for OpenSSL DSA support)
510		if test -f $use_openssl/include/openssl/dsa.h
511		then
512			AC_DEFINE(HAVE_OPENSSL_DSA)
513			AC_MSG_RESULT(yes)
514		else
515			AC_MSG_RESULT(no)
516		fi
517		CFLAGS="$saved_cflags"
518		LIBS="$saved_libs"
519		;;
520esac
521
522#
523# This would include the system openssl path (and linker options to use
524# it as needed) if it is found.
525#
526
527AC_SUBST(USE_OPENSSL)
528AC_SUBST(DST_OPENSSL_INC)
529DNS_CRYPTO_LIBS="$DNS_CRYPTO_LIBS $DNS_OPENSSL_LIBS"
530
531#
532# was --with-gssapi specified?
533#
534#AC_MSG_CHECKING(for GSSAPI library)
535#AC_ARG_WITH(gssapi,
536#[  --with-gssapi=PATH   Specify path for system-supplied GSSAPI],
537#    use_gssapi="$withval", use_gssapi="no")
538#
539#case "$use_gssapi" in
540#	no)
541#		USE_GSSAPI=''
542#		DST_GSSAPI_INC=''
543#		DNS_GSSAPI_LIBS=''
544#		AC_MSG_RESULT(not specified)
545#		;;
546#	yes)
547#		AC_MSG_ERROR([--with-gssapi must specify a path])
548#		;;
549#	*)
550#		USE_GSSAPI='-DGSSAPI'
551#		DST_GSSAPI_INC="-I$use_gssapi/include"
552#		DNS_GSSAPI_LIBS="-L$use_gssapi/lib -lgssapi_krb5"
553#		AC_MSG_RESULT(using gssapi from $use_gssapi/lib and $use_gssapi/include)
554#		;;
555#esac
556
557USE_GSSAPI=''
558DST_GSSAPI_INC=''
559DNS_GSSAPI_LIBS=''
560
561AC_SUBST(USE_GSSAPI)
562AC_SUBST(DST_GSSAPI_INC)
563DNS_CRYPTO_LIBS="$DNS_CRYPTO_LIBS $DNS_GSSAPI_LIBS"
564
565#
566# Applications linking with libdns also need to link with these libraries.
567#
568
569AC_SUBST(DNS_CRYPTO_LIBS)
570
571#
572# was --with-randomdev specified?
573#
574AC_MSG_CHECKING(for random device)
575AC_ARG_WITH(randomdev,
576[  --with-randomdev=PATH Specify path for random device],
577    use_randomdev="$withval", use_randomdev="unspec")
578
579case "$use_randomdev" in
580	unspec)
581		case "$host" in
582			*-openbsd*)
583				devrandom=/dev/arandom
584				;;
585			*)
586				devrandom=/dev/random
587				;;
588		esac
589		AC_MSG_RESULT($devrandom)
590		AC_CHECK_FILE($devrandom,
591			      AC_DEFINE_UNQUOTED(PATH_RANDOMDEV,
592						 "$devrandom"),)
593		;;
594	yes)
595		AC_MSG_ERROR([--with-randomdev must specify a path])
596		;;
597	no)
598		AC_MSG_RESULT(disabled)
599		;;
600	*)
601		AC_DEFINE_UNQUOTED(PATH_RANDOMDEV, "$use_randomdev")
602		AC_MSG_RESULT(using "$use_randomdev")
603		;;
604esac
605
606#
607# Do we have arc4random() ?
608#
609AC_CHECK_FUNC(arc4random, AC_DEFINE(HAVE_ARC4RANDOM))
610
611#
612# Begin pthreads checking.
613#
614# First, decide whether to use multithreading or not.
615#
616# Enable multithreading by default on systems where it is known
617# to work well, and where debugging of multithreaded programs
618# is supported.
619#
620
621AC_MSG_CHECKING(whether to build with thread support)
622
623case $host in
624*-dec-osf*)
625	use_threads=true ;;
626[*-solaris2.[0-6]])
627	# Thread signals are broken on Solaris 2.6; they are sometimes
628	# delivered to the wrong thread.
629	use_threads=false ;;
630*-solaris*)
631	use_threads=true ;;
632*-ibm-aix*)
633	use_threads=true ;;
634*-hp-hpux10*)
635	use_threads=false ;;
636*-hp-hpux11*)
637	use_threads=true ;;
638*-sgi-irix*)
639	use_threads=true ;;
640*-sco-sysv*uw*|*-*-sysv*UnixWare*)
641        # UnixWare
642	use_threads=false ;;
643*-*-sysv*OpenUNIX*)
644        # UnixWare
645	use_threads=true ;;
646*-netbsd*)
647	if test -r /usr/lib/libpthread.so ; then
648	    use_threads=true
649	else
650	    # Socket I/O optimizations introduced in 9.2 expose a
651	    # bug in unproven-pthreads; see PR #12650
652	    use_threads=false
653	fi
654	;;
655*-openbsd*)
656	# OpenBSD users have reported that named dumps core on
657	# startup when built with threads.
658	use_threads=false ;;
659*-freebsd*)
660	use_threads=false ;;
661*-bsdi[234]*)
662	# Thread signals do not work reliably on some versions of BSD/OS.
663	use_threads=false ;;
664*-bsdi5*)
665	use_threads=true ;;
666*-linux*)
667   	# Threads are disabled on Linux by default because most
668	# Linux kernels produce unusable core dumps from multithreaded
669	# programs, and because of limitations in setuid().
670	use_threads=false ;;	
671*)
672	use_threads=false ;;
673esac
674
675AC_ARG_ENABLE(threads,
676	[  --enable-threads	enable multithreading])
677case "$enable_threads" in
678	yes)
679		use_threads=true
680		;;
681	no)
682		use_threads=false
683		;;
684	'')
685		# Use system-dependent default
686		;;
687	*)
688	    	AC_MSG_ERROR([--enable-threads takes yes or no])
689		;;
690esac
691
692if $use_threads
693then
694	AC_MSG_RESULT(yes)
695else
696	AC_MSG_RESULT(no)	
697fi
698
699if $use_threads
700then
701	#
702	# Search for / configure pthreads in a system-dependent fashion.
703	#
704	case "$host" in
705	  *-netbsd*)
706		# NetBSD has multiple pthreads implementations.	 The
707		# recommended one to use is "unproven-pthreads".  The
708		# older "mit-pthreads" may also work on some NetBSD
709		# versions.  The PTL2 thread library does not
710		# currently work with bind9, but can be chosen with
711		# the --with-ptl2 option for those who wish to
712		# experiment with it.
713		CC="gcc"
714		AC_MSG_CHECKING(which NetBSD thread library to use)
715
716		AC_ARG_WITH(ptl2,
717[  --with-ptl2		on NetBSD, use the ptl2 thread library (experimental)],
718		    use_ptl2="$withval", use_ptl2="no")
719
720		: ${LOCALBASE:=/usr/pkg}
721
722		if test "X$use_ptl2" = "Xyes"
723		then
724			AC_MSG_RESULT(PTL2)
725			AC_MSG_WARN(
726[linking with PTL2 is highly experimental and not expected to work])
727			CC=ptlgcc
728		else
729			if test -r /usr/lib/libpthread.so
730			then
731				AC_MSG_RESULT(native)
732				LIBS="-lpthread $LIBS"
733			else
734				if test ! -d $LOCALBASE/pthreads
735				then
736					AC_MSG_RESULT(none)
737					AC_MSG_ERROR("could not find thread libraries")
738				fi
739
740				if $use_threads
741				then
742					AC_MSG_RESULT(mit-pthreads/unproven-pthreads)
743					pkg="$LOCALBASE/pthreads"
744					lib1="-L$pkg/lib -Wl,-R$pkg/lib"
745					lib2="-lpthread -lm -lgcc -lpthread"
746					LIBS="$lib1 $lib2 $LIBS"
747					CPPFLAGS="$CPPFLAGS -I$pkg/include"
748					STD_CINCLUDES="$STD_CINCLUDES -I$pkg/include"
749				fi
750			fi
751		fi
752		;;
753		*)
754			AC_CHECK_LIB(pthread, pthread_create,,
755				AC_CHECK_LIB(pthread, __pthread_create,,
756				AC_CHECK_LIB(pthread, __pthread_create_system,,
757				AC_CHECK_LIB(c_r, pthread_create,,
758				AC_CHECK_LIB(c, pthread_create,,
759				AC_MSG_ERROR("could not find thread libraries"))))))
760		;;
761	esac
762fi
763
764if $use_threads
765then
766	#
767	# We'd like to use sigwait() too
768	#
769	AC_CHECK_LIB(c, sigwait,
770		     AC_DEFINE(HAVE_SIGWAIT),
771		     AC_CHECK_LIB(pthread, sigwait,
772				  AC_DEFINE(HAVE_SIGWAIT),
773				  AC_CHECK_LIB(pthread, _Psigwait,
774					       AC_DEFINE(HAVE_SIGWAIT),))
775	)
776
777	AC_CHECK_FUNC(pthread_attr_getstacksize,
778		      AC_DEFINE(HAVE_PTHREAD_ATTR_GETSTACKSIZE),)
779
780	AC_CHECK_FUNC(pthread_attr_setstacksize,
781		      AC_DEFINE(HAVE_PTHREAD_ATTR_SETSTACKSIZE),)
782
783	#
784	# Additional OS-specific issues related to pthreads and sigwait.
785	#
786	case "$host" in
787		#
788		# One more place to look for sigwait.
789		#
790		*-freebsd*)
791			AC_CHECK_LIB(c_r, sigwait, AC_DEFINE(HAVE_SIGWAIT),)
792			case $host in
793			*-freebsd5.3|*-freebsd5.3.*)
794				AC_DEFINE(NEED_PTHREAD_SCOPE_SYSTEM)
795				;;
796			esac
797			;;
798		#
799		# BSDI 3.0 through 4.0.1 needs pthread_init() to be
800		# called before certain pthreads calls.	 This is deprecated
801		# in BSD/OS 4.1.
802		#
803		*-bsdi3.*|*-bsdi4.0*)
804			AC_DEFINE(NEED_PTHREAD_INIT)
805			;;
806		#
807		# LinuxThreads requires some changes to the way we
808		# deal with signals.
809		#
810		*-linux*)
811			AC_DEFINE(HAVE_LINUXTHREADS)
812			;;
813		#
814		# Ensure the right sigwait() semantics on Solaris and make
815		# sure we call pthread_setconcurrency.
816		#
817		*-solaris*)
818			AC_DEFINE(_POSIX_PTHREAD_SEMANTICS)
819			AC_CHECK_FUNC(pthread_setconcurrency,
820				      AC_DEFINE(CALL_PTHREAD_SETCONCURRENCY))
821			;;
822		#
823		# UnixWare does things its own way.
824		#
825		*-sco-sysv*uw*|*-*-sysv*UnixWare*|*-*-sysv*OpenUNIX*)
826			AC_DEFINE(HAVE_UNIXWARE_SIGWAIT)
827			;;
828	esac
829
830	#
831	# Look for sysconf to allow detection of the number of processors.
832	#
833	AC_CHECK_FUNC(sysconf, AC_DEFINE(HAVE_SYSCONF),)
834
835	if test "X$GCC" = "Xyes"; then
836		case "$host" in
837		*-freebsd*)
838			CC="$CC -pthread"
839			CCOPT="$CCOPT -pthread"
840			STD_CDEFINES="$STD_CDEFINES -D_THREAD_SAFE"
841			;;
842		*-openbsd*)
843			CC="$CC -pthread"
844			CCOPT="$CCOPT -pthread"
845			;;
846		*-solaris*)
847			LIBS="$LIBS -lthread"
848			;;
849		*-ibm-aix*)
850			STD_CDEFINES="$STD_CDEFINES -D_THREAD_SAFE"
851			;;
852		esac
853	else
854		case $host in
855		*-dec-osf*)
856			CC="$CC -pthread"
857			CCOPT="$CCOPT -pthread"
858			;;
859		*-solaris*)
860			CC="$CC -mt"
861			CCOPT="$CCOPT -mt"
862			;;
863		*-ibm-aix*)
864			STD_CDEFINES="$STD_CDEFINES -D_THREAD_SAFE"
865			;;
866		*-sco-sysv*uw*|*-*-sysv*UnixWare*)
867			CC="$CC -Kthread"
868			CCOPT="$CCOPT -Kthread"
869			;;
870		*-*-sysv*OpenUNIX*)
871			CC="$CC -Kpthread"
872			CCOPT="$CCOPT -Kpthread"
873			;;
874		esac
875	fi
876	ALWAYS_DEFINES="-D_REENTRANT"
877	ISC_PLATFORM_USETHREADS="#define ISC_PLATFORM_USETHREADS 1"
878	thread_dir=pthreads
879else
880	ISC_PLATFORM_USETHREADS="#undef ISC_PLATFORM_USETHREADS"
881	thread_dir=nothreads
882	ALWAYS_DEFINES=""
883fi
884
885AC_SUBST(ALWAYS_DEFINES)
886AC_SUBST(ISC_PLATFORM_USETHREADS)
887
888ISC_THREAD_DIR=$thread_dir
889AC_SUBST(ISC_THREAD_DIR)
890
891#
892# In solaris 10, SMF can manage named service
893#
894AC_CHECK_LIB(scf, smf_enable_instance)
895
896#
897# flockfile is usually provided by pthreads, but we may want to use it
898# even if compiled with --disable-threads.  getc_unlocked might also not
899# be defined.
900#
901AC_CHECK_FUNC(flockfile, AC_DEFINE(HAVE_FLOCKFILE),)
902AC_CHECK_FUNC(getc_unlocked, AC_DEFINE(HAVE_GETCUNLOCKED),)
903
904# 
905# Indicate what the final decision was regarding threads.
906#
907AC_MSG_CHECKING(whether to build with threads)
908if $use_threads; then
909	AC_MSG_RESULT(yes)
910else
911	AC_MSG_RESULT(no)
912fi
913
914# 
915# End of pthreads stuff.
916#
917
918#
919# Large File
920#
921AC_ARG_ENABLE(largefile, [  --enable-largefile	  64-bit file support],
922	      want_largefile="yes", want_largefile="no")
923case $want_largefile in
924	yes)
925		ALWAYS_DEFINES="$ALWAYS_DEFINES -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
926		;;
927	*)
928		;;
929esac
930
931#
932# Additional compiler settings.
933#
934MKDEPCC="$CC"
935MKDEPCFLAGS="-M"
936IRIX_DNSSEC_WARNINGS_HACK=""
937
938if test "X$GCC" = "Xyes"; then
939	STD_CWARNINGS="$STD_CWARNINGS -W -Wall -Wmissing-prototypes -Wcast-qual -Wwrite-strings -Wformat"
940	case "$host" in
941	*-hp-hpux*)
942		LDFLAGS="-Wl,+vnocompatwarnings $LDFALGS"
943		;;
944	esac
945else
946	case $host in
947	*-dec-osf*)
948		CC="$CC -std"
949		CCOPT="$CCOPT -std"
950		MKDEPCC="$CC"
951		;;
952	*-hp-hpux*)
953		CC="$CC -Ae -z"
954		# The version of the C compiler that constantly warns about
955                # 'const' as well as alignment issues is unfortunately not
956                # able to be discerned via the version of the operating
957                # system, nor does cc have a version flag.
958		case "`$CC +W 123 2>&1`" in
959		*Unknown?option*)
960			STD_CWARNINGS="+w1"
961			;;
962		*)
963			# Turn off the pointlessly noisy warnings.
964			STD_CWARNINGS="+w1 +W 474,530"
965			;;
966		esac
967		CCOPT="$CCOPT -Ae -z"
968		LDFLAGS="-Wl,+vnocompatwarnings $LDFALGS"
969		MKDEPPROG='cc -Ae -E -Wp,-M >/dev/null 2>>$TMP'
970		;;
971	*-sgi-irix*)
972		STD_CWARNINGS="-fullwarn -woff 1209"
973		#
974		# Silence more than 250 instances of
975		#   "prototyped function redeclared without prototype"
976		# and 11 instances of
977		#   "variable ... was set but never used"
978		# from lib/dns/sec/openssl.
979		#
980		IRIX_DNSSEC_WARNINGS_HACK="-woff 1692,1552"
981		;;
982	*-solaris*)
983		MKDEPCFLAGS="-xM"
984		;;
985	*-sco-sysv*uw*|*-*-sysv*UnixWare*|*-*-sysv*OpenUNIX*)
986                # UnixWare
987		CC="$CC -w"
988		;;
989	esac
990fi
991
992AC_SUBST(MKDEPCC)
993AC_SUBST(MKDEPCFLAGS)
994AC_SUBST(MKDEPPROG)
995AC_SUBST(IRIX_DNSSEC_WARNINGS_HACK)
996
997#
998# NLS
999#
1000AC_CHECK_FUNC(catgets, AC_DEFINE(HAVE_CATGETS),)
1001
1002#
1003# -lxnet buys us one big porting headache...  standards, gotta love 'em.
1004#
1005# AC_CHECK_LIB(xnet, socket, ,
1006#    AC_CHECK_LIB(socket, socket)
1007#    AC_CHECK_LIB(nsl, inet_ntoa)
1008# )
1009#
1010# Use this for now, instead:
1011#
1012case "$host" in
1013	mips-sgi-irix*)
1014		;;
1015	*)
1016		AC_CHECK_LIB(socket, socket)
1017		AC_CHECK_LIB(nsl, inet_ntoa)
1018		;;
1019esac
1020
1021#
1022# Purify support
1023#
1024AC_MSG_CHECKING(whether to use purify)
1025AC_ARG_WITH(purify,
1026	[  --with-purify[=PATH]	use Rational purify],
1027	use_purify="$withval", use_purify="no")
1028
1029case "$use_purify" in
1030	no)
1031		;;
1032	yes)
1033		AC_PATH_PROG(purify_path, purify, purify)
1034		;;
1035	*)
1036		purify_path="$use_purify"
1037		;;
1038esac
1039
1040case "$use_purify" in
1041	no)
1042		AC_MSG_RESULT(no)
1043		PURIFY=""
1044		;;
1045	*)
1046		if test -f $purify_path || test $purify_path = purify; then
1047			AC_MSG_RESULT($purify_path)
1048			PURIFYFLAGS="`echo $PURIFYOPTIONS`"
1049			PURIFY="$purify_path $PURIFYFLAGS"
1050		else
1051			AC_MSG_ERROR([$purify_path not found.
1052
1053Please choose the proper path with the following command:
1054
1055    configure --with-purify=PATH
1056])
1057		fi
1058		;;
1059esac
1060
1061AC_SUBST(PURIFY)
1062
1063#
1064# GNU libtool support
1065#
1066AC_ARG_WITH(libtool,
1067	    [  --with-libtool	use GNU libtool (following indented options supported)],
1068	    use_libtool="$withval", use_libtool="no")
1069
1070case $use_libtool in
1071	yes)
1072		AM_PROG_LIBTOOL
1073		O=lo
1074		A=la
1075		LIBTOOL_MKDEP_SED='s;\.o;\.lo;'
1076		LIBTOOL_MODE_COMPILE='--mode=compile'
1077		LIBTOOL_MODE_INSTALL='--mode=install'
1078		LIBTOOL_MODE_LINK='--mode=link'
1079		case "$host" in
1080		*) LIBTOOL_ALLOW_UNDEFINED= ;;
1081		esac
1082		case "$host" in
1083		*-ibm-aix*) LIBTOOL_IN_MAIN="-Wl,-bI:T_testlist.imp" ;;
1084		*) LIBTOOL_IN_MAIN= ;;
1085		esac;
1086		;;
1087	*)
1088		O=o
1089		A=a
1090		LIBTOOL=
1091		AC_SUBST(LIBTOOL)
1092		LIBTOOL_MKDEP_SED=
1093		LIBTOOL_MODE_COMPILE=
1094		LIBTOOL_MODE_INSTALL=
1095		LIBTOOL_MODE_LINK=
1096		LIBTOOL_ALLOW_UNDEFINED=
1097		LIBTOOL_IN_MAIN=
1098		;;
1099esac
1100
1101#
1102# File name extension for static archive files, for those few places
1103# where they are treated differently from dynamic ones.
1104#
1105SA=a
1106
1107AC_SUBST(O)
1108AC_SUBST(A)
1109AC_SUBST(SA)
1110AC_SUBST(LIBTOOL_MKDEP_SED)
1111AC_SUBST(LIBTOOL_MODE_COMPILE)
1112AC_SUBST(LIBTOOL_MODE_INSTALL)
1113AC_SUBST(LIBTOOL_MODE_LINK)
1114AC_SUBST(LIBTOOL_ALLOW_UNDEFINED)
1115AC_SUBST(LIBTOOL_IN_MAIN)
1116
1117#
1118# build libbind?
1119#
1120AC_ARG_ENABLE(libbind,
1121	[  --enable-libbind		build libbind [default=no]])
1122
1123case "$enable_libbind" in
1124	yes)
1125		LIBBIND=lib/bind
1126		AC_SUBST(LIBBIND)
1127		;;
1128	no|'')
1129		;;
1130esac
1131
1132#
1133# Here begins a very long section to determine the system's networking
1134# capabilities.  The order of the tests is signficant.
1135#
1136
1137#
1138# IPv6
1139#
1140AC_ARG_ENABLE(ipv6,
1141	[  --enable-ipv6		use IPv6 [default=autodetect]])
1142
1143case "$enable_ipv6" in
1144	yes|''|autodetect)
1145		AC_DEFINE(WANT_IPV6)
1146		;;
1147	no)
1148		;;
1149esac
1150
1151#
1152# We do the IPv6 compilation checking after libtool so that we can put
1153# the right suffix on the files.
1154#
1155AC_MSG_CHECKING(for IPv6 structures)
1156AC_TRY_COMPILE([
1157#include <sys/types.h>
1158#include <sys/socket.h>
1159#include <netinet/in.h>],
1160[struct sockaddr_in6 sin6; return (0);],
1161	[AC_MSG_RESULT(yes)
1162	 found_ipv6=yes],
1163	[AC_MSG_RESULT(no)
1164	 found_ipv6=no])
1165
1166#
1167# See whether IPv6 support is provided via a Kame add-on.
1168# This is done before other IPv6 linking tests to LIBS is properly set.
1169#
1170AC_MSG_CHECKING(for Kame IPv6 support)
1171AC_ARG_WITH(kame,
1172	[  --with-kame[=PATH]	use Kame IPv6 [default path /usr/local/v6]],
1173	use_kame="$withval", use_kame="no")
1174
1175case "$use_kame" in
1176	no)
1177		;;
1178	yes)
1179		kame_path=/usr/local/v6
1180		;;
1181	*)
1182		kame_path="$use_kame"
1183		;;
1184esac
1185
1186case "$use_kame" in
1187	no)
1188		AC_MSG_RESULT(no)
1189		;;
1190	*)
1191		if test -f $kame_path/lib/libinet6.a; then
1192			AC_MSG_RESULT($kame_path/lib/libinet6.a)
1193			LIBS="-L$kame_path/lib -linet6 $LIBS"
1194		else
1195			AC_MSG_ERROR([$kame_path/lib/libinet6.a not found.
1196
1197Please choose the proper path with the following command:
1198
1199    configure --with-kame=PATH
1200])
1201		fi
1202		;;
1203esac
1204
1205#
1206# Whether netinet6/in6.h is needed has to be defined in isc/platform.h.
1207# Including it on Kame-using platforms is very bad, though, because
1208# Kame uses #error against direct inclusion.   So include it on only
1209# the platform that is otherwise broken without it -- BSD/OS 4.0 through 4.1.
1210# This is done before the in6_pktinfo check because that's what
1211# netinet6/in6.h is needed for.
1212#
1213changequote({, })
1214case "$host" in
1215*-bsdi4.[01]*)
1216	ISC_PLATFORM_NEEDNETINET6IN6H="#define ISC_PLATFORM_NEEDNETINET6IN6H 1"
1217	LWRES_PLATFORM_NEEDNETINET6IN6H="#define LWRES_PLATFORM_NEEDNETINET6IN6H 1"
1218	isc_netinet6in6_hack="#include <netinet6/in6.h>"
1219	;;
1220*)
1221	ISC_PLATFORM_NEEDNETINET6IN6H="#undef ISC_PLATFORM_NEEDNETINET6IN6H"
1222	LWRES_PLATFORM_NEEDNETINET6IN6H="#undef LWRES_PLATFORM_NEEDNETINET6IN6H"
1223	isc_netinet6in6_hack=""
1224	;;
1225esac
1226changequote([, ])
1227
1228#
1229# This is similar to the netinet6/in6.h issue.
1230#
1231case "$host" in
1232*-sco-sysv*uw*|*-*-sysv*UnixWare*|*-*-sysv*OpenUNIX*)
1233        # UnixWare
1234	ISC_PLATFORM_NEEDNETINETIN6H="#define ISC_PLATFORM_NEEDNETINETIN6H 1"
1235	LWRES_PLATFORM_NEEDNETINETIN6H="#define LWRES_PLATFORM_NEEDNETINETIN6H 1"
1236        ISC_PLATFORM_FIXIN6ISADDR="#define ISC_PLATFORM_FIXIN6ISADDR 1"
1237	isc_netinetin6_hack="#include <netinet/in6.h>"
1238	;;
1239*)
1240	ISC_PLATFORM_NEEDNETINETIN6H="#undef ISC_PLATFORM_NEEDNETINETIN6H"
1241	LWRES_PLATFORM_NEEDNETINETIN6H="#undef LWRES_PLATFORM_NEEDNETINETIN6H"
1242        ISC_PLATFORM_FIXIN6ISADDR="#undef ISC_PLATFORM_FIXIN6ISADDR"
1243	isc_netinetin6_hack=""
1244	;;
1245esac
1246
1247#
1248# Now delve deeper into the suitability of the IPv6 support.
1249#
1250case "$found_ipv6" in
1251	yes)
1252		ISC_PLATFORM_HAVEIPV6="#define ISC_PLATFORM_HAVEIPV6 1"
1253		LWRES_PLATFORM_HAVEIPV6="#define LWRES_PLATFORM_HAVEIPV6 1"
1254
1255		AC_MSG_CHECKING(for in6_addr)
1256		AC_TRY_COMPILE([
1257#include <sys/types.h>
1258#include <sys/socket.h>
1259#include <netinet/in.h>
1260$isc_netinetin6_hack
1261$isc_netinet6in6_hack
1262],
1263[struct in6_addr in6; return (0);],
1264		[AC_MSG_RESULT(yes)
1265		 ISC_PLATFORM_HAVEINADDR6="#undef ISC_PLATFORM_HAVEINADDR6"
1266		 LWRES_PLATFORM_HAVEINADDR6="#undef LWRES_PLATFORM_HAVEINADDR6"
1267		 isc_in_addr6_hack=""],
1268		[AC_MSG_RESULT(no)
1269		 ISC_PLATFORM_HAVEINADDR6="#define ISC_PLATFORM_HAVEINADDR6 1"
1270		 LWRES_PLATFORM_HAVEINADDR6="#define LWRES_PLATFORM_HAVEINADDR6 1"
1271		 isc_in_addr6_hack="#define in6_addr in_addr6"])
1272
1273		AC_MSG_CHECKING(for in6addr_any)
1274		AC_TRY_LINK([
1275#include <sys/types.h>
1276#include <sys/socket.h>
1277#include <netinet/in.h>
1278$isc_netinetin6_hack
1279$isc_netinet6in6_hack
1280$isc_in_addr6_hack
1281],
1282		[struct in6_addr in6; in6 = in6addr_any; return (in6.s6_addr[0]);],
1283			[AC_MSG_RESULT(yes)
1284			 ISC_PLATFORM_NEEDIN6ADDRANY="#undef ISC_PLATFORM_NEEDIN6ADDRANY"
1285			 LWRES_PLATFORM_NEEDIN6ADDRANY="#undef LWRES_PLATFORM_NEEDIN6ADDRANY"],
1286			[AC_MSG_RESULT(no)
1287			 ISC_PLATFORM_NEEDIN6ADDRANY="#define ISC_PLATFORM_NEEDIN6ADDRANY 1"
1288			 LWRES_PLATFORM_NEEDIN6ADDRANY="#define LWRES_PLATFORM_NEEDIN6ADDRANY 1"])
1289
1290		AC_MSG_CHECKING(for in6addr_loopback)
1291		AC_TRY_LINK([
1292#include <sys/types.h>
1293#include <sys/socket.h>
1294#include <netinet/in.h>
1295$isc_netinetin6_hack
1296$isc_netinet6in6_hack
1297$isc_in_addr6_hack
1298],
1299		[struct in6_addr in6; in6 = in6addr_loopback; return (in6.s6_addr[0]);],
1300			[AC_MSG_RESULT(yes)
1301			 ISC_PLATFORM_NEEDIN6ADDRLOOPBACK="#undef ISC_PLATFORM_NEEDIN6ADDRLOOPBACK"
1302			 LWRES_PLATFORM_NEEDIN6ADDRLOOPBACK="#undef LWRES_PLATFORM_NEEDIN6ADDRLOOPBACK"],
1303			[AC_MSG_RESULT(no)
1304			 ISC_PLATFORM_NEEDIN6ADDRLOOPBACK="#define ISC_PLATFORM_NEEDIN6ADDRLOOPBACK 1"
1305			 LWRES_PLATFORM_NEEDIN6ADDRLOOPBACK="#define LWRES_PLATFORM_NEEDIN6ADDRLOOPBACK 1"])
1306
1307		AC_MSG_CHECKING(for sin6_scope_id in struct sockaddr_in6)
1308		AC_TRY_COMPILE([
1309#include <sys/types.h>
1310#include <sys/socket.h>
1311#include <netinet/in.h>
1312$isc_netinetin6_hack
1313$isc_netinet6in6_hack
1314],
1315		[struct sockaddr_in6 xyzzy; xyzzy.sin6_scope_id = 0; return (0);],
1316			[AC_MSG_RESULT(yes)
1317			 ISC_PLATFORM_HAVESCOPEID="#define ISC_PLATFORM_HAVESCOPEID 1"
1318			 result="#define LWRES_HAVE_SIN6_SCOPE_ID 1"],
1319			[AC_MSG_RESULT(no)
1320			 ISC_PLATFORM_HAVESCOPEID="#undef ISC_PLATFORM_HAVESCOPEID"
1321			 result="#undef LWRES_HAVE_SIN6_SCOPE_ID"])
1322		LWRES_HAVE_SIN6_SCOPE_ID="$result"
1323
1324		AC_MSG_CHECKING(for in6_pktinfo)
1325		AC_TRY_COMPILE([
1326#include <sys/types.h>
1327#include <sys/socket.h>
1328#include <netinet/in.h>
1329$isc_netinetin6_hack
1330$isc_netinet6in6_hack
1331],
1332		[struct in6_pktinfo xyzzy; return (0);],
1333			[AC_MSG_RESULT(yes)
1334			 ISC_PLATFORM_HAVEIN6PKTINFO="#define ISC_PLATFORM_HAVEIN6PKTINFO 1"],
1335			[AC_MSG_RESULT(no -- disabling runtime ipv6 support)
1336			 ISC_PLATFORM_HAVEIN6PKTINFO="#undef ISC_PLATFORM_HAVEIN6PKTINFO"])
1337		;;
1338	no)
1339		ISC_PLATFORM_HAVEIPV6="#undef ISC_PLATFORM_HAVEIPV6"
1340		LWRES_PLATFORM_HAVEIPV6="#undef LWRES_PLATFORM_HAVEIPV6"
1341		ISC_PLATFORM_NEEDIN6ADDRANY="#undef ISC_PLATFORM_NEEDIN6ADDRANY"
1342		LWRES_PLATFORM_NEEDIN6ADDRANY="#undef LWRES_PLATFORM_NEEDIN6ADDRANY"
1343		ISC_PLATFORM_HAVEIN6PKTINFO="#undef ISC_PLATFORM_HAVEIN6PKTINFO"
1344		LWRES_HAVE_SIN6_SCOPE_ID="#define LWRES_HAVE_SIN6_SCOPE_ID 1"
1345		ISC_PLATFORM_HAVESCOPEID="#define ISC_PLATFORM_HAVESCOPEID 1"
1346		ISC_IPV6_H="ipv6.h"
1347		ISC_IPV6_O="ipv6.$O"
1348		ISC_ISCIPV6_O="unix/ipv6.$O"
1349		ISC_IPV6_C="ipv6.c"
1350		;;
1351esac
1352
1353AC_SUBST(ISC_PLATFORM_HAVEIPV6)
1354AC_SUBST(LWRES_PLATFORM_HAVEIPV6)
1355AC_SUBST(ISC_PLATFORM_NEEDNETINETIN6H)
1356AC_SUBST(LWRES_PLATFORM_NEEDNETINETIN6H)
1357AC_SUBST(ISC_PLATFORM_NEEDNETINET6IN6H)
1358AC_SUBST(LWRES_PLATFORM_NEEDNETINET6IN6H)
1359AC_SUBST(ISC_PLATFORM_HAVEINADDR6)
1360AC_SUBST(LWRES_PLATFORM_HAVEINADDR6)
1361AC_SUBST(ISC_PLATFORM_NEEDIN6ADDRANY)
1362AC_SUBST(LWRES_PLATFORM_NEEDIN6ADDRANY)
1363AC_SUBST(ISC_PLATFORM_NEEDIN6ADDRLOOPBACK)
1364AC_SUBST(LWRES_PLATFORM_NEEDIN6ADDRLOOPBACK)
1365AC_SUBST(ISC_PLATFORM_HAVEIN6PKTINFO)
1366AC_SUBST(ISC_PLATFORM_FIXIN6ISADDR)
1367AC_SUBST(ISC_IPV6_H)
1368AC_SUBST(ISC_IPV6_O)
1369AC_SUBST(ISC_ISCIPV6_O)
1370AC_SUBST(ISC_IPV6_C)
1371AC_SUBST(LWRES_HAVE_SIN6_SCOPE_ID)
1372AC_SUBST(ISC_PLATFORM_HAVESCOPEID)
1373
1374AC_MSG_CHECKING([for struct if_laddrreq])
1375AC_TRY_LINK([
1376#include <sys/types.h>
1377#include <net/if6.h>
1378],[ struct if_laddrreq a; ],
1379	[AC_MSG_RESULT(yes)
1380	ISC_PLATFORM_HAVEIF_LADDRREQ="#define ISC_PLATFORM_HAVEIF_LADDRREQ 1"],
1381	[AC_MSG_RESULT(no)
1382	ISC_PLATFORM_HAVEIF_LADDRREQ="#undef ISC_PLATFORM_HAVEIF_LADDRREQ"])
1383AC_SUBST(ISC_PLATFORM_HAVEIF_LADDRREQ)
1384
1385AC_MSG_CHECKING([for struct if_laddrconf])
1386AC_TRY_LINK([
1387#include <sys/types.h>
1388#include <net/if6.h>
1389],[ struct if_laddrconf a; ],
1390	[AC_MSG_RESULT(yes)
1391	ISC_PLATFORM_HAVEIF_LADDRCONF="#define ISC_PLATFORM_HAVEIF_LADDRCONF 1"],
1392	[AC_MSG_RESULT(no)
1393	ISC_PLATFORM_HAVEIF_LADDRCONF="#undef ISC_PLATFORM_HAVEIF_LADDRCONF"])
1394AC_SUBST(ISC_PLATFORM_HAVEIF_LADDRCONF)
1395
1396#
1397# Check for network functions that are often missing.  We do this
1398# after the libtool checking, so we can put the right suffix on
1399# the files.  It also needs to come after checking for a Kame add-on,
1400# which provides some (all?) of the desired functions.
1401#
1402
1403AC_MSG_CHECKING([for inet_ntop with IPv6 support])
1404AC_TRY_RUN([
1405#include <sys/types.h>
1406#include <sys/socket.h>
1407#include <netinet/in.h>
1408#include <arpa/inet.h>
1409main() {
1410char a[16],b[64]; return(inet_ntop(AF_INET6, a, b, sizeof(b)) == (char*)0);}],
1411        [AC_MSG_RESULT(yes)
1412        ISC_PLATFORM_NEEDNTOP="#undef ISC_PLATFORM_NEEDNTOP"],
1413
1414        [AC_MSG_RESULT(no)
1415        ISC_EXTRA_OBJS="$ISC_EXTRA_OBJS inet_ntop.$O"
1416        ISC_EXTRA_SRCS="$ISC_EXTRA_SRCS inet_ntop.c"
1417        ISC_PLATFORM_NEEDNTOP="#define ISC_PLATFORM_NEEDNTOP 1"])
1418
1419
1420# On NetBSD 1.4.2 and maybe others, inet_pton() incorrectly accepts
1421# addresses with less than four octets, like "1.2.3".  Also leading
1422# zeros should also be rejected.
1423
1424AC_MSG_CHECKING([for working inet_pton with IPv6 support])
1425AC_TRY_RUN([
1426#include <sys/types.h>
1427#include <sys/socket.h>
1428#include <netinet/in.h>
1429#include <arpa/inet.h>
1430main() { char a[16]; return (inet_pton(AF_INET, "1.2.3", a) == 1 ? 1 :
1431			     inet_pton(AF_INET, "1.2.3.04", a) == 1 ? 1 : 
1432			     (inet_pton(AF_INET6, "::1.2.3.4", a) != 1)); }],
1433        [AC_MSG_RESULT(yes)
1434        ISC_PLATFORM_NEEDPTON="#undef ISC_PLATFORM_NEEDPTON"],
1435        [AC_MSG_RESULT(no)
1436        ISC_EXTRA_OBJS="$ISC_EXTRA_OBJS inet_pton.$O"
1437        ISC_EXTRA_SRCS="$ISC_EXTRA_SRCS inet_pton.c"
1438        ISC_PLATFORM_NEEDPTON="#define ISC_PLATFORM_NEEDPTON 1"],
1439	[AC_MSG_RESULT(assuming target platform has working inet_pton)
1440	ISC_PLATFORM_NEEDPTON="#undef ISC_PLATFORM_NEEDPTON"])
1441
1442AC_MSG_CHECKING([for inet_aton])
1443AC_TRY_LINK([
1444#include <sys/types.h>
1445#include <netinet/in.h>
1446#include <arpa/inet.h>],
1447        [struct in_addr in; inet_aton(0, &in); return (0);],
1448        [AC_MSG_RESULT(yes)
1449        ISC_PLATFORM_NEEDATON="#undef ISC_PLATFORM_NEEDATON"],
1450
1451        [AC_MSG_RESULT(no)
1452        ISC_EXTRA_OBJS="$ISC_EXTRA_OBJS inet_aton.$O"
1453        ISC_EXTRA_SRCS="$ISC_EXTRA_SRCS inet_aton.c"
1454        ISC_PLATFORM_NEEDATON="#define ISC_PLATFORM_NEEDATON 1"])
1455
1456AC_SUBST(ISC_PLATFORM_NEEDNTOP)
1457AC_SUBST(ISC_PLATFORM_NEEDPTON)
1458AC_SUBST(ISC_PLATFORM_NEEDATON)
1459
1460#
1461# Look for a 4.4BSD-style sa_len member in struct sockaddr.
1462#
1463case "$host" in
1464	*-dec-osf*)
1465		# Turn on 4.4BSD style sa_len support.
1466		AC_DEFINE(_SOCKADDR_LEN)
1467		;;
1468esac
1469
1470AC_MSG_CHECKING(for sa_len in struct sockaddr)
1471AC_TRY_COMPILE([
1472#include <sys/types.h>
1473#include <sys/socket.h>],
1474[struct sockaddr sa; sa.sa_len = 0; return (0);],
1475	[AC_MSG_RESULT(yes)
1476	ISC_PLATFORM_HAVESALEN="#define ISC_PLATFORM_HAVESALEN 1"
1477	LWRES_PLATFORM_HAVESALEN="#define LWRES_PLATFORM_HAVESALEN 1"],
1478	[AC_MSG_RESULT(no)
1479	ISC_PLATFORM_HAVESALEN="#undef ISC_PLATFORM_HAVESALEN"
1480	LWRES_PLATFORM_HAVESALEN="#undef LWRES_PLATFORM_HAVESALEN"])
1481AC_SUBST(ISC_PLATFORM_HAVESALEN)
1482AC_SUBST(LWRES_PLATFORM_HAVESALEN)
1483
1484#
1485# Look for a 4.4BSD or 4.3BSD struct msghdr
1486#
1487AC_MSG_CHECKING(for struct msghdr flavor)
1488AC_TRY_COMPILE([
1489#include <sys/types.h>
1490#include <sys/socket.h>],
1491[struct msghdr msg; msg.msg_flags = 0; return (0);],
1492	[AC_MSG_RESULT(4.4BSD)
1493	ISC_PLATFORM_MSGHDRFLAVOR="#define ISC_NET_BSD44MSGHDR 1"],
1494	[AC_MSG_RESULT(4.3BSD)
1495	ISC_PLATFORM_MSGHDRFLAVOR="#define ISC_NET_BSD43MSGHDR 1"])
1496AC_SUBST(ISC_PLATFORM_MSGHDRFLAVOR)
1497
1498#
1499# Look for in_port_t.
1500#
1501AC_MSG_CHECKING(for type in_port_t)
1502AC_TRY_COMPILE([
1503#include <sys/types.h>
1504#include <netinet/in.h>],
1505[in_port_t port = 25; return (0);],
1506	[AC_MSG_RESULT(yes)
1507	ISC_PLATFORM_NEEDPORTT="#undef ISC_PLATFORM_NEEDPORTT"],
1508        [AC_MSG_RESULT(no)
1509	ISC_PLATFORM_NEEDPORTT="#define ISC_PLATFORM_NEEDPORTT 1"])
1510AC_SUBST(ISC_PLATFORM_NEEDPORTT)
1511
1512#
1513# Check for addrinfo
1514#
1515AC_MSG_CHECKING(for struct addrinfo)
1516AC_TRY_COMPILE([
1517#include <netdb.h>],
1518[struct addrinfo a; return (0);],
1519	[AC_MSG_RESULT(yes)
1520	ISC_LWRES_NEEDADDRINFO="#undef ISC_LWRES_NEEDADDRINFO"
1521	AC_DEFINE(HAVE_ADDRINFO)],
1522	[AC_MSG_RESULT(no)
1523	ISC_LWRES_NEEDADDRINFO="#define ISC_LWRES_NEEDADDRINFO 1"])
1524AC_SUBST(ISC_LWRES_NEEDADDRINFO)
1525
1526#
1527# Check for rrsetinfo
1528#
1529AC_MSG_CHECKING(for struct rrsetinfo)
1530AC_TRY_COMPILE([
1531#include <netdb.h>],
1532[struct rrsetinfo r; return (0);],
1533	[AC_MSG_RESULT(yes)
1534	ISC_LWRES_NEEDRRSETINFO="#undef ISC_LWRES_NEEDRRSETINFO"],
1535	[AC_MSG_RESULT(no)
1536	ISC_LWRES_NEEDRRSETINFO="#define ISC_LWRES_NEEDRRSETINFO 1"])
1537AC_SUBST(ISC_LWRES_NEEDRRSETINFO)
1538
1539AC_MSG_CHECKING(for int sethostent)
1540AC_TRY_COMPILE([
1541#include <netdb.h>],
1542[int i = sethostent(0); return(0);],
1543	[AC_MSG_RESULT(yes)
1544	ISC_LWRES_SETHOSTENTINT="#define ISC_LWRES_SETHOSTENTINT 1"],
1545	[AC_MSG_RESULT(no)
1546	ISC_LWRES_SETHOSTENTINT="#undef ISC_LWRES_SETHOSTENTINT"])
1547AC_SUBST(ISC_LWRES_SETHOSTENTINT)
1548
1549AC_MSG_CHECKING(for int endhostent)
1550AC_TRY_COMPILE([
1551#include <netdb.h>],
1552[int i = endhostent(); return(0);],
1553	[AC_MSG_RESULT(yes)
1554	ISC_LWRES_ENDHOSTENTINT="#define ISC_LWRES_ENDHOSTENTINT 1"],
1555	[AC_MSG_RESULT(no)
1556	ISC_LWRES_ENDHOSTENTINT="#undef ISC_LWRES_ENDHOSTENTINT"])
1557AC_SUBST(ISC_LWRES_ENDHOSTENTINT)
1558
1559AC_MSG_CHECKING(for getnetbyaddr(in_addr_t, ...))
1560AC_TRY_COMPILE([
1561#include <netdb.h>
1562struct netent *getnetbyaddr(in_addr_t, int);],
1563[],
1564	[AC_MSG_RESULT(yes)
1565	ISC_LWRES_GETNETBYADDRINADDR="#define ISC_LWRES_GETNETBYADDRINADDR 1"],
1566	[AC_MSG_RESULT(no)
1567	ISC_LWRES_GETNETBYADDRINADDR="#undef ISC_LWRES_GETNETBYADDRINADDR"])
1568AC_SUBST(ISC_LWRES_GETNETBYADDRINADDR)
1569
1570AC_MSG_CHECKING(for int setnetent)
1571AC_TRY_COMPILE([
1572#include <netdb.h>],
1573[int i = setnetent(0); return(0);],
1574	[AC_MSG_RESULT(yes)
1575	ISC_LWRES_SETNETENTINT="#define ISC_LWRES_SETNETENTINT 1"],
1576	[AC_MSG_RESULT(no)
1577	ISC_LWRES_SETNETENTINT="#undef ISC_LWRES_SETNETENTINT"])
1578AC_SUBST(ISC_LWRES_SETNETENTINT)
1579
1580AC_MSG_CHECKING(for int endnetent)
1581AC_TRY_COMPILE([
1582#include <netdb.h>],
1583[int i = endnetent(); return(0);],
1584	[AC_MSG_RESULT(yes)
1585	ISC_LWRES_ENDNETENTINT="#define ISC_LWRES_ENDNETENTINT 1"],
1586	[AC_MSG_RESULT(no)
1587	ISC_LWRES_ENDNETENTINT="#undef ISC_LWRES_ENDNETENTINT"])
1588AC_SUBST(ISC_LWRES_ENDNETENTINT)
1589
1590AC_MSG_CHECKING(for gethostbyaddr(const void *, size_t, ...))
1591AC_TRY_COMPILE([
1592#include <netdb.h>
1593struct hostent *gethostbyaddr(const void *, size_t, int);],
1594[return(0);],
1595	[AC_MSG_RESULT(yes)
1596	ISC_LWRES_GETHOSTBYADDRVOID="#define ISC_LWRES_GETHOSTBYADDRVOID 1"],
1597	[AC_MSG_RESULT(no)
1598	ISC_LWRES_GETHOSTBYADDRVOID="#undef ISC_LWRES_GETHOSTBYADDRVOID"])
1599AC_SUBST(ISC_LWRES_GETHOSTBYADDRVOID)
1600
1601AC_MSG_CHECKING(for h_errno in netdb.h)
1602AC_TRY_COMPILE([
1603#include <netdb.h>],
1604[h_errno = 1; return(0);],
1605	[AC_MSG_RESULT(yes)
1606	ISC_LWRES_NEEDHERRNO="#undef ISC_LWRES_NEEDHERRNO"],
1607	[AC_MSG_RESULT(no)
1608	ISC_LWRES_NEEDHERRNO="#define ISC_LWRES_NEEDHERRNO 1"])
1609AC_SUBST(ISC_LWRES_NEEDHERRNO)
1610
1611AC_CHECK_FUNC(getipnodebyname,
1612        [ISC_LWRES_GETIPNODEPROTO="#undef ISC_LWRES_GETIPNODEPROTO"],
1613        [ISC_LWRES_GETIPNODEPROTO="#define ISC_LWRES_GETIPNODEPROTO 1"])
1614AC_CHECK_FUNC(getnameinfo,
1615        [ISC_LWRES_GETNAMEINFOPROTO="#undef ISC_LWRES_GETNAMEINFOPROTO"],
1616        [ISC_LWRES_GETNAMEINFOPROTO="#define ISC_LWRES_GETNAMEINFOPROTO 1"])
1617AC_CHECK_FUNC(getaddrinfo,
1618        [ISC_LWRES_GETADDRINFOPROTO="#undef ISC_LWRES_GETADDRINFOPROTO"
1619	AC_DEFINE(HAVE_GETADDRINFO)],
1620        [ISC_LWRES_GETADDRINFOPROTO="#define ISC_LWRES_GETADDRINFOPROTO 1"])
1621AC_CHECK_FUNC(gai_strerror, AC_DEFINE(HAVE_GAISTRERROR))
1622AC_SUBST(ISC_LWRES_GETIPNODEPROTO)
1623AC_SUBST(ISC_LWRES_GETADDRINFOPROTO)
1624AC_SUBST(ISC_LWRES_GETNAMEINFOPROTO)
1625
1626AC_ARG_ENABLE(getifaddrs,
1627[  --enable-getifaddrs    Enable the use of getifaddrs() [[yes|no|glibc]].
1628             glibc: Use getifaddrs() in glibc if you know it supports IPv6.],
1629    want_getifaddrs="$enableval",  want_getifaddrs="yes")
1630
1631case $want_getifaddrs in
1632yes|glibc)
1633#
1634# Do we have getifaddrs() ?
1635#
1636case $host in
1637*-linux*)
1638	# Some recent versions of glibc support getifaddrs() which does not
1639	# provide AF_INET6 addresses while the function provided by the USAGI
1640	# project handles the AF_INET6 case correctly.  We need to avoid
1641	# using the former but prefer the latter unless overridden by
1642	# --enable-getifaddrs=glibc.
1643	if test $want_getifaddrs = glibc
1644	then
1645		AC_CHECK_FUNC(getifaddrs, AC_DEFINE(HAVE_GETIFADDRS))
1646	else
1647		save_LIBS="$LIBS"
1648		LIBS="-L/usr/local/v6/lib $LIBS"
1649		AC_CHECK_LIB(inet6, getifaddrs,
1650			LIBS="$LIBS -linet6"
1651			AC_DEFINE(HAVE_GETIFADDRS),
1652			LIBS=${save_LIBS})
1653	fi
1654	;;
1655*)
1656	AC_CHECK_FUNC(getifaddrs, AC_DEFINE(HAVE_GETIFADDRS))
1657	;;
1658esac
1659;;
1660no)
1661;;
1662esac
1663
1664#
1665# Look for a sysctl call to get the list of network interfaces.
1666#
1667case $ac_cv_header_sys_sysctl_h in
1668yes)
1669AC_MSG_CHECKING(for interface list sysctl)
1670AC_EGREP_CPP(found_rt_iflist, [
1671#include <sys/param.h>
1672#include <sys/sysctl.h>
1673#include <sys/socket.h>
1674#ifdef NET_RT_IFLIST
1675found_rt_iflist
1676#endif
1677],
1678	[AC_MSG_RESULT(yes)
1679	 AC_DEFINE(HAVE_IFLIST_SYSCTL)],
1680	[AC_MSG_RESULT(no)])
1681;;
1682esac
1683
1684#
1685# Check for some other useful functions that are not ever-present.
1686#
1687
1688# We test for strsep() using AC_TRY_LINK instead of AC_CHECK_FUNC
1689# because AIX 4.3.3 with patches for bos.adt.include to version 4.3.3.77
1690# reportedly defines strsep() without declaring it in <string.h> when
1691# -D_LINUX_SOURCE_COMPAT is not defined [RT #2190], and
1692# AC_CHECK_FUNC() incorrectly succeeds because it declares
1693# the function itself.
1694AC_MSG_CHECKING(for correctly declared strsep())
1695AC_TRY_LINK([#include <string.h>], [char *sp; char *foo = strsep(&sp, ".");],
1696	[AC_MSG_RESULT(yes); ISC_PLATFORM_NEEDSTRSEP="#undef ISC_PLATFORM_NEEDSTRSEP"],
1697	[AC_MSG_RESULT(no); ISC_PLATFORM_NEEDSTRSEP="#define ISC_PLATFORM_NEEDSTRSEP 1"])
1698AC_SUBST(ISC_PLATFORM_NEEDSTRSEP)
1699
1700AC_CHECK_FUNC(memmove,
1701	[ISC_PLATFORM_NEEDMEMMOVE="#undef ISC_PLATFORM_NEEDMEMMOVE"],
1702	[ISC_PLATFORM_NEEDMEMMOVE="#define ISC_PLATFORM_NEEDMEMMOVE 1"])
1703AC_SUBST(ISC_PLATFORM_NEEDMEMMOVE)
1704
1705AC_CHECK_FUNC(strtoul,
1706	[ISC_PLATFORM_NEEDSTRTOUL="#undef ISC_PLATFORM_NEEDSTRTOUL"],
1707	[ISC_PLATFORM_NEEDSTRTOUL="#define ISC_PLATFORM_NEEDSTRTOUL 1"])
1708AC_SUBST(ISC_PLATFORM_NEEDSTRTOUL)
1709
1710AC_CHECK_FUNC(strlcpy,
1711	[ISC_PLATFORM_NEEDSTRLCPY="#undef ISC_PLATFORM_NEEDSTRLCPY"],
1712	[ISC_PLATFORM_NEEDSTRLCPY="#define ISC_PLATFORM_NEEDSTRLCPY 1"])
1713AC_SUBST(ISC_PLATFORM_NEEDSTRLCPY)
1714
1715AC_CHECK_FUNC(strlcat,
1716	[ISC_PLATFORM_NEEDSTRLCAT="#undef ISC_PLATFORM_NEEDSTRLCAT"],
1717	[ISC_PLATFORM_NEEDSTRLCAT="#define ISC_PLATFORM_NEEDSTRLCAT 1"])
1718AC_SUBST(ISC_PLATFORM_NEEDSTRLCAT)
1719
1720ISC_PRINT_OBJS=
1721ISC_PRINT_SRCS=
1722AC_MSG_CHECKING(sprintf)
1723AC_TRY_COMPILE([
1724#include <stdio.h>
1725],
1726[ char buf[2]; return(*sprintf(buf,"x"));],
1727[
1728ISC_PRINT_OBJS="print.$O"
1729ISC_PRINT_SRCS="print.c"
1730ISC_PLATFORM_NEEDSPRINTF="#define ISC_PLATFORM_NEEDSPRINTF"
1731LWRES_PLATFORM_NEEDSPRINTF="#define LWRES_PLATFORM_NEEDSPRINTF"
1732],
1733[ISC_PLATFORM_NEEDSPRINTF="#undef ISC_PLATFORM_NEEDSPRINTF"
1734 LWRES_PLATFORM_NEEDSPRINTF="#undef LWRES_PLATFORM_NEEDSPRINTF"]
1735)
1736AC_SUBST(ISC_PLATFORM_NEEDSPRINTF)
1737AC_SUBST(LWRES_PLATFORM_NEEDSPRINTF)
1738
1739AC_CHECK_FUNC(vsnprintf,
1740	[ISC_PLATFORM_NEEDVSNPRINTF="#undef ISC_PLATFORM_NEEDVSNPRINTF"
1741	 LWRES_PLATFORM_NEEDVSNPRINTF="#undef LWRES_PLATFORM_NEEDVSNPRINTF"],
1742	[ISC_PRINT_OBJS="print.$O"
1743	 ISC_PRINT_SRCS="print.c"
1744	 ISC_PLATFORM_NEEDVSNPRINTF="#define ISC_PLATFORM_NEEDVSNPRINTF 1"
1745	 LWRES_PLATFORM_NEEDVSNPRINTF="#define LWRES_PLATFORM_NEEDVSNPRINTF 1"])
1746AC_SUBST(ISC_PLATFORM_NEEDVSNPRINTF)
1747AC_SUBST(LWRES_PLATFORM_NEEDVSNPRINTF)
1748ISC_EXTRA_OBJS="$ISC_EXTRA_OBJS $ISC_PRINT_OBJS"
1749ISC_EXTRA_SRCS="$ISC_EXTRA_SRCS $ISC_PRINT_SRCS"
1750
1751AC_CHECK_FUNC(strerror, AC_DEFINE(HAVE_STRERROR))
1752
1753AC_SUBST(ISC_EXTRA_OBJS)
1754AC_SUBST(ISC_EXTRA_SRCS)
1755
1756# Determine the printf format characters to use when printing
1757# values of type isc_int64_t. This will normally be "ll", but where
1758# the compiler treats "long long" as a alias for "long" and printf
1759# doesn't know about "long long" use "l".  Hopefully the sprintf
1760# will produce a inconsistant result in the later case.  If the compiler
1761# fails due to seeing "%lld" we fall back to "l".
1762#
1763# Win32 uses "%I64d", but that's defined elsewhere since we don't use
1764# configure on Win32.
1765#
1766AC_MSG_CHECKING(printf format modifier for 64-bit integers)
1767AC_TRY_RUN([
1768#include <stdio.h>
1769main() {
1770	long long int j = 0;
1771	char buf[100];
1772	buf[0] = 0;
1773	sprintf(buf, "%lld", j);
1774	exit((sizeof(long long int) != sizeof(long int))? 0 :
1775	     (strcmp(buf, "0") != 0));
1776} 
1777],
1778	[AC_MSG_RESULT(ll)
1779	ISC_PLATFORM_QUADFORMAT='#define ISC_PLATFORM_QUADFORMAT "ll"'],
1780	[AC_MSG_RESULT(l)
1781	ISC_PLATFORM_QUADFORMAT='#define ISC_PLATFORM_QUADFORMAT "l"'],
1782	[AC_MSG_RESULT(assuming target platform uses ll)
1783	ISC_PLATFORM_QUADFORMAT='#define ISC_PLATFORM_QUADFORMAT "ll"'])
1784AC_SUBST(ISC_PLATFORM_QUADFORMAT)
1785
1786#
1787# Security Stuff
1788#
1789AC_CHECK_FUNC(chroot, AC_DEFINE(HAVE_CHROOT))
1790AC_ARG_ENABLE(linux-caps,
1791	[  --disable-linux-caps	disable linux capabilities])
1792case "$enable_linux_caps" in
1793	yes|'')
1794		AC_CHECK_HEADERS(linux/capability.h)
1795		;;
1796	no)
1797		;;
1798esac
1799AC_CHECK_HEADERS(sys/prctl.h)
1800
1801#
1802# Time Zone Stuff
1803#
1804AC_CHECK_FUNC(tzset, AC_DEFINE(HAVE_TZSET))
1805
1806#
1807# BSD/OS, and perhaps some others, don't define rlim_t.
1808#
1809AC_MSG_CHECKING(for type rlim_t)
1810AC_TRY_COMPILE([
1811#include <sys/types.h>
1812#include <sys/time.h>
1813#include <sys/resource.h>],
1814[rlim_t rl = 19671212; return (0);],
1815[AC_MSG_RESULT(yes)
1816 ISC_PLATFORM_RLIMITTYPE="#define ISC_PLATFORM_RLIMITTYPE rlim_t"],
1817[AC_MSG_RESULT(no)
1818
1819AC_MSG_CHECKING(type of rlim_cur)
1820AC_TRY_RUN([
1821#include <sys/types.h>
1822#include <sys/time.h>
1823#include <sys/resource.h>
1824main() { struct rlimit r; exit(!(sizeof(r.rlim_cur) == sizeof(int)));}],
1825[AC_MSG_RESULT(int)
1826ISC_PLATFORM_RLIMITTYPE="#define ISC_PLATFORM_RLIMITTYPE int"],
1827[
1828AC_TRY_RUN([
1829#include <sys/types.h>
1830#include <sys/time.h>
1831#include <sys/resource.h>
1832main() { struct rlimit r; exit(!(sizeof(r.rlim_cur) == sizeof(long int)));}],
1833[AC_MSG_RESULT(long int)
1834ISC_PLATFORM_RLIMITTYPE="#define ISC_PLATFORM_RLIMITTYPE long int"],
1835[
1836AC_TRY_RUN([
1837#include <sys/types.h>
1838#include <sys/time.h>
1839#include <sys/resource.h>
1840main() { struct rlimit r; exit((!sizeof(r.rlim_cur) == sizeof(long long int)));}],
1841[AC_MSG_RESULT(long long int)
1842ISC_PLATFORM_RLIMITTYPE="#define ISC_PLATFORM_RLIMITTYPE long long int"],
1843[AC_MSG_ERROR([unable to determine sizeof rlim_cur])
1844],[AC_MSG_ERROR(this cannot happen)])
1845],[AC_MSG_ERROR(this cannot happen)])
1846],[AC_MSG_ERROR(cannot determine type of rlim_cur when cross compiling - define rlim_t)])
1847])
1848AC_SUBST(ISC_PLATFORM_RLIMITTYPE)
1849
1850#
1851# Compaq TruCluster requires more code for handling cluster IP aliases
1852#
1853case "$host" in
1854	*-dec-osf*)
1855		AC_CHECK_LIB(clua, clua_getaliasaddress, LIBS="-lclua $LIBS")
1856		AC_CHECK_FUNC(clua_getaliasaddress,
1857				AC_DEFINE(HAVE_TRUCLUSTER, 1,
1858					[Define if running under Compaq TruCluster]))
1859		;;
1860	*)
1861		;;
1862esac
1863
1864#
1865# Microsoft has their own way of handling shared libraries that requires
1866# additional qualifiers on extern variables.  Unix systems don't need it.
1867#
1868AC_SUBST(ISC_PLATFORM_USEDECLSPEC)
1869ISC_PLATFORM_USEDECLSPEC="#undef ISC_PLATFORM_USEDECLSPEC"
1870AC_SUBST(LWRES_PLATFORM_USEDECLSPEC)
1871LWRES_PLATFORM_USEDECLSPEC="#undef LWRES_PLATFORM_USEDECLSPEC"
1872
1873#
1874# Random remaining OS-specific issues involving compiler warnings.
1875# XXXDCL print messages to indicate some compensation is being done?
1876#
1877AC_SUBST(ISC_PLATFORM_BRACEPTHREADONCEINIT)
1878ISC_PLATFORM_BRACEPTHREADONCEINIT="#undef ISC_PLATFORM_BRACEPTHREADONCEINIT"
1879
1880case "$host" in
1881	*-aix5.1.*)
1882		hack_shutup_pthreadonceinit=yes
1883		;;
1884	*-bsdi3.1*)
1885		hack_shutup_sputaux=yes
1886		;;
1887	*-bsdi4.0*)
1888		hack_shutup_sigwait=yes
1889		hack_shutup_sputaux=yes
1890		;;
1891	[*-bsdi4.[12]*])
1892		hack_shutup_stdargcast=yes
1893		;;
1894	[*-solaris2.[89]])
1895		hack_shutup_pthreadonceinit=yes
1896		;;
1897esac
1898
1899case "$hack_shutup_pthreadonceinit" in
1900	yes)
1901		#
1902		# Shut up PTHREAD_ONCE_INIT unbraced initializer warnings.
1903		#
1904		ISC_PLATFORM_BRACEPTHREADONCEINIT="#define ISC_PLATFORM_BRACEPTHREADONCEINIT 1"
1905		;;
1906esac
1907
1908case "$hack_shutup_sigwait" in
1909	yes)
1910		#
1911		# Shut up a -Wmissing-prototypes warning for sigwait().
1912		#
1913		AC_DEFINE(SHUTUP_SIGWAIT)
1914		;;
1915esac
1916
1917case "$hack_shutup_sputaux" in
1918	yes)
1919		#
1920		# Shut up a -Wmissing-prototypes warning from <stdio.h>.
1921		#
1922		AC_DEFINE(SHUTUP_SPUTAUX)
1923		;;
1924esac
1925
1926case "$hack_shutup_stdargcast" in
1927	yes)
1928		#
1929		# Shut up a -Wcast-qual warning from va_start().
1930		#
1931		AC_DEFINE(SHUTUP_STDARG_CAST)
1932		;;
1933esac
1934
1935#
1936# Check for if_nametoindex() for IPv6 scoped addresses support
1937#
1938AC_CHECK_FUNC(if_nametoindex, ac_cv_have_if_nametoindex=yes,
1939		ac_cv_have_if_nametoindex=no)
1940case $ac_cv_have_if_nametoindex in
1941no)
1942	case "$host" in
1943  	*-hp-hpux*)
1944  		AC_CHECK_LIB(ipv6, if_nametoindex,
1945				ac_cv_have_if_nametoindex=yes
1946				LIBS="-lipv6 $LIBS",)
1947  	;;
1948	esac
1949esac
1950case $ac_cv_have_if_nametoindex in
1951yes)
1952	ISC_PLATFORM_HAVEIFNAMETOINDEX="#define ISC_PLATFORM_HAVEIFNAMETOINDEX 1"
1953	;;
1954*)
1955	ISC_PLATFORM_HAVEIFNAMETOINDEX="#undef ISC_PLATFORM_HAVEIFNAMETOINDEX"
1956	;;
1957esac
1958AC_SUBST(ISC_PLATFORM_HAVEIFNAMETOINDEX)
1959
1960#
1961# The following sections deal with tools used for formatting
1962# the documentation.  They are all optional, unless you are
1963# a developer editing the documentation source.
1964#
1965
1966# Directory trees where SGML files are commonly found.
1967sgmltrees="/usr/pkg/share/sgml /usr/local/share/sgml /usr/share/sgml"
1968
1969#
1970# Look for openjade.  Plain jade is no longer supported.
1971#
1972
1973AC_PATH_PROGS(OPENJADE, openjade, openjade)
1974AC_SUBST(OPENJADE)
1975
1976#
1977# Look for TeX.
1978#
1979
1980AC_PATH_PROGS(JADETEX, jadetex, jadetex)
1981AC_SUBST(JADETEX)
1982
1983AC_PATH_PROGS(PDFJADETEX, pdfjadetex, pdfjadetex)
1984AC_SUBST(PDFJADETEX)
1985
1986#
1987# Subroutine for searching for an ordinary file (e.g., a stylesheet)
1988# in a number of directories:
1989#
1990#   NOM_PATH_FILE(VARIABLE, FILENAME, DIRECTORIES)
1991#
1992# If the file FILENAME is found in one of the DIRECTORIES, the shell
1993# variable VARIABLE is defined to its absolute pathname.  Otherwise, 
1994# it is set to FILENAME, with no directory prefix (that's not terribly
1995# useful, but looks less confusing in substitutions than leaving it
1996# empty).  The variable VARIABLE will be substituted into output files.
1997# 
1998
1999AC_DEFUN(NOM_PATH_FILE, [
2000$1=""
2001AC_MSG_CHECKING(for $2)
2002for d in $3
2003do
2004	f=$d/$2
2005	if test -f $f
2006	then
2007		$1=$f
2008		AC_MSG_RESULT($f)
2009		break
2010	fi
2011done
2012if test "X[$]$1" = "X"
2013then
2014	AC_MSG_RESULT("not found");
2015	$1=$2
2016fi
2017AC_SUBST($1)
2018])
2019
2020#
2021# Look for the SGML catalog.
2022# Its location varies, so far we have seen:
2023#
2024# 	NetBSD 	/usr/pkg/share/sgml/docbook/catalog
2025# 	FreeBSD	/usr/local/share/sgml/docbook/catalog
2026#	Linux	/usr/local/share/dsssl/docbook/catalog
2027#		/usr/share/sgml/docbook/dsssl-stylesheets/catalog
2028#
2029catalogpath=""
2030for d in $sgmltrees 
2031do
2032	catalogpath="$catalogpath $d"
2033	for s in docbook/dsssl-stylesheets
2034	do
2035		catalogpath="$catalogpath $d/$s"
2036	done
2037done
2038NOM_PATH_FILE(SGMLCATALOG, catalog, $catalogpath)
2039
2040#
2041# Look for the HTML stylesheet html/docbook.dsl, used for
2042# formatting man pages in HTML.  Its location varies,
2043# so far we have seen:
2044#
2045# 	NetBSD 	/usr/pkg/share/sgml/docbook/dsssl/modular/
2046# 	FreeBSD	/usr/local/share/sgml/docbook/dsssl/modular/
2047#	Linux	/usr/local/share/dsssl/docbook/
2048#		/usr/share/sgml/docbook/dsssl-stylesheets/
2049#
2050# Ditto for the print stylesheet print/docbook.dsl.
2051#
2052
2053stylepath=""
2054for d in $sgmltrees 
2055do
2056	for s in docbook/dsssl/modular dsssl/docbook docbook/dsssl-stylesheets
2057	do
2058		stylepath="$stylepath $d/$s"
2059	done
2060done
2061NOM_PATH_FILE(HTMLSTYLE, html/docbook.dsl, $stylepath)
2062NOM_PATH_FILE(PRINTSTYLE, print/docbook.dsl, $stylepath)
2063
2064#
2065# Look for XML declarations.
2066# Its location varies, so far we have seen:
2067#
2068# 	NetBSD 	/usr/pkg/share/sgml/docbook/dsssl/modular/dtds/decls/
2069# 	FreeBSD	/usr/local/share/sgml/docbook/dsssl/modular/dtds/decls/
2070#	Linux	/usr/local/share/dsssl/docbook/dtds/decls/
2071#		/usr/share/sgml/docbook/dsssl-stylesheets/dtds/decls/
2072#
2073
2074xmlpath=""
2075for d in $sgmltrees 
2076do
2077	for s in docbook/dsssl/modular dsssl/docbook docbook/dsssl-stylesheets
2078	do
2079		xmlpath="$xmlpath $d/$s"
2080	done
2081done
2082NOM_PATH_FILE(XMLDCL, dtds/decls/xml.dcl, $xmlpath)
2083
2084#
2085# Look for docbook2man-spec.pl
2086#
2087
2088NOM_PATH_FILE(DOCBOOK2MANSPEC, docbook2X/docbook2man-spec.pl, $sgmltrees)
2089
2090#
2091# Substitutions
2092#
2093AC_SUBST(BIND9_TOP_BUILDDIR)
2094BIND9_TOP_BUILDDIR=`pwd`
2095
2096AC_SUBST(BIND9_ISC_BUILDINCLUDE)
2097AC_SUBST(BIND9_ISCCC_BUILDINCLUDE)
2098AC_SUBST(BIND9_ISCCFG_BUILDINCLUDE)
2099AC_SUBST(BIND9_DNS_BUILDINCLUDE)
2100AC_SUBST(BIND9_LWRES_BUILDINCLUDE)
2101AC_SUBST(BIND9_BIND9_BUILDINCLUDE)
2102if test "X$srcdir" != "X"; then
2103	BIND9_ISC_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/isc/include"
2104	BIND9_ISCCC_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/isccc/include"
2105	BIND9_ISCCFG_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/isccfg/include"
2106	BIND9_DNS_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/dns/include"
2107	BIND9_LWRES_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/lwres/include"
2108	BIND9_BIND9_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/bind9/include"
2109else
2110	BIND9_ISC_BUILDINCLUDE=""
2111	BIND9_ISCCC_BUILDINCLUDE=""
2112	BIND9_ISCCFG_BUILDINCLUDE=""
2113	BIND9_DNS_BUILDINCLUDE=""
2114	BIND9_LWRES_BUILDINCLUDE=""
2115	BIND9_BIND9_BUILDINCLUDE=""
2116fi
2117
2118AC_SUBST_FILE(BIND9_MAKE_INCLUDES)
2119BIND9_MAKE_INCLUDES=$BIND9_TOP_BUILDDIR/make/includes
2120
2121AC_SUBST_FILE(BIND9_MAKE_RULES)
2122BIND9_MAKE_RULES=$BIND9_TOP_BUILDDIR/make/rules
2123
2124. $srcdir/version
2125BIND9_VERSION="VERSION=${MAJORVER}.${MINORVER}.${PATCHVER}${RELEASETYPE}${RELEASEVER}"
2126AC_SUBST(BIND9_VERSION)
2127
2128AC_SUBST_FILE(LIBISC_API)
2129LIBISC_API=$srcdir/lib/isc/api
2130
2131AC_SUBST_FILE(LIBISCCC_API)
2132LIBISCCC_API=$srcdir/lib/isccc/api
2133
2134AC_SUBST_FILE(LIBISCCFG_API)
2135LIBISCCFG_API=$srcdir/lib/isccfg/api
2136
2137AC_SUBST_FILE(LIBDNS_API)
2138LIBDNS_API=$srcdir/lib/dns/api
2139
2140AC_SUBST_FILE(LIBBIND9_API)
2141LIBBIND9_API=$srcdir/lib/bind9/api
2142
2143AC_SUBST_FILE(LIBLWRES_API)
2144LIBLWRES_API=$srcdir/lib/lwres/api
2145
2146AC_OUTPUT(
2147	make/rules
2148	make/includes
2149	Makefile
2150	make/Makefile
2151	make/mkdep
2152	lib/Makefile
2153	lib/isc/Makefile
2154	lib/isc/include/Makefile
2155	lib/isc/include/isc/Makefile
2156	lib/isc/include/isc/platform.h
2157	lib/isc/unix/Makefile
2158	lib/isc/unix/include/Makefile
2159	lib/isc/unix/include/isc/Makefile
2160	lib/isc/nls/Makefile
2161	lib/isc/$thread_dir/Makefile
2162	lib/isc/$thread_dir/include/Makefile
2163	lib/isc/$thread_dir/include/isc/Makefile
2164	lib/isccc/Makefile
2165	lib/isccc/include/Makefile
2166	lib/isccc/include/isccc/Makefile
2167	lib/isccfg/Makefile
2168	lib/isccfg/include/Makefile
2169	lib/isccfg/include/isccfg/Makefile
2170	lib/dns/Makefile
2171	lib/dns/include/Makefile
2172	lib/dns/include/dns/Makefile
2173	lib/dns/include/dst/Makefile
2174	lib/bind9/Makefile
2175	lib/bind9/include/Makefile
2176	lib/bind9/include/bind9/Makefile
2177	lib/lwres/Makefile
2178	lib/lwres/include/Makefile
2179	lib/lwres/include/lwres/Makefile
2180	lib/lwres/include/lwres/netdb.h
2181	lib/lwres/include/lwres/platform.h
2182	lib/lwres/man/Makefile
2183	lib/lwres/unix/Makefile
2184	lib/lwres/unix/include/Makefile
2185	lib/lwres/unix/include/lwres/Makefile
2186	lib/tests/Makefile
2187	lib/tests/include/Makefile
2188	lib/tests/include/tests/Makefile
2189	bin/Makefile
2190	bin/check/Makefile
2191	bin/named/Makefile
2192	bin/named/unix/Makefile
2193	bin/rndc/Makefile
2194	bin/rndc/unix/Makefile
2195	bin/dig/Makefile
2196	bin/nsupdate/Makefile
2197	bin/tests/Makefile
2198	bin/tests/names/Makefile
2199	bin/tests/master/Makefile
2200	bin/tests/rbt/Makefile
2201	bin/tests/db/Makefile
2202	bin/tests/tasks/Makefile
2203	bin/tests/timers/Makefile
2204	bin/tests/dst/Makefile
2205	bin/tests/mem/Makefile
2206	bin/tests/net/Makefile
2207	bin/tests/sockaddr/Makefile
2208	bin/tests/system/Makefile
2209	bin/tests/system/conf.sh
2210	bin/tests/system/lwresd/Makefile
2211	bin/tests/system/tkey/Makefile
2212	bin/tests/headerdep_test.sh
2213	bin/dnssec/Makefile
2214	doc/Makefile
2215	doc/arm/Makefile
2216	doc/arm/nominum-docbook-html.dsl
2217	doc/arm/nominum-docbook-print.dsl
2218	doc/arm/validate.sh
2219	doc/misc/Makefile
2220	docutil/docbook2man-wrapper.sh
2221	isc-config.sh
2222)
2223chmod a+x isc-config.sh
2224
2225# Tell Emacs to edit this file in shell mode.
2226# Local Variables:
2227# mode: sh
2228# End:
2229