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