1 dnl @(#) $Header: /tcpdump/master/tcpdump/configure.in,v 1.155 2002-08-03 22:37:01 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.155 $)
15 AC_LBL_C_INIT(V_CCOPT, V_INCLS)
19 AC_CHECK_HEADERS(fcntl.h rpc/rpcent.h netinet/if_ether.h netdnet/dnetdb.h)
25 AC_MSG_CHECKING(Linux kernel version)
26 if test "$cross_compiling" = yes; then
27 AC_CACHE_VAL(ac_cv_linux_vers,
28 ac_cv_linux_vers=unknown)
30 AC_CACHE_VAL(ac_cv_linux_vers,
31 ac_cv_linux_vers=`uname -r 2>&1 | \
32 sed -n -e '$s/.* //' -e '$s/\..*//p'`)
34 AC_MSG_RESULT($ac_cv_linux_vers)
35 if test $ac_cv_linux_vers = unknown ; then
36 AC_MSG_ERROR(cannot determine linux version when cross-compiling)
38 if test $ac_cv_linux_vers -lt 2 ; then
39 AC_MSG_ERROR(version 2 or higher required; see the INSTALL doc for more info)
48 AC_CHECK_HEADERS(smi.h)
49 AC_CHECK_LIB(smi, smiInit)
50 if test "$ac_cv_header_smi_h" = yes -a "$ac_cv_lib_smi_smiInit" = yes
52 AC_MSG_CHECKING([whether to enable libsmi])
53 AC_TRY_RUN([ /* libsmi available check */
57 int current, revision, age, n;
58 const int required = 2;
61 if (strcmp(SMI_LIBRARY_VERSION, smi_library_version))
63 n = sscanf(smi_library_version, "%d:%d:%d", ¤t, &revision, &age);
66 if (required < current - age || required > current)
74 dnl autoconf documentation says that $? contains the exit value.
75 dnl reality is that it does not. We leave this in just in case
76 dnl autoconf ever comes back to match the documentation.
78 1) AC_MSG_RESULT(no - smiInit failed) ;;
79 2) AC_MSG_RESULT(no - header/library version mismatch) ;;
80 3) AC_MSG_RESULT(no - can't determine library version) ;;
81 4) AC_MSG_RESULT(no - too old) ;;
82 *) AC_MSG_RESULT(no) ;;
85 [ AC_MSG_RESULT(not when cross-compiling)
90 AC_MSG_CHECKING([whether to enable the possibly-buggy SMB printer])
92 [ --enable-smb enable possibly-buggy SMB printer [default=yes]
93 --disable-smb disable possibly-buggy SMB printer],,
96 yes) AC_MSG_RESULT(yes)
97 AC_WARN([The SMB printer may have exploitable buffer overflows!!!])
98 AC_DEFINE(TCPDUMP_DO_SMB)
99 LOCALSRC="print-smb.c smbutil.c $LOCALSRC"
105 AC_MSG_CHECKING([whether to enable ipv6])
107 [ --enable-ipv6 enable ipv6 (with ipv4) support
108 --disable-ipv6 disable ipv6 support],
109 [ case "$enableval" in
110 yes) AC_MSG_RESULT(yes)
111 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"
121 AC_TRY_RUN([ /* AF_INET6 available check */
122 #include <sys/types.h>
123 #include <sys/socket.h>
126 if (socket(AF_INET6, SOCK_STREAM, 0) < 0)
133 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"
146 if test "$ipv6" = "yes"; then
147 AC_MSG_CHECKING([ipv6 stack type])
148 for i in inria kame linux-glibc linux-libinet6 toshiba v6d zeta; do
151 dnl http://www.kame.net/
152 AC_EGREP_CPP(yes, [dnl
153 #include <netinet/in.h>
154 #ifdef IPV6_INRIA_VERSION
158 CFLAGS="-DINET6 $CFLAGS"])
161 dnl http://www.kame.net/
162 AC_EGREP_CPP(yes, [dnl
163 #include <netinet/in.h>
169 ipv6libdir=/usr/local/v6/lib;
171 CFLAGS="-DINET6 $CFLAGS"])
174 dnl http://www.v6.linux.or.jp/
175 AC_EGREP_CPP(yes, [dnl
176 #include <features.h>
177 #if defined(__GLIBC__) && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1
181 CFLAGS="-DINET6 $CFLAGS"])
184 dnl http://www.v6.linux.or.jp/
186 dnl This also matches Solaris 8 and Tru64 UNIX 5.1,
187 dnl and possibly other versions of those OSes
189 if test -d /usr/inet6 -o -f /usr/include/netinet/ip6.h; then
192 ipv6libdir=/usr/inet6/lib
194 CFLAGS="-DINET6 -I/usr/inet6/include $CFLAGS"
198 AC_EGREP_CPP(yes, [dnl
199 #include <sys/param.h>
200 #ifdef _TOSHIBA_INET6
205 ipv6libdir=/usr/local/v6/lib;
206 CFLAGS="-DINET6 $CFLAGS"])
209 AC_EGREP_CPP(yes, [dnl
210 #include </usr/local/v6/include/sys/v6config.h>
216 ipv6libdir=/usr/local/v6/lib;
217 CFLAGS="-I/usr/local/v6/include $CFLAGS"])
220 AC_EGREP_CPP(yes, [dnl
221 #include <sys/param.h>
222 #ifdef _ZETA_MINAMI_INET6
227 ipv6libdir=/usr/local/v6/lib;
228 CFLAGS="-DINET6 $CFLAGS"])
231 if test "$ipv6type" != "unknown"; then
235 AC_MSG_RESULT($ipv6type)
238 if test "$ipv6" = "yes" -a "$ipv6lib" != "none"; then
239 if test -d $ipv6libdir -a -f $ipv6libdir/lib$ipv6lib.a; then
240 LIBS="-L$ipv6libdir -l$ipv6lib $LIBS"
241 echo "You have $ipv6lib library, using it"
243 if test "$ipv6trylibc" = "yes"; then
244 echo "You do not have $ipv6lib library, using libc"
246 echo 'Fatal: no $ipv6lib library found. cannot continue.'
247 echo "You need to fetch lib$ipv6lib.a from appropriate"
248 echo 'ipv6 kit and compile beforehand.'
255 if test "$ipv6" = "yes"; then
257 # XXX - on Tru64 UNIX 5.1, there is no "getaddrinfo()"
258 # function in libc; there are "ngetaddrinfo()" and
259 # "ogetaddrinfo()" functions, and <netdb.h> #defines
260 # "getaddrinfo" to be either "ngetaddrinfo" or
261 # "ogetaddrinfo", depending on whether _SOCKADDR_LEN
262 # or _XOPEN_SOURCE_EXTENDED are defined or not.
264 # So this test doesn't work on Tru64 5.1, and possibly
265 # on other 5.x releases. This causes the configure
266 # script to become confused, and results in libpcap
269 AC_SEARCH_LIBS(getaddrinfo, socket, [dnl
270 AC_MSG_CHECKING(getaddrinfo bug)
271 AC_CACHE_VAL(td_cv_buggygetaddrinfo, [AC_TRY_RUN([
272 #include <sys/types.h>
275 #include <sys/socket.h>
276 #include <netinet/in.h>
280 int passive, gaierr, inet4 = 0, inet6 = 0;
281 struct addrinfo hints, *ai, *aitop;
282 char straddr[INET6_ADDRSTRLEN], strport[16];
284 for (passive = 0; passive <= 1; passive++) {
285 memset(&hints, 0, sizeof(hints));
286 hints.ai_family = AF_UNSPEC;
287 hints.ai_flags = passive ? AI_PASSIVE : 0;
288 hints.ai_socktype = SOCK_STREAM;
289 if ((gaierr = getaddrinfo(NULL, "54321", &hints, &aitop)) != 0) {
290 (void)gai_strerror(gaierr);
293 for (ai = aitop; ai; ai = ai->ai_next) {
294 if (ai->ai_addr == NULL ||
295 ai->ai_addrlen == 0 ||
296 getnameinfo(ai->ai_addr, ai->ai_addrlen,
297 straddr, sizeof(straddr), strport, sizeof(strport),
298 NI_NUMERICHOST|NI_NUMERICSERV) != 0) {
301 switch (ai->ai_family) {
303 if (strcmp(strport, "54321") != 0) {
307 if (strcmp(straddr, "0.0.0.0") != 0) {
311 if (strcmp(straddr, "127.0.0.1") != 0) {
318 if (strcmp(strport, "54321") != 0) {
322 if (strcmp(straddr, "::") != 0) {
326 if (strcmp(straddr, "::1") != 0) {
343 /* another family support? */
349 /* supported family should be 2, unsupported family should be 0 */
350 if (!(inet4 == 0 || inet4 == 2))
352 if (!(inet6 == 0 || inet6 == 2))
365 td_cv_buggygetaddrinfo=no,
366 td_cv_buggygetaddrinfo=yes,
367 td_cv_buggygetaddrinfo=yes)])
368 if test "$td_cv_buggygetaddrinfo" = no; then
374 if test "$td_cv_buggygetaddrinfo" = "yes"; then
376 # XXX - it doesn't appear that "ipv6type" can ever be
377 # set to "linux". Should this be testing for
378 # "linux-glibc", or for that *or* "linux-libinet6"?
379 # If the latter, note that "linux-libinet6" is also
380 # the type given to some non-Linux OSes.
382 if test "$ipv6type" != "linux"; then
383 echo 'Fatal: You must get working getaddrinfo() function.'
384 echo ' or you can specify "--disable-ipv6"'.
387 echo 'Warning: getaddrinfo() implementation on your system seems be buggy.'
388 echo ' Better upgrade your system library to newest version'
389 echo ' of GNU C library (aka glibc).'
393 AC_REPLACE_FUNCS(getaddrinfo getnameinfo)
395 dnl AC_TRY_COMPILE(inet_ntop inet_pton inet_aton)
396 AC_MSG_CHECKING(for inet_ntop)
397 AC_TRY_COMPILE([#include <sys/types.h>
398 #include <sys/socket.h>
399 #include <netinet/in.h>
400 #include <arpa/inet.h>], [char src[4], dst[128];
401 inet_ntop(AF_INET, src, dst, sizeof(dst));],
402 [AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no)
403 AC_REPLACE_FUNCS(inet_ntop)])
404 AC_MSG_CHECKING(for inet_pton)
405 AC_TRY_COMPILE([#include <sys/types.h>
406 #include <sys/socket.h>
407 #include <netinet/in.h>
408 #include <arpa/inet.h>], [char src[128], dst[4];
409 inet_pton(AF_INET, src, dst);],
410 [AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no)
411 AC_REPLACE_FUNCS(inet_pton)])
412 AC_MSG_CHECKING(for inet_aton)
413 AC_TRY_COMPILE([#include <sys/types.h>
414 #include <netinet/in.h>
415 #include <arpa/inet.h>], [char src[128];
417 inet_aton(src, &dst);],
418 [AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no)
419 AC_REPLACE_FUNCS(inet_aton)])
421 dnl portability macros for getaddrinfo/getnameinfo
424 AC_CHECK_SA_LEN(ac_cv_sockaddr_has_sa_len)
425 if test "$ac_cv_sockaddr_has_sa_len" = no; then
429 AC_CACHE_CHECK([for dnet_htoa declaration in netdnet/dnetdb.h],
430 [td_cv_decl_netdnet_dnetdb_h_dnet_htoa],
431 [AC_EGREP_HEADER(dnet_htoa, netdnet/dnetdb.h,
432 td_cv_decl_netdnet_dnetdb_h_dnet_htoa=yes,
433 td_cv_decl_netdnet_dnetdb_h_dnet_htoa=no)])
434 if test "$td_cv_decl_netdnet_dnetdb_h_dnet_htoa" = yes; then
435 AC_DEFINE(HAVE_NETDNET_DNETDB_H_DNET_HTOA)
439 dnl check sizeof basic types.
440 dnl They're very likely to be wrong for cross-compiling.
441 AC_CHECK_SIZEOF(char, 1)
442 AC_CHECK_SIZEOF(short, 2)
443 AC_CHECK_SIZEOF(int, 4)
444 AC_CHECK_SIZEOF(long, 4)
447 dnl Checks for u_intXX_t
448 dnl AC_CHECK_BITTYPES(ac_cv_bittypes)
449 dnl if test "$ac_cv_bittypes" = no; then
450 dnl missing_includes=yes
454 dnl Checks for addrinfo structure
455 AC_STRUCT_ADDRINFO(ac_cv_addrinfo)
456 if test "$ac_cv_addrinfo" = no; then
461 dnl Checks for NI_MAXSERV
462 AC_NI_MAXSERV(ac_cv_maxserv)
463 if test "$ac_cv_maxserv" = no; then
468 dnl Checks for NI_NAMEREQD
469 AC_NI_NAMEREQD(ac_cv_namereqd)
470 if test "$ac_cv_namereqd" = no; then
475 dnl Checks for sockaddr_storage structure
476 AC_STRUCT_SA_STORAGE(ac_cv_sa_storage)
477 if test "$ac_cv_sa_storage" = no; then
482 dnl Checks for IN[6]ADDRSZ
483 AC_CHECK_ADDRSZ(ac_cv_addrsz)
484 if test "$ac_cv_addrsz" = no; then
489 dnl Checks for RES_USE_INET6
490 AC_CHECK_RES_USE_INET6(ac_cv_res_inet6)
491 if test "$ac_cv_res_inet6" = no; then
496 dnl Checks for res_state_ext structure
497 AC_STRUCT_RES_STATE_EXT(ac_cv_res_state_ext)
498 if test "$ac_cv_res_state_ext" = no; then
503 dnl Checks if res_state structure has nsort member.
504 AC_STRUCT_RES_STATE(ac_cv_res_state)
507 dnl set additional include path if necessary
508 if test "$missing_includes" = "yes"; then
509 CPPFLAGS="$CPPFLAGS -I\$(srcdir)/missing"
510 V_INCLS="$V_INCLS -I\$(srcdir)/missing"
514 AC_REPLACE_FUNCS(vfprintf strcasecmp strlcat strlcpy strdup)
515 AC_CHECK_FUNCS(ether_ntohost, [
516 AC_CACHE_CHECK(for buggy ether_ntohost, ac_cv_buggy_ether_ntohost, [
519 #include <sys/types.h>
520 #include <sys/param.h>
521 #include <sys/socket.h>
524 main(int argc, char **argv)
526 u_char ea[6] = { 0xff, 0xff, 0xff, 0xff, 0xff };
527 char name[MAXHOSTNAMELEN];
529 ether_ntohost(name, (struct ether_addr *)ea);
532 ], [ac_cv_buggy_ether_ntohost=no],
533 [ac_cv_buggy_ether_ntohost=yes],
534 [ac_cv_buggy_ether_ntohost="not while cross-compiling"])])
535 if test "$ac_cv_buggy_ether_ntohost" = "no"; then
536 AC_DEFINE(USE_ETHER_NTOHOST)
539 AC_CHECK_FUNCS(setlinebuf)
542 AC_CHECK_FUNCS(vsnprintf snprintf,,
544 if test $needsnprintf = yes; then
545 LIBOBJS="$LIBOBJS snprintf.o"
550 AC_SEARCH_LIBS(dnet_htoa, dnet, AC_DEFINE(HAVE_DNET_HTOA))
552 AC_CHECK_LIB(rpc, main) dnl It's unclear why we might need -lrpc
554 dnl HP/UX may need -lnsl for getrpcbynumber.
555 AC_SEARCH_LIBS(getrpcbynumber, nsl)
557 dnl AC_CHECK_LIB(z, uncompress)
558 dnl AC_CHECK_HEADERS(zlib.h)
560 AC_LBL_LIBPCAP(V_PCAPDEP, V_INCLS)
562 AC_CHECK_FUNCS(pcap_findalldevs)
563 AC_REPLACE_FUNCS(bpf_dump) dnl moved to libpcap in 0.6
566 if test -f /etc/group -a ! -z "`grep '^wheel:' /etc/group`" ; then
572 dnl Workaround to enable certain features
589 if test -f /dev/bpf0 ; then
593 AC_LBL_CHECK_TYPE(u_int8_t, u_char)
594 AC_LBL_CHECK_TYPE(int16_t, short)
595 AC_LBL_CHECK_TYPE(u_int16_t, u_short)
596 AC_LBL_CHECK_TYPE(int32_t, int)
597 AC_LBL_CHECK_TYPE(u_int32_t, u_int)
599 AC_LBL_DEVEL(V_CCOPT)
601 AC_LBL_SOCKADDR_SA_LEN
603 AC_LBL_UNALIGNED_ACCESS
607 AC_ARG_WITH(crypto, [ --without-crypto disable crypto support],
609 AC_MSG_CHECKING(for SSLeay)
612 for dir in /usr/${host_alias} /usr /usr/local /usr/local/ssl /usr/pkg; do
613 if test -d $dir/lib -a -f $dir/lib/libcrypto.a; then
614 ac_cv_ssleay_path=$dir
616 if test -d $dir/include/openssl -a -f $dir/include/openssl/des.h; then
617 incdir="-I$dir/include"
619 if test "$ac_cv_ssleay_path" != "no" -a "$incdir" != "no"; then
626 AC_MSG_RESULT($ac_cv_ssleay_path)
627 if test "$ac_cv_ssleay_path" != no; then
628 V_INCLS="$V_INCLS $incdir"
629 LDFLAGS="-L$dir/lib $LDFLAGS"
630 if test -f $ac_cv_ssleay_path/lib/libRSAglue.a; then
631 LIBS="$LIBS -lRSAglue"
633 if test -f $ac_cv_ssleay_path/lib/librsaref.a; then
634 LIBS="$LIBS -lrsaref"
636 AC_CHECK_LIB(crypto, des_cbc_encrypt)
638 bak_CPPFLAGS=$CPPFLAGS
639 CPPFLAGS="$CPPFLAGS $V_INCLS"
640 AC_CHECK_HEADERS(openssl/cast.h)
642 if test "$ac_cv_header_openssl_cast_h" = "yes"; then
643 AC_MSG_CHECKING(for buggy CAST128)
644 AC_CACHE_VAL(td_cv_buggy_cast128, [AC_TRY_RUN(dnl
646 #include <openssl/cast.h>
649 unsigned char key[] = {0x01,0x23,0x45,0x67,0x12};
650 unsigned char in[] = {0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF};
651 unsigned char out[sizeof(in)];
652 unsigned char ok[] = {0x7A,0xC8,0x16,0xD1,0x6E,0x9B,0x30,0x2E};
654 CAST_set_key(&ks, sizeof(key), key);
655 CAST_ecb_encrypt(in, out, &ks, CAST_ENCRYPT);
656 if (memcmp(out, ok, sizeof(ok)) != 0)
661 [td_cv_buggy_cast128=yes],
662 [td_cv_buggy_cast128=no],
663 [td_cv_buggy_cast128="cross-compiling, assume yes"])])
664 AC_MSG_RESULT($td_cv_buggy_cast128)
665 if test "$td_cv_buggy_cast128" != no; then
666 echo "NOTE: SSLeay 0.9.0b has a bug in CAST128 en/decoding routine."
667 echo "disabling CAST128 support."
668 AC_DEFINE(HAVE_BUGGY_CAST128)
672 CPPFLAGS=$bak_CPPFLAGS
675 AC_CHECK_HEADERS(openssl/rc5.h)
685 AC_CONFIG_HEADER(config.h)
687 AC_OUTPUT_COMMANDS([if test -f .devel; then
688 echo timestamp > stamp-h
689 cat Makefile-devel-adds >> Makefile