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