1 dnl @(#) $Header: /tcpdump/master/tcpdump/configure.in,v 1.181 2004-07-10 21:53:31 guy Exp $ (LBL)
3 dnl Copyright (c) 1994, 1995, 1996, 1997
4 dnl The Regents of the University of California. All rights reserved.
6 dnl Process this file with autoconf to produce a configure script.
9 AC_REVISION($Revision: 1.181 $)
15 AC_LBL_C_INIT(V_CCOPT, V_INCLS)
18 AC_CHECK_HEADERS(fcntl.h rpc/rpcent.h netdnet/dnetdb.h netinet/ether.h)
19 AC_CHECK_HEADERS(netinet/if_ether.h, , , [#include <sys/types.h>
20 #include <sys/socket.h>])
26 AC_MSG_CHECKING(Linux kernel version)
27 if test "$cross_compiling" = yes; then
28 AC_CACHE_VAL(ac_cv_linux_vers,
29 ac_cv_linux_vers=unknown)
31 AC_CACHE_VAL(ac_cv_linux_vers,
32 ac_cv_linux_vers=`uname -r 2>&1 | \
33 sed -n -e '$s/.* //' -e '$s/\..*//p'`)
35 AC_MSG_RESULT($ac_cv_linux_vers)
36 if test $ac_cv_linux_vers = unknown ; then
37 AC_MSG_ERROR(cannot determine linux version when cross-compiling)
39 if test $ac_cv_linux_vers -lt 2 ; then
40 AC_MSG_ERROR(version 2 or higher required; see the INSTALL doc for more info)
49 AC_CHECK_HEADERS(smi.h)
50 AC_CHECK_LIB(smi, smiInit)
51 if test "$ac_cv_header_smi_h" = yes -a "$ac_cv_lib_smi_smiInit" = yes
53 AC_MSG_CHECKING([whether to enable libsmi])
54 AC_TRY_RUN([ /* libsmi available check */
58 int current, revision, age, n;
59 const int required = 2;
62 if (strcmp(SMI_LIBRARY_VERSION, smi_library_version))
64 n = sscanf(smi_library_version, "%d:%d:%d", ¤t, &revision, &age);
67 if (required < current - age || required > current)
75 dnl autoconf documentation says that $? contains the exit value.
76 dnl reality is that it does not. We leave this in just in case
77 dnl autoconf ever comes back to match the documentation.
79 1) AC_MSG_RESULT(no - smiInit failed) ;;
80 2) AC_MSG_RESULT(no - header/library version mismatch) ;;
81 3) AC_MSG_RESULT(no - can't determine library version) ;;
82 4) AC_MSG_RESULT(no - too old) ;;
83 *) AC_MSG_RESULT(no) ;;
86 [ AC_MSG_RESULT(not when cross-compiling)
91 AC_MSG_CHECKING([whether to enable the possibly-buggy SMB printer])
93 [ --enable-smb enable possibly-buggy SMB printer [default=yes]
94 --disable-smb disable possibly-buggy SMB printer],,
97 yes) AC_MSG_RESULT(yes)
98 AC_WARN([The SMB printer may have exploitable buffer overflows!!!])
99 AC_DEFINE(TCPDUMP_DO_SMB)
100 LOCALSRC="print-smb.c smbutil.c $LOCALSRC"
106 AC_ARG_WITH(user, [ --with-user=USERNAME drop privileges by default to USERNAME])
107 AC_MSG_CHECKING([whether to drop root privileges by default])
108 if test ! -z "$with_user" ; then
109 AC_DEFINE_UNQUOTED(WITH_USER, "$withval")
110 AC_MSG_RESULT(to \"$withval\")
115 AC_ARG_WITH(chroot, [ --with-chroot=DIRECTORY when dropping privileges, chroot to DIRECTORY])
116 AC_MSG_CHECKING([whether to chroot])
117 if test ! -z "$with_chroot" ; then
118 AC_DEFINE_UNQUOTED(WITH_CHROOT, "$withval")
119 AC_MSG_RESULT(to \"$withval\")
124 AC_MSG_CHECKING([whether to enable ipv6])
126 [ --enable-ipv6 enable ipv6 (with ipv4) support
127 --disable-ipv6 disable ipv6 support],
128 [ case "$enableval" in
129 yes) AC_MSG_RESULT(yes)
130 LOCALSRC="print-ip6.c print-ip6opts.c print-mobility.c print-ripng.c print-icmp6.c print-frag6.c print-rt6.c print-ospf6.c print-dhcp6.c $LOCALSRC"
140 AC_TRY_RUN([ /* AF_INET6 available check */
141 #include <sys/types.h>
142 #include <sys/socket.h>
145 if (socket(AF_INET6, SOCK_STREAM, 0) < 0)
152 LOCALSRC="print-ip6.c print-ip6opts.c print-mobility.c print-ripng.c print-icmp6.c print-frag6.c print-rt6.c print-ospf6.c print-dhcp6.c $LOCALSRC"
165 if test "$ipv6" = "yes"; then
166 AC_MSG_CHECKING([ipv6 stack type])
167 for i in inria kame linux-glibc linux-libinet6 toshiba v6d zeta; do
170 dnl http://www.kame.net/
172 [#include <netinet/in.h>
173 #ifdef IPV6_INRIA_VERSION
177 CFLAGS="-DINET6 $CFLAGS"])
180 dnl http://www.kame.net/
182 [#include <netinet/in.h>
188 ipv6libdir=/usr/local/v6/lib;
190 CFLAGS="-DINET6 $CFLAGS"])
193 dnl http://www.v6.linux.or.jp/
195 [#include <features.h>
196 #if defined(__GLIBC__) && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1
200 CFLAGS="-DINET6 $CFLAGS"])
203 dnl http://www.v6.linux.or.jp/
205 dnl This also matches Solaris 8 and Tru64 UNIX 5.1,
206 dnl and possibly other versions of those OSes
208 if test -d /usr/inet6 -o -f /usr/include/netinet/ip6.h; then
211 ipv6libdir=/usr/inet6/lib
213 CFLAGS="-DINET6 -I/usr/inet6/include $CFLAGS"
218 [#include <sys/param.h>
219 #ifdef _TOSHIBA_INET6
224 ipv6libdir=/usr/local/v6/lib;
225 CFLAGS="-DINET6 $CFLAGS"])
229 [#include </usr/local/v6/include/sys/v6config.h>
235 ipv6libdir=/usr/local/v6/lib;
236 CFLAGS="-I/usr/local/v6/include $CFLAGS"])
240 [#include <sys/param.h>
241 #ifdef _ZETA_MINAMI_INET6
246 ipv6libdir=/usr/local/v6/lib;
247 CFLAGS="-DINET6 $CFLAGS"])
250 if test "$ipv6type" != "unknown"; then
254 AC_MSG_RESULT($ipv6type)
257 if test "$ipv6" = "yes" -a "$ipv6lib" != "none"; then
258 if test -d $ipv6libdir -a -f $ipv6libdir/lib$ipv6lib.a; then
259 LIBS="-L$ipv6libdir -l$ipv6lib $LIBS"
260 echo "You have $ipv6lib library, using it"
262 if test "$ipv6trylibc" = "yes"; then
263 echo "You do not have $ipv6lib library, using libc"
265 echo 'Fatal: no $ipv6lib library found. cannot continue.'
266 echo "You need to fetch lib$ipv6lib.a from appropriate"
267 echo 'ipv6 kit and compile beforehand.'
274 if test "$ipv6" = "yes"; then
276 # XXX - on Tru64 UNIX 5.1, there is no "getaddrinfo()"
277 # function in libc; there are "ngetaddrinfo()" and
278 # "ogetaddrinfo()" functions, and <netdb.h> #defines
279 # "getaddrinfo" to be either "ngetaddrinfo" or
280 # "ogetaddrinfo", depending on whether _SOCKADDR_LEN
281 # or _XOPEN_SOURCE_EXTENDED are defined or not.
283 # So this test doesn't work on Tru64 5.1, and possibly
284 # on other 5.x releases. This causes the configure
285 # script to become confused, and results in libpcap
288 AC_SEARCH_LIBS(getaddrinfo, socket, [dnl
289 AC_MSG_CHECKING(getaddrinfo bug)
290 AC_CACHE_VAL(td_cv_buggygetaddrinfo, [AC_TRY_RUN([
291 #include <sys/types.h>
294 #include <sys/socket.h>
295 #include <netinet/in.h>
299 int passive, gaierr, inet4 = 0, inet6 = 0;
300 struct addrinfo hints, *ai, *aitop;
301 char straddr[INET6_ADDRSTRLEN], strport[16];
303 for (passive = 0; passive <= 1; passive++) {
304 memset(&hints, 0, sizeof(hints));
305 hints.ai_family = AF_UNSPEC;
306 hints.ai_flags = passive ? AI_PASSIVE : 0;
307 hints.ai_socktype = SOCK_STREAM;
308 hints.ai_protocol = IPPROTO_TCP;
309 if ((gaierr = getaddrinfo(NULL, "54321", &hints, &aitop)) != 0) {
310 (void)gai_strerror(gaierr);
313 for (ai = aitop; ai; ai = ai->ai_next) {
314 if (ai->ai_addr == NULL ||
315 ai->ai_addrlen == 0 ||
316 getnameinfo(ai->ai_addr, ai->ai_addrlen,
317 straddr, sizeof(straddr), strport, sizeof(strport),
318 NI_NUMERICHOST|NI_NUMERICSERV) != 0) {
321 switch (ai->ai_family) {
323 if (strcmp(strport, "54321") != 0) {
327 if (strcmp(straddr, "0.0.0.0") != 0) {
331 if (strcmp(straddr, "127.0.0.1") != 0) {
338 if (strcmp(strport, "54321") != 0) {
342 if (strcmp(straddr, "::") != 0) {
346 if (strcmp(straddr, "::1") != 0) {
363 /* another family support? */
369 /* supported family should be 2, unsupported family should be 0 */
370 if (!(inet4 == 0 || inet4 == 2))
372 if (!(inet6 == 0 || inet6 == 2))
385 td_cv_buggygetaddrinfo=no,
386 td_cv_buggygetaddrinfo=yes,
387 td_cv_buggygetaddrinfo=yes)])
388 if test "$td_cv_buggygetaddrinfo" = no; then
394 if test "$td_cv_buggygetaddrinfo" = "yes"; then
396 # XXX - it doesn't appear that "ipv6type" can ever be
397 # set to "linux". Should this be testing for
398 # "linux-glibc", or for that *or* "linux-libinet6"?
399 # If the latter, note that "linux-libinet6" is also
400 # the type given to some non-Linux OSes.
402 if test "$ipv6type" != "linux"; then
403 echo 'Fatal: You must get working getaddrinfo() function.'
404 echo ' or you can specify "--disable-ipv6"'.
407 echo 'Warning: getaddrinfo() implementation on your system seems be buggy.'
408 echo ' Better upgrade your system library to newest version'
409 echo ' of GNU C library (aka glibc).'
413 AC_REPLACE_FUNCS(getaddrinfo getnameinfo)
416 AC_CACHE_CHECK([for dnet_htoa declaration in netdnet/dnetdb.h],
417 [td_cv_decl_netdnet_dnetdb_h_dnet_htoa],
418 [AC_EGREP_HEADER(dnet_htoa, netdnet/dnetdb.h,
419 td_cv_decl_netdnet_dnetdb_h_dnet_htoa=yes,
420 td_cv_decl_netdnet_dnetdb_h_dnet_htoa=no)])
421 if test "$td_cv_decl_netdnet_dnetdb_h_dnet_htoa" = yes; then
422 AC_DEFINE(HAVE_NETDNET_DNETDB_H_DNET_HTOA)
426 dnl check sizeof basic types.
427 dnl They're very likely to be wrong for cross-compiling.
428 AC_CHECK_SIZEOF(char, 1)
429 AC_CHECK_SIZEOF(short, 2)
430 AC_CHECK_SIZEOF(int, 4)
431 AC_CHECK_SIZEOF(long, 4)
432 AC_CHECK_SIZEOF(long long, 8)
435 dnl Checks for u_intXX_t
436 dnl AC_CHECK_BITTYPES(ac_cv_bittypes)
437 dnl if test "$ac_cv_bittypes" = no; then
438 dnl missing_includes=yes
442 dnl Checks for addrinfo structure
443 AC_STRUCT_ADDRINFO(ac_cv_addrinfo)
444 if test "$ac_cv_addrinfo" = no; then
449 dnl Checks for NI_MAXSERV
450 AC_NI_MAXSERV(ac_cv_maxserv)
451 if test "$ac_cv_maxserv" = no; then
456 dnl Checks for NI_NAMEREQD
457 AC_NI_NAMEREQD(ac_cv_namereqd)
458 if test "$ac_cv_namereqd" = no; then
463 dnl Checks for sockaddr_storage structure
464 AC_STRUCT_SA_STORAGE(ac_cv_sa_storage)
465 if test "$ac_cv_sa_storage" = no; then
470 dnl Checks for IN[6]ADDRSZ
471 AC_CHECK_ADDRSZ(ac_cv_addrsz)
472 if test "$ac_cv_addrsz" = no; then
477 dnl Checks for RES_USE_INET6
478 AC_CHECK_RES_USE_INET6(ac_cv_res_inet6)
479 if test "$ac_cv_res_inet6" = no; then
484 dnl Checks for res_state_ext structure
485 AC_STRUCT_RES_STATE_EXT(ac_cv_res_state_ext)
486 if test "$ac_cv_res_state_ext" = no; then
491 dnl Checks if res_state structure has nsort member.
492 AC_STRUCT_RES_STATE(ac_cv_res_state)
495 AC_REPLACE_FUNCS(vfprintf strcasecmp strlcat strlcpy strdup strsep)
496 AC_CHECK_FUNCS(strftime)
497 AC_CHECK_FUNCS(ether_ntohost, [
498 AC_CACHE_CHECK(for buggy ether_ntohost, ac_cv_buggy_ether_ntohost, [
501 #include <sys/types.h>
502 #include <sys/param.h>
503 #include <sys/socket.h>
506 main(int argc, char **argv)
508 u_char ea[6] = { 0xff, 0xff, 0xff, 0xff, 0xff };
509 char name[MAXHOSTNAMELEN];
511 ether_ntohost(name, (struct ether_addr *)ea);
514 ], [ac_cv_buggy_ether_ntohost=no],
515 [ac_cv_buggy_ether_ntohost=yes],
516 [ac_cv_buggy_ether_ntohost="not while cross-compiling"])])
517 if test "$ac_cv_buggy_ether_ntohost" = "no"; then
518 AC_DEFINE(USE_ETHER_NTOHOST)
521 AC_CHECK_FUNCS(setlinebuf alarm)
524 AC_CHECK_FUNCS(vsnprintf snprintf,,
526 if test $needsnprintf = yes; then
532 AC_SEARCH_LIBS(dnet_htoa, dnet, AC_DEFINE(HAVE_DNET_HTOA))
534 AC_CHECK_LIB(rpc, main) dnl It's unclear why we might need -lrpc
536 dnl HP/UX may need -lnsl for getrpcbynumber.
537 AC_SEARCH_LIBS(getrpcbynumber, nsl)
539 dnl AC_CHECK_LIB(z, uncompress)
540 dnl AC_CHECK_HEADERS(zlib.h)
542 AC_LBL_LIBPCAP(V_PCAPDEP, V_INCLS)
545 # Check for these after AC_LBL_LIBPCAP, so we link with the appropriate
546 # libraries (e.g., "-lsocket -lnsl" on Solaris).
548 # We don't use AC_REPLACE_FUNCS because that uses AC_CHECK_FUNCS which
549 # use AC_CHECK_FUNC which doesn't let us specify the right #includes
550 # to make this work on BSD/OS 4.x. BSD/OS 4.x ships with the BIND8
551 # resolver, and the way it defines inet_{ntop,pton} is rather strange;
552 # it does not ship with a libc symbol "inet_ntop()", it ships with
553 # "_inet_ntop()", and has a #define macro in one of the system headers
556 dnl AC_TRY_COMPILE(inet_ntop inet_pton inet_aton)
557 AC_MSG_CHECKING(for inet_ntop)
558 AC_TRY_LINK([#include <sys/types.h>
559 #include <sys/socket.h>
560 #include <netinet/in.h>
561 #include <arpa/inet.h>], [char src[4], dst[128];
562 inet_ntop(AF_INET, src, dst, sizeof(dst));],
563 [AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no)
564 AC_LIBOBJ(inet_ntop)])
565 AC_MSG_CHECKING(for inet_pton)
566 AC_TRY_LINK([#include <sys/types.h>
567 #include <sys/socket.h>
568 #include <netinet/in.h>
569 #include <arpa/inet.h>], [char src[128], dst[4];
570 inet_pton(AF_INET, src, dst);],
571 [AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no)
572 AC_LIBOBJ(inet_pton)])
573 AC_MSG_CHECKING(for inet_aton)
574 AC_TRY_LINK([#include <sys/types.h>
575 #include <netinet/in.h>
576 #include <arpa/inet.h>], [char src[128];
578 inet_aton(src, &dst);],
579 [AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no)
580 AC_LIBOBJ(inet_aton)])
582 dnl portability macros for getaddrinfo/getnameinfo
585 AC_CHECK_SA_LEN(ac_cv_sockaddr_has_sa_len)
586 if test "$ac_cv_sockaddr_has_sa_len" = no; then
590 AC_CHECK_FUNCS(pcap_findalldevs pcap_dump_flush pcap_lib_version)
591 if test $ac_cv_func_pcap_findalldevs = "yes" ; then
592 dnl Check for Mac OS X, which may ship pcap.h from 0.6 but libpcap may
593 dnl be 0.8; this means that lib has pcap_findalldevs but header doesn't
595 savedcflags="$CFLAGS"
596 CFLAGS="$CFLAGS $V_INCLS"
597 AC_CHECK_TYPES(pcap_if_t, , , [#include <pcap.h>])
598 CFLAGS="$savedcflags"
601 if test $ac_cv_func_pcap_lib_version = "no" ; then
602 AC_MSG_CHECKING(whether pcap_version is defined by libpcap)
606 return_pcap_version(void)
608 extern char pcap_version[];
613 ac_lbl_cv_pcap_version_defined=yes,
614 ac_lbl_cv_pcap_version_defined=no)
615 if test "$ac_lbl_cv_pcap_version_defined" = yes ; then
617 AC_DEFINE(HAVE_PCAP_VERSION)
622 AC_MSG_CHECKING(whether pcap_debug is defined by libpcap)
626 return_pcap_debug(void)
628 extern int pcap_debug;
633 ac_lbl_cv_pcap_debug_defined=yes,
634 ac_lbl_cv_pcap_debug_defined=no)
635 if test "$ac_lbl_cv_pcap_debug_defined" = yes ; then
637 AC_DEFINE(HAVE_PCAP_DEBUG)
641 # OK, what about "yydebug"?
643 AC_MSG_CHECKING(whether yydebug is defined by libpcap)
654 ac_lbl_cv_yydebug_defined=yes,
655 ac_lbl_cv_yydebug_defined=no)
656 if test "$ac_lbl_cv_yydebug_defined" = yes ; then
658 AC_DEFINE(HAVE_YYDEBUG)
663 AC_REPLACE_FUNCS(bpf_dump) dnl moved to libpcap in 0.6
666 if test -f /etc/group -a ! -z "`grep '^wheel:' /etc/group`" ; then
672 dnl Workaround to enable certain features
689 if test -f /dev/bpf0 ; then
693 AC_LBL_CHECK_TYPE(int8_t, signed char)
694 AC_LBL_CHECK_TYPE(u_int8_t, u_char)
695 AC_LBL_CHECK_TYPE(int16_t, short)
696 AC_LBL_CHECK_TYPE(u_int16_t, u_short)
697 AC_LBL_CHECK_TYPE(int32_t, int)
698 AC_LBL_CHECK_TYPE(u_int32_t, u_int)
699 AC_LBL_CHECK_TYPE(int64_t, long long)
700 AC_LBL_CHECK_TYPE(u_int64_t, unsigned long long)
703 # We can't just check for <inttypes.h> - some systems have one that
704 # doesn't define all the PRI[doxu]64 macros.
706 AC_CHECK_HEADERS(inttypes.h,
709 # OK, we have inttypes.h, but does it define those macros?
711 AC_MSG_CHECKING([[whether inttypes.h defines the PRI[doxu]64 macros]])
716 #include <inttypes.h>
718 #include <sys/types.h>
722 printf("%" PRId64 "\n", (u_int64_t)1);
723 printf("%" PRIo64 "\n", (u_int64_t)1);
724 printf("%" PRIx64 "\n", (u_int64_t)1);
725 printf("%" PRIu64 "\n", (u_int64_t)1);
731 ac_lbl_inttypes_h_defines_formats=yes
735 ac_lbl_inttypes_h_defines_formats=no
740 # We don't have inttypes.h, so it obviously can't define those
743 ac_lbl_inttypes_h_defines_formats=no
745 if test "$ac_lbl_inttypes_h_defines_formats" = yes; then
746 AC_DEFINE(INTTYPES_H_DEFINES_FORMATS)
748 AC_LBL_CHECK_64BIT_FORMAT(ll,
750 AC_LBL_CHECK_64BIT_FORMAT(L,
752 AC_LBL_CHECK_64BIT_FORMAT(q,
754 AC_MSG_ERROR([neither %llx nor %Lx nor %qx worked on a 64-bit integer])
760 AC_LBL_DEVEL(V_CCOPT)
762 AC_LBL_SOCKADDR_SA_LEN
764 AC_LBL_UNALIGNED_ACCESS
768 AC_ARG_WITH(crypto, [ --without-crypto disable crypto support],
770 AC_MSG_CHECKING(for SSLeay)
774 Xprefix=`eval echo $prefix`
776 for dir in $Xprefix /usr/${host_alias} /usr /usr/local /usr/local/ssl /usr/pkg; do
778 # XXX - is there a better way to check if a given library is
779 # in a given directory than checking each of the possible
780 # shared library suffixes?
782 # Are there any other suffixes we need to look for? Do we have to
783 # worry about ".so.{version}"?
785 # Or should we just look for "libcrypto.*"?
787 if test -d $dir/lib -a \( -f $dir/lib/libcrypto.a -o \
788 -f $dir/lib/libcrypto.so -o \
789 -f $dir/lib/libcrypto.sl -o \
790 -f $dir/lib/libcrypto.dylib \); then
791 ac_cv_ssleay_path=$dir
793 if test -d $dir/include/openssl -a -f $dir/include/openssl/des.h; then
794 incdir="-I$dir/include"
796 if test "$ac_cv_ssleay_path" != "no" -a "$incdir" != "no"; then
803 AC_MSG_RESULT($ac_cv_ssleay_path)
804 if test "$ac_cv_ssleay_path" != no; then
805 V_INCLS="$V_INCLS $incdir"
806 LDFLAGS="-L$dir/lib $LDFLAGS"
807 if test -f $ac_cv_ssleay_path/lib/libRSAglue.a; then
808 LIBS="$LIBS -lRSAglue"
810 if test -f $ac_cv_ssleay_path/lib/librsaref.a; then
811 LIBS="$LIBS -lrsaref"
813 AC_CHECK_LIB(crypto, DES_cbc_encrypt)
815 CPPFLAGS="$CPPFLAGS $V_INCLS"
816 AC_CHECK_HEADERS(openssl/evp.h)
821 dnl set additional include path if necessary
822 if test "$missing_includes" = "yes"; then
823 CPPFLAGS="$CPPFLAGS -I\$(srcdir)/missing"
824 V_INCLS="$V_INCLS -I\$(srcdir)/missing"
836 AC_CONFIG_HEADER(config.h)
838 AC_OUTPUT_COMMANDS([if test -f .devel; then
839 echo timestamp > stamp-h
840 cat Makefile-devel-adds >> Makefile