nexmon – Rev 1

Subversion Repositories:
Rev:
dnl Copyright (c) 1994, 1995, 1996, 1997
dnl     The Regents of the University of California.  All rights reserved.
dnl
dnl Process this file with autoconf to produce a configure script.
dnl

#
# See
#
#       http://ftp.gnu.org/gnu/config/README
#
# for the URLs to use to fetch new versions of config.guess and
# config.sub.
#

AC_PREREQ(2.61)
AC_INIT(tcpdump.c)

AC_CANONICAL_HOST

AC_LBL_C_INIT_BEFORE_CC(V_INCLS)
AC_PROG_CC
AC_LBL_C_INIT(V_CCOPT, V_INCLS)
AC_LBL_C_INLINE
AC_C___ATTRIBUTE__
if test "$ac_cv___attribute__" = "yes"; then
        AC_C___ATTRIBUTE___UNUSED
        AC_C___ATTRIBUTE___NORETURN_FUNCTION_POINTER
        AC_C___ATTRIBUTE___FORMAT
        if test "$ac_cv___attribute___format" = "yes"; then
                AC_C___ATTRIBUTE___FORMAT_FUNCTION_POINTER
        fi
fi

AC_CHECK_HEADERS(fcntl.h rpc/rpc.h rpc/rpcent.h netdnet/dnetdb.h)
AC_CHECK_HEADERS(net/pfvar.h, , , [#include <sys/types.h>
#include <sys/socket.h>
#include <net/if.h>])
if test "$ac_cv_header_net_pfvar_h" = yes; then
        LOCALSRC="print-pflog.c $LOCALSRC"
fi
AC_CHECK_HEADERS(netinet/if_ether.h, , , [#include <sys/types.h>
#include <sys/socket.h>])
if test "$ac_cv_header_netinet_if_ether_h" != yes; then
        #
        # The simple test didn't work.
        # Do we need to include <net/if.h> first?
        # Unset ac_cv_header_netinet_if_ether_h so we don't
        # treat the previous failure as a cached value and
        # suppress the next test.
        #
        AC_MSG_NOTICE([Rechecking with some additional includes])
        unset ac_cv_header_netinet_if_ether_h
        AC_CHECK_HEADERS(netinet/if_ether.h, , , [#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
struct mbuf;
struct rtentry;
#include <net/if.h>])
fi

AC_HEADER_TIME

case "$host_os" in

darwin*)
        AC_ARG_ENABLE(universal,
        AC_HELP_STRING([--disable-universal],[don't build universal on OS X]))
        if test "$enable_universal" != "no"; then
                case "$host_os" in

                darwin9.*)
                        #
                        # Leopard.  Build for x86 and 32-bit PowerPC, with
                        # x86 first.  (That's what Apple does.)
                        #
                        V_CCOPT="$V_CCOPT -arch i386 -arch ppc"
                        LDFLAGS="$LDFLAGS -arch i386 -arch ppc"
                        ;;

                darwin10.*)
                        #
                        # Snow Leopard.  Build for x86-64 and x86, with
                        # x86-64 first.  (That's what Apple does.)
                        #
                        V_CCOPT="$V_CCOPT -arch x86_64 -arch i386"
                        LDFLAGS="$LDFLAGS -arch x86_64 -arch i386"
                        ;;
                esac
        fi
        ;;
esac


AC_ARG_WITH(smi,
[  --with-smi              link with libsmi (allows to load MIBs on the fly to decode SNMP packets. [default=yes]
  --without-smi           don't link with libsmi],,
   with_smi=yes)

if test "x$with_smi" != "xno" ; then
        AC_CHECK_HEADER(smi.h,
        [
                #
                # OK, we found smi.h.  Do we have libsmi with smiInit?
                #
                AC_CHECK_LIB(smi, smiInit,
                [
                        #
                        # OK, we have libsmi with smiInit.  Can we use it?
                        #
                        AC_MSG_CHECKING([whether to enable libsmi])
                        savedlibs="$LIBS"
                        LIBS="-lsmi $LIBS"
                        AC_TRY_RUN(
                                [
/* libsmi available check */
#include <smi.h>
main()
{
  int current, revision, age, n;
  const int required = 2;
  if (smiInit(""))
    exit(1);
  if (strcmp(SMI_LIBRARY_VERSION, smi_library_version))
    exit(2);
  n = sscanf(smi_library_version, "%d:%d:%d", &current, &revision, &age);
  if (n != 3)
    exit(3);
  if (required < current - age || required > current)
    exit(4);
  exit(0);
}
                                ],
                                [
                                        AC_MSG_RESULT(yes)
                                        AC_DEFINE(USE_LIBSMI, 1,
                                            [Define if you enable support for libsmi])
                                ],
                                [
                                        dnl autoconf documentation says that
                                        dnl $? contains the exit value.
                                        dnl reality is that it does not.
                                        dnl We leave this in just in case
                                        dnl autoconf ever comes back to
                                        dnl match the documentation.
                                        case $? in
                                          1) AC_MSG_RESULT(no - smiInit failed) ;;
                                          2) AC_MSG_RESULT(no - header/library version mismatch) ;;
                                          3) AC_MSG_RESULT(no - can't determine library version) ;;
                                          4) AC_MSG_RESULT(no - too old) ;;
                                          *) AC_MSG_RESULT(no) ;;
                                        esac
                                        LIBS="$savedlibs"
                                ],
                                [
                                        AC_MSG_RESULT(not when cross-compiling)
                                        LIBS="$savedlibs"
                                ]
                        )
                ])
        ])
fi

AC_MSG_CHECKING([whether to enable the possibly-buggy SMB printer])
AC_ARG_ENABLE(smb,
[  --enable-smb            enable possibly-buggy SMB printer [default=yes]
  --disable-smb           disable possibly-buggy SMB printer],,
   enableval=yes)
case "$enableval" in
yes)    AC_MSG_RESULT(yes)
        AC_WARN([The SMB printer may have exploitable buffer overflows!!!])
        AC_DEFINE(TCPDUMP_DO_SMB, 1,
            [define if you want to build the possibly-buggy SMB printer])
        LOCALSRC="print-smb.c smbutil.c $LOCALSRC"
        ;;
*)      AC_MSG_RESULT(no)
        ;;
esac

AC_ARG_WITH(user, [  --with-user=USERNAME    drop privileges by default to USERNAME])
AC_MSG_CHECKING([whether to drop root privileges by default])
if test ! -z "$with_user" ; then
       AC_DEFINE_UNQUOTED(WITH_USER, "$withval",
           [define if should drop privileges by default])
       AC_MSG_RESULT(to \"$withval\")
else
       AC_MSG_RESULT(no)
fi

AC_ARG_WITH(chroot, [  --with-chroot=DIRECTORY when dropping privileges, chroot to DIRECTORY])
AC_MSG_CHECKING([whether to chroot])
if test ! -z "$with_chroot" && test "$with_chroot" != "no" ; then
       AC_DEFINE_UNQUOTED(WITH_CHROOT, "$withval",
           [define if should chroot when dropping privileges])
       AC_MSG_RESULT(to \"$withval\")
else
       AC_MSG_RESULT(no)
fi

AC_ARG_WITH(sandbox-capsicum,
        AS_HELP_STRING([--with-sandbox-capsicum],
                       [use Capsicum security functions @<:@default=yes, if available@:>@]))
#
# Check whether various functions are available.  If any are, set
# ac_lbl_capsicum_function_seen to yes; if any are not, set
# ac_lbl_capsicum_function_not_seen to yes.
#
# We don't check cap_rights_init(), as it's a macro, wrapping another
# function, in at least some versions of FreeBSD, and AC_CHECK_FUNCS()
# doesn't handle that.
#
# All of the ones we check for must be available in order to enable
# capsicum sandboxing.
#
# XXX - do we need to check for all of them, or are there some that, if
# present, imply others are present?
#
if test ! -z "$with_sandbox-capsicum" && test "$with_sandbox-capsicum" != "no" ; then
        AC_CHECK_FUNCS(cap_enter cap_rights_limit cap_ioctls_limit openat,
            ac_lbl_capsicum_function_seen=yes,
            ac_lbl_capsicum_function_not_seen=yes)
fi
AC_MSG_CHECKING([whether to sandbox using capsicum])
if test "x$ac_lbl_capsicum_function_seen" = "xyes" -a "x$ac_lbl_capsicum_function_not_seen" != "xyes"; then
        AC_DEFINE(HAVE_CAPSICUM, 1, [capsicum support available])
        AC_MSG_RESULT(yes)
else
        AC_MSG_RESULT(no)
fi

#
# We must check this before checking whether to enable IPv6, because,
# on some platforms (such as SunOS 5.x), the test program requires
# the extra networking libraries.
#
AC_LBL_LIBRARY_NET

AC_MSG_CHECKING([whether to enable ipv6])
AC_ARG_ENABLE(ipv6,
[  --enable-ipv6           enable ipv6 (with ipv4) support
  --disable-ipv6          disable ipv6 support],
[ case "$enableval" in
yes)   AC_MSG_RESULT(yes)
       LOCALSRC="print-ip6opts.c print-mobility.c print-ripng.c print-icmp6.c print-frag6.c print-rt6.c print-ospf6.c print-dhcp6.c print-babel.c $LOCALSRC"
       AC_DEFINE(INET6, 1, [Define if you enable IPv6 support])
       ipv6=yes
       ;;
*)
       AC_MSG_RESULT(no)
       ipv6=no
       ;;
  esac ],

  AC_COMPILE_IFELSE(
    [
      AC_LANG_SOURCE(
        [[/* AF_INET6 available check */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#ifdef AF_INET6
void
foo(struct in6_addr *addr)
{
 memset(addr, 0, sizeof (struct in6_addr));
}
#else
#error "AF_INET6 not defined"
#endif
        ]])
    ],
[ AC_MSG_RESULT(yes)
  LOCALSRC="print-ip6opts.c print-mobility.c print-ripng.c print-icmp6.c print-frag6.c print-rt6.c print-ospf6.c print-dhcp6.c print-babel.c $LOCALSRC"
  AC_DEFINE(INET6, 1, [Define if you enable IPv6 support])
  ipv6=yes],
[ AC_MSG_RESULT(no)
  ipv6=no],
[ AC_MSG_RESULT(no)
  ipv6=no]
))

ipv6type=unknown
ipv6lib=none
ipv6trylibc=no

if test "$ipv6" = "yes"; then
        AC_MSG_CHECKING([ipv6 stack type])
        for i in inria kame linux-glibc linux-libinet6 toshiba v6d zeta; do
                case $i in
                inria)
                        dnl http://www.kame.net/
                        AC_EGREP_CPP(yes,
[#include <netinet/in.h>
#ifdef IPV6_INRIA_VERSION
yes
#endif],
                                [ipv6type=$i;
                                CFLAGS="-DINET6 $CFLAGS"])
                        ;;
                kame)
                        dnl http://www.kame.net/
                        AC_EGREP_CPP(yes,
[#include <netinet/in.h>
#ifdef __KAME__
yes
#endif],
                                [ipv6type=$i;
                                ipv6lib=inet6;
                                ipv6libdir=/usr/local/v6/lib;
                                ipv6trylibc=yes;
                                CFLAGS="-DINET6 $CFLAGS"])
                        ;;
                linux-glibc)
                        dnl http://www.v6.linux.or.jp/
                        AC_EGREP_CPP(yes,
[#include <features.h>
#if defined(__GLIBC__) && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1
yes
#endif],
                                [ipv6type=$i;
                                CFLAGS="-DINET6 $CFLAGS"])
                        ;;
                linux-libinet6)
                        dnl http://www.v6.linux.or.jp/
                        dnl
                        dnl This also matches Solaris 8 and Tru64 UNIX 5.1,
                        dnl and possibly other versions of those OSes
                        dnl
                        if test -d /usr/inet6 -o -f /usr/include/netinet/ip6.h; then
                                ipv6type=$i
                                ipv6lib=inet6
                                ipv6libdir=/usr/inet6/lib
                                ipv6trylibc=yes;
                                CFLAGS="-DINET6 -I/usr/inet6/include $CFLAGS"
                        fi
                        ;;
                toshiba)
                        AC_EGREP_CPP(yes,
[#include <sys/param.h>
#ifdef _TOSHIBA_INET6
yes
#endif],
                                [ipv6type=$i;
                                ipv6lib=inet6;
                                ipv6libdir=/usr/local/v6/lib;
                                CFLAGS="-DINET6 $CFLAGS"])
                        ;;
                v6d)
                        AC_EGREP_CPP(yes,
[#include </usr/local/v6/include/sys/v6config.h>
#ifdef __V6D__
yes
#endif],
                                [ipv6type=$i;
                                ipv6lib=v6;
                                ipv6libdir=/usr/local/v6/lib;
                                CFLAGS="-I/usr/local/v6/include $CFLAGS"])
                        ;;
                zeta)
                        AC_EGREP_CPP(yes,
[#include <sys/param.h>
#ifdef _ZETA_MINAMI_INET6
yes
#endif],
                                [ipv6type=$i;
                                ipv6lib=inet6;
                                ipv6libdir=/usr/local/v6/lib;
                                CFLAGS="-DINET6 $CFLAGS"])
                        ;;
                esac
                if test "$ipv6type" != "unknown"; then
                        break
                fi
        done
        AC_MSG_RESULT($ipv6type)
fi

if test "$ipv6" = "yes" -a "$ipv6lib" != "none"; then
        if test -d $ipv6libdir -a -f $ipv6libdir/lib$ipv6lib.a; then
                LIBS="-L$ipv6libdir -l$ipv6lib $LIBS"
                echo "You have $ipv6lib library, using it"
        else
                if test "$ipv6trylibc" = "yes"; then
                        echo "You do not have $ipv6lib library, using libc"
                else
                        echo 'Fatal: no $ipv6lib library found.  cannot continue.'
                        echo "You need to fetch lib$ipv6lib.a from appropriate"
                        echo 'ipv6 kit and compile beforehand.'
                        exit 1
                fi
        fi
fi


if test "$ipv6" = "yes"; then
        #
        # XXX - on Tru64 UNIX 5.1, there is no "getaddrinfo()"
        # function in libc; there are "ngetaddrinfo()" and
        # "ogetaddrinfo()" functions, and <netdb.h> #defines
        # "getaddrinfo" to be either "ngetaddrinfo" or
        # "ogetaddrinfo", depending on whether _SOCKADDR_LEN
        # or _XOPEN_SOURCE_EXTENDED are defined or not.
        #
        # So this test doesn't work on Tru64 5.1, and possibly
        # on other 5.x releases.  This causes the configure
        # script to become confused, and results in libpcap
        # being unbuildable.
        #
        AC_SEARCH_LIBS(getaddrinfo, socket, [dnl
        AC_MSG_CHECKING(getaddrinfo bug)
        AC_CACHE_VAL(td_cv_buggygetaddrinfo, [AC_TRY_RUN([
#include <sys/types.h>
#include <netdb.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>

main()
{
  int passive, gaierr, inet4 = 0, inet6 = 0;
  struct addrinfo hints, *ai, *aitop;
  char straddr[INET6_ADDRSTRLEN], strport[16];

  for (passive = 0; passive <= 1; passive++) {
    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_UNSPEC;
    hints.ai_flags = passive ? AI_PASSIVE : 0;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    if ((gaierr = getaddrinfo(NULL, "54321", &hints, &aitop)) != 0) {
      (void)gai_strerror(gaierr);
      goto bad;
    }
    for (ai = aitop; ai; ai = ai->ai_next) {
      if (ai->ai_addr == NULL ||
          ai->ai_addrlen == 0 ||
          getnameinfo(ai->ai_addr, ai->ai_addrlen,
                      straddr, sizeof(straddr), strport, sizeof(strport),
                      NI_NUMERICHOST|NI_NUMERICSERV) != 0) {
        goto bad;
      }
      switch (ai->ai_family) {
      case AF_INET:
        if (strcmp(strport, "54321") != 0) {
          goto bad;
        }
        if (passive) {
          if (strcmp(straddr, "0.0.0.0") != 0) {
            goto bad;
          }
        } else {
          if (strcmp(straddr, "127.0.0.1") != 0) {
            goto bad;
          }
        }
        inet4++;
        break;
      case AF_INET6:
        if (strcmp(strport, "54321") != 0) {
          goto bad;
        }
        if (passive) {
          if (strcmp(straddr, "::") != 0) {
            goto bad;
          }
        } else {
          if (strcmp(straddr, "::1") != 0) {
            goto bad;
          }
        }
        inet6++;
        break;
      case AF_UNSPEC:
        goto bad;
        break;
#ifdef AF_UNIX
      case AF_UNIX:
#else
#ifdef AF_LOCAL
      case AF_LOCAL:
#endif
#endif
      default:
        /* another family support? */
        break;
      }
    }
  }

  /* supported family should be 2, unsupported family should be 0 */
  if (!(inet4 == 0 || inet4 == 2))
    goto bad;
  if (!(inet6 == 0 || inet6 == 2))
    goto bad;

  if (aitop)
    freeaddrinfo(aitop);
  exit(0);

 bad:
  if (aitop)
    freeaddrinfo(aitop);
  exit(1);
}
],
        td_cv_buggygetaddrinfo=no,
        td_cv_buggygetaddrinfo=yes,
        td_cv_buggygetaddrinfo=unknown)])
        if test "$td_cv_buggygetaddrinfo" = no; then
                AC_MSG_RESULT(good)
        elif test "$td_cv_buggygetaddrinfo" = unknown; then
                AC_MSG_RESULT([unknown (cross-compiling)])
        else
                AC_MSG_RESULT(buggy)
        fi

        if test "$td_cv_buggygetaddrinfo" = "yes"; then
                #
                # XXX - it doesn't appear that "ipv6type" can ever be
                # set to "linux".  Should this be testing for
                # "linux-glibc", or for that *or* "linux-libinet6"?
                # If the latter, note that "linux-libinet6" is also
                # the type given to some non-Linux OSes.
                #
                if test "$ipv6type" != "linux"; then
                        echo 'Fatal: You must get working getaddrinfo() function.'
                        echo '       or you can specify "--disable-ipv6"'.
                        exit 1
                else
                        echo 'Warning: getaddrinfo() implementation on your system seems be buggy.'
                        echo '         Better upgrade your system library to newest version'
                        echo '         of GNU C library (aka glibc).'
                fi
        fi
        ])
        AC_REPLACE_FUNCS(getnameinfo)
fi

AC_CACHE_CHECK([for dnet_htoa declaration in netdnet/dnetdb.h],
[td_cv_decl_netdnet_dnetdb_h_dnet_htoa],
[AC_EGREP_HEADER(dnet_htoa, netdnet/dnetdb.h,
        td_cv_decl_netdnet_dnetdb_h_dnet_htoa=yes,
        td_cv_decl_netdnet_dnetdb_h_dnet_htoa=no)])
if test "$td_cv_decl_netdnet_dnetdb_h_dnet_htoa" = yes; then
        AC_DEFINE(HAVE_NETDNET_DNETDB_H_DNET_HTOA, 1,
            [define if you have a dnet_htoa declaration in <netdnet/dnetdb.h>])
fi

dnl
dnl Checks for addrinfo structure
AC_STRUCT_ADDRINFO(ac_cv_addrinfo)
if test "$ac_cv_addrinfo" = no; then
        missing_includes=yes
fi

dnl
dnl Checks for NI_MAXSERV
AC_NI_MAXSERV(ac_cv_maxserv)
if test "$ac_cv_maxserv" = no; then
        missing_includes=yes
fi

dnl
dnl Checks for NI_NAMEREQD
AC_NI_NAMEREQD(ac_cv_namereqd)
if test "$ac_cv_namereqd" = no; then
        missing_includes=yes
fi

AC_REPLACE_FUNCS(vfprintf strcasecmp strlcat strlcpy strdup strsep getopt_long)
AC_CHECK_FUNCS(fork vfork strftime)
AC_CHECK_FUNCS(setlinebuf alarm)

needsnprintf=no
AC_CHECK_FUNCS(vsnprintf snprintf,,
        [needsnprintf=yes])
if test $needsnprintf = yes; then
        AC_LIBOBJ(snprintf)
fi

AC_LBL_TYPE_SIGNAL

AC_SEARCH_LIBS(dnet_htoa, dnet,
    AC_DEFINE(HAVE_DNET_HTOA, 1, [define if you have the dnet_htoa function]))

AC_CHECK_LIB(rpc, main)         dnl It's unclear why we might need -lrpc

dnl Some platforms may need -lnsl for getrpcbynumber.
AC_SEARCH_LIBS(getrpcbynumber, nsl,
    AC_DEFINE(HAVE_GETRPCBYNUMBER, 1, [define if you have getrpcbynumber()]))

dnl AC_CHECK_LIB(z, uncompress)
dnl AC_CHECK_HEADERS(zlib.h)

AC_LBL_LIBPCAP(V_PCAPDEP, V_INCLS)

#
# Check for these after AC_LBL_LIBPCAP, so we link with the appropriate
# libraries (e.g., "-lsocket -lnsl" on Solaris).
#
# We don't use AC_REPLACE_FUNCS because that uses AC_CHECK_FUNCS which
# use AC_CHECK_FUNC which doesn't let us specify the right #includes
# to make this work on BSD/OS 4.x.  BSD/OS 4.x ships with the BIND8
# resolver, and the way it defines inet_{ntop,pton} is rather strange;
# it does not ship with a libc symbol "inet_ntop()", it ships with
# "_inet_ntop()", and has a #define macro in one of the system headers
# to rename it.
#
dnl AC_TRY_COMPILE(inet_ntop inet_pton inet_aton)
AC_MSG_CHECKING(for inet_ntop)
AC_TRY_LINK([#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>], [char src[4], dst[128];
inet_ntop(AF_INET, src, dst, sizeof(dst));],
        [AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no)
        AC_LIBOBJ(inet_ntop)])
AC_MSG_CHECKING(for inet_pton)
AC_TRY_LINK([#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>], [char src[128], dst[4];
inet_pton(AF_INET, src, dst);],
        [AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no)
        AC_LIBOBJ(inet_pton)])
AC_MSG_CHECKING(for inet_aton)
AC_TRY_LINK([#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>], [char src[128];
struct in_addr dst;
inet_aton(src, &dst);],
        [AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no)
        AC_LIBOBJ(inet_aton)])

#
# Check for these after AC_LBL_LIBPCAP, for the same reason.
#
# You are in a twisty little maze of UN*Xes, all different.
# Some might not have ether_ntohost().
# Some might have it, but not declare it in any header file.
# Some might have it, but declare it in <netinet/if_ether.h>.
# Some might have it, but declare it in <netinet/ether.h>
# (And some might have it but document it as something declared in
# <netinet/ethernet.h>, although <netinet/if_ether.h> appears to work.)
#
# Before you is a C compiler.
#
AC_CHECK_FUNCS(ether_ntohost, [
    AC_CACHE_CHECK(for buggy ether_ntohost, ac_cv_buggy_ether_ntohost, [
        AC_TRY_RUN([
                #include <netdb.h>
                #include <sys/types.h>
                #include <sys/param.h>
                #include <sys/socket.h>

                int
                main(int argc, char **argv)
                {
                        u_char ea[6] = { 0xff, 0xff, 0xff, 0xff, 0xff };
                        char name[MAXHOSTNAMELEN];

                        ether_ntohost(name, (struct ether_addr *)ea);
                        exit(0);
                }
        ], [ac_cv_buggy_ether_ntohost=no],
           [ac_cv_buggy_ether_ntohost=yes],
           [ac_cv_buggy_ether_ntohost="not while cross-compiling"])])
    if test "$ac_cv_buggy_ether_ntohost" = "no"; then
        AC_DEFINE(USE_ETHER_NTOHOST, 1,
            [define if you have ether_ntohost() and it works])
    fi
])
if test "$ac_cv_func_ether_ntohost" = yes -a \
    "$ac_cv_buggy_ether_ntohost" = "no"; then
        #
        # OK, we have ether_ntohost().  Do we have <netinet/if_ether.h>?
        #
        if test "$ac_cv_header_netinet_if_ether_h" = yes; then
                #
                # Yes.  Does it declare ether_ntohost()?
                #
                AC_CHECK_DECL(ether_ntohost,
                    [
                        AC_DEFINE(NETINET_IF_ETHER_H_DECLARES_ETHER_NTOHOST,,
                            [Define to 1 if netinet/if_ether.h declares `ether_ntohost'])
                    ],,
                    [
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
struct mbuf;
struct rtentry;
#include <net/if.h>
#include <netinet/if_ether.h>
                    ])
        fi
        #
        # Did that succeed?
        #
        if test "$ac_cv_have_decl_ether_ntohost" != yes; then
                #
                # No, how about <netinet/ether.h>, as on Linux?
                #
                AC_CHECK_HEADERS(netinet/ether.h)
                if test "$ac_cv_header_netinet_ether_h" = yes; then
                        #
                        # We have it - does it declare ether_ntohost()?
                        # Unset ac_cv_have_decl_ether_ntohost so we don't
                        # treat the previous failure as a cached value and
                        # suppress the next test.
                        #
                        unset ac_cv_have_decl_ether_ntohost
                        AC_CHECK_DECL(ether_ntohost,
                            [
                                AC_DEFINE(NETINET_ETHER_H_DECLARES_ETHER_NTOHOST,,
                                    [Define to 1 if netinet/ether.h declares `ether_ntohost'])
                            ],,
                            [
#include <netinet/ether.h>
                            ])
                fi
        fi
        #
        # Is ether_ntohost() declared?
        #
        if test "$ac_cv_have_decl_ether_ntohost" != yes; then
                #
                # No, we'll have to declare it ourselves.
                # Do we have "struct ether_addr"?
                #
                AC_CHECK_TYPES(struct ether_addr,,,
                    [
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
struct mbuf;
struct rtentry;
#include <net/if.h>
#include <netinet/if_ether.h>
                    ])
                AC_DEFINE(HAVE_DECL_ETHER_NTOHOST, 0,
                    [Define to 1 if you have the declaration of `ether_ntohost', and to 0 if you
don't.])
        else
                AC_DEFINE(HAVE_DECL_ETHER_NTOHOST, 1,
                    [Define to 1 if you have the declaration of `ether_ntohost', and to 0 if you
don't.])
        fi
fi

# libdlpi is needed for Solaris 11 and later.
AC_CHECK_LIB(dlpi, dlpi_walk, LIBS="$LIBS -ldlpi" LDFLAGS="-L/lib $LDFLAGS", ,-L/lib)

dnl portability macros for getaddrinfo/getnameinfo
dnl
dnl Check for sa_len
AC_CHECK_SA_LEN(ac_cv_sockaddr_has_sa_len)
if test "$ac_cv_sockaddr_has_sa_len" = no; then
        missing_includes=yes
fi

dnl
dnl Check for "pcap_list_datalinks()", "pcap_set_datalink()",
dnl and "pcap_datalink_name_to_val()", and use substitute versions
dnl if they're not present.
dnl
AC_CHECK_FUNC(pcap_list_datalinks,
        [
            AC_DEFINE(HAVE_PCAP_LIST_DATALINKS, 1,
                [define if libpcap has pcap_list_datalinks()])
            AC_CHECK_FUNCS(pcap_free_datalinks)
        ],
        [
            AC_LIBOBJ(datalinks)
        ])
AC_CHECK_FUNCS(pcap_set_datalink)
AC_CHECK_FUNC(pcap_datalink_name_to_val,
        [
            AC_DEFINE(HAVE_PCAP_DATALINK_NAME_TO_VAL, 1,
                [define if libpcap has pcap_datalink_name_to_val()])
            AC_CHECK_FUNC(pcap_datalink_val_to_description,
                AC_DEFINE(HAVE_PCAP_DATALINK_VAL_TO_DESCRIPTION, 1,
                    [define if libpcap has pcap_datalink_val_to_description()]),
                [
                    AC_LIBOBJ(dlnames)
                ])
        ],
        [
            AC_LIBOBJ(dlnames)
        ])

dnl
dnl Check for "pcap_breakloop()"; you can't substitute for it if
dnl it's absent (it has hooks into the live capture routines),
dnl so just define the HAVE_ value if it's there.
dnl
AC_CHECK_FUNCS(pcap_breakloop)

dnl
dnl Check for "pcap_dump_ftell()" and use a substitute version
dnl if it's not present.
dnl
AC_CHECK_FUNC(pcap_dump_ftell,
        AC_DEFINE(HAVE_PCAP_DUMP_FTELL, 1,
            [define if libpcap has pcap_dump_ftell()]),
        [
            AC_LIBOBJ(pcap_dump_ftell)
        ])

#
# Do we have the new open API?  Check for pcap_create, and assume that,
# if we do, we also have pcap_activate() and the other new routines
# introduced in libpcap 1.0.0.
#
AC_CHECK_FUNCS(pcap_create)
if test $ac_cv_func_pcap_create = "yes" ; then
        #
        # OK, do we have pcap_set_tstamp_type?  If so, assume we have
        # pcap_list_tstamp_types and pcap_free_tstamp_types as well.
        #
        AC_CHECK_FUNCS(pcap_set_tstamp_type)
        #
        # And do we have pcap_set_tstamp_precision?  If so, we assume
        # we also have pcap_open_offline_with_tstamp_precision.
        #
        AC_CHECK_FUNCS(pcap_set_tstamp_precision)
fi

#
# Check for a miscellaneous collection of functions which we use
# if we have them.
#
AC_CHECK_FUNCS(pcap_findalldevs pcap_dump_flush pcap_lib_version pcap_setdirection pcap_set_immediate_mode)
if test $ac_cv_func_pcap_findalldevs = "yes" ; then
dnl Check for Mac OS X, which may ship pcap.h from 0.6 but libpcap may
dnl be 0.8; this means that lib has pcap_findalldevs but header doesn't
dnl have pcap_if_t.
    savedcppflags="$CPPFLAGS"
    CPPFLAGS="$CPPFLAGS $V_INCLS"
    AC_CHECK_TYPES(pcap_if_t, , , [#include <pcap.h>])
    CPPFLAGS="$savedcppflags"
fi

if test $ac_cv_func_pcap_lib_version = "no" ; then
    AC_MSG_CHECKING(whether pcap_version is defined by libpcap)
    AC_TRY_LINK([],
       [
        extern char pcap_version[];

        return (int)pcap_version;
       ],
       ac_lbl_cv_pcap_version_defined=yes,
       ac_lbl_cv_pcap_version_defined=no)
    if test "$ac_lbl_cv_pcap_version_defined" = yes ; then
        AC_MSG_RESULT(yes)
        AC_DEFINE(HAVE_PCAP_VERSION, 1, [define if libpcap has pcap_version])
    else
        AC_MSG_RESULT(no)
    fi
fi
AC_MSG_CHECKING(whether pcap_debug is defined by libpcap)
AC_TRY_LINK([],
   [
        extern int pcap_debug;

        return pcap_debug;
   ],
   ac_lbl_cv_pcap_debug_defined=yes,
   ac_lbl_cv_pcap_debug_defined=no)
if test "$ac_lbl_cv_pcap_debug_defined" = yes ; then
        AC_MSG_RESULT(yes)
        AC_DEFINE(HAVE_PCAP_DEBUG, 1, [define if libpcap has pcap_debug])
else
        AC_MSG_RESULT(no)
        #
        # OK, what about "yydebug"?
        #
        AC_MSG_CHECKING(whether yydebug is defined by libpcap)
        AC_TRY_LINK([],
           [
                extern int yydebug;

                return yydebug;
           ],
           ac_lbl_cv_yydebug_defined=yes,
           ac_lbl_cv_yydebug_defined=no)
        if test "$ac_lbl_cv_yydebug_defined" = yes ; then
                AC_MSG_RESULT(yes)
                AC_DEFINE(HAVE_YYDEBUG, 1, [define if libpcap has yydebug])
        else
                AC_MSG_RESULT(no)
        fi
fi
AC_REPLACE_FUNCS(bpf_dump)      dnl moved to libpcap in 0.6

V_GROUP=0
if test -f /etc/group -a ! -z "`grep '^wheel:' /etc/group`" ; then
        V_GROUP=wheel
fi
#
# Assume V7/BSD convention for man pages (file formats in section 5,
# miscellaneous info in section 7).
#
MAN_FILE_FORMATS=5
MAN_MISC_INFO=7
case "$host_os" in

aix*)
        dnl Workaround to enable certain features
        AC_DEFINE(_SUN,1,[define on AIX to get certain functions])
        ;;

hpux*)
        #
        # Use System V conventions for man pages.
        #
        MAN_FILE_FORMATS=4
        MAN_MISC_INFO=5
        ;;

irix*)
        V_GROUP=sys

        #
        # Use System V conventions for man pages.
        #
        MAN_FILE_FORMATS=4
        MAN_MISC_INFO=5
        ;;

osf*)
        V_GROUP=system

        #
        # Use System V conventions for man pages.
        #
        MAN_FILE_FORMATS=4
        MAN_MISC_INFO=5
        ;;

solaris*)
        V_GROUP=sys

        #
        # Use System V conventions for man pages.
        #
        MAN_FILE_FORMATS=4
        MAN_MISC_INFO=5
        ;;
esac

if test -f /dev/bpf0 ; then
        V_GROUP=bpf
fi

#
# Make sure we have definitions for all the C99 specified-width types
# (regardless of whether the environment is a C99 environment or not).
#
AC_TYPE_INT8_T
AC_TYPE_INT16_T
AC_TYPE_INT32_T
AC_TYPE_INT64_T
AC_TYPE_UINT8_T
AC_TYPE_UINT16_T
AC_TYPE_UINT32_T
AC_TYPE_UINT64_T

#
# Make sure we have a definition for C99's uintptr_t (regardless of
# whether the environment is a C99 environment or not).
#
AC_TYPE_UINTPTR_T

#
# Define the old BSD specified-width types in terms of the C99 types;
# we may need them with libpcap include files.
#
AC_CHECK_TYPE([u_int8_t], ,
        [AC_DEFINE([u_int8_t], [uint8_t],
        [Define to `uint8_t' if u_int8_t not defined.])],
        [AC_INCLUDES_DEFAULT
#include <sys/types.h>
])
AC_CHECK_TYPE([u_int16_t], ,
        [AC_DEFINE([u_int16_t], [uint16_t],
        [Define to `uint16_t' if u_int16_t not defined.])],
        [AC_INCLUDES_DEFAULT
#include <sys/types.h>
])
AC_CHECK_TYPE([u_int32_t], ,
        [AC_DEFINE([u_int32_t], [uint32_t],
        [Define to `uint32_t' if u_int32_t not defined.])],
        [AC_INCLUDES_DEFAULT
#include <sys/types.h>
])
AC_CHECK_TYPE([u_int64_t], ,
        [AC_DEFINE([u_int64_t], [uint64_t],
        [Define to `uint64_t' if u_int64_t not defined.])],
        [AC_INCLUDES_DEFAULT
#include <sys/types.h>
])

#
# Check for <inttypes.h>
#
AC_CHECK_HEADERS(inttypes.h,
  [
    #
    # OK, we have inttypes.h, but does it define all the PRI[doxu]64 macros?
    # Some systems have an inttypes.h that doesn't define all of them.
    #
    AC_MSG_CHECKING([[whether inttypes.h defines the PRI[doxu]64 macros]])
    AC_COMPILE_IFELSE(
      [
        AC_LANG_SOURCE(
          [[
            #include <inttypes.h>
            #include <stdio.h>
            #include <sys/types.h>

            main()
            {
              printf("%" PRId64 "\n", (uint64_t)1);
              printf("%" PRIo64 "\n", (uint64_t)1);
              printf("%" PRIx64 "\n", (uint64_t)1);
              printf("%" PRIu64 "\n", (uint64_t)1);
            }
          ]])
      ],
      [
        AC_MSG_RESULT(yes)
        ac_lbl_inttypes_h_defines_formats=yes
      ],
      [
        AC_MSG_RESULT(no)
        ac_lbl_inttypes_h_defines_formats=no
      ])
  ],
  [
    #
    # We don't have inttypes.h, so it obviously can't define those
    # macros.
    #
    ac_lbl_inttypes_h_defines_formats=no
  ])
if test "$ac_lbl_inttypes_h_defines_formats" = no; then
  AC_LBL_CHECK_64BIT_FORMAT(l,
    [
      AC_LBL_CHECK_64BIT_FORMAT(ll,
        [
          AC_LBL_CHECK_64BIT_FORMAT(L,
            [
              AC_LBL_CHECK_64BIT_FORMAT(q,
                [
                  AC_MSG_ERROR([neither %llx nor %Lx nor %qx worked on a 64-bit integer])
                ])
            ])
        ])
    ])
fi

#
# Check for some headers introduced in later versions of libpcap
# and used by some printers.
#
# Those headers use the {u_}intN_t types, so we must do this after
# we check for what's needed to get them defined.
#
savedcppflags="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $V_INCLS"
AC_CHECK_HEADERS(pcap/bluetooth.h,,,[#include "tcpdump-stdinc.h"])
AC_CHECK_HEADERS(pcap/nflog.h,,,[#include "tcpdump-stdinc.h"])
AC_CHECK_HEADERS(pcap/usb.h,,,[#include "tcpdump-stdinc.h"])
CPPFLAGS="$savedcppflags"

AC_PROG_RANLIB
AC_CHECK_TOOL([AR], [ar])

AC_LBL_DEVEL(V_CCOPT)

AC_LBL_SOCKADDR_SA_LEN

AC_LBL_UNALIGNED_ACCESS

AC_VAR_H_ERRNO

# Check for OpenSSL libcrypto
AC_MSG_CHECKING(whether to use OpenSSL libcrypto)
# Specify location for both includes and libraries.
want_libcrypto=ifavailable
AC_ARG_WITH(crypto,
    AS_HELP_STRING([--with-crypto],
                   [use OpenSSL libcrypto @<:@default=yes, if available@:>@]),
[
        if test $withval = no
        then
                want_libcrypto=no
                AC_MSG_RESULT(no)
        elif test $withval = yes
        then
                want_libcrypto=yes
                AC_MSG_RESULT(yes)
        fi
],[
        #
        # Use libcrypto if it's present, otherwise don't.
        #
        want_libcrypto=ifavailable
        AC_MSG_RESULT([yes, if available])
])
if test "$want_libcrypto" != "no"; then
        AC_CHECK_LIB(crypto, DES_cbc_encrypt)
        AC_CHECK_HEADERS(openssl/evp.h)
fi

# Check for libcap-ng
AC_MSG_CHECKING(whether to use libcap-ng)
# Specify location for both includes and libraries.
want_libcap_ng=ifavailable
AC_ARG_WITH(cap_ng,
    AS_HELP_STRING([--with-cap-ng],
                   [use libcap-ng @<:@default=yes, if available@:>@]),
[
        if test $withval = no
        then
                want_libcap_ng=no
                AC_MSG_RESULT(no)
        elif test $withval = yes
        then
                want_libcap_ng=yes
                AC_MSG_RESULT(yes)
        fi
],[
        #
        # Use libcap-ng if it's present, otherwise don't.
        #
        want_libcap_ng=ifavailable
        AC_MSG_RESULT([yes, if available])
])
if test "$want_libcap_ng" != "no"; then
        AC_CHECK_LIB(cap-ng, capng_change_id)
        AC_CHECK_HEADERS(cap-ng.h)
fi

dnl
dnl set additional include path if necessary
if test "$missing_includes" = "yes"; then
        CPPFLAGS="$CPPFLAGS -I$srcdir/missing"
        V_INCLS="$V_INCLS -I$srcdir/missing"
fi

AC_SUBST(V_CCOPT)
AC_SUBST(V_DEFS)
AC_SUBST(V_GROUP)
AC_SUBST(V_INCLS)
AC_SUBST(V_PCAPDEP)
AC_SUBST(LOCALSRC)
AC_SUBST(MAN_FILE_FORMATS)
AC_SUBST(MAN_MISC_INFO)

AC_PROG_INSTALL

AC_CONFIG_HEADER(config.h)

AC_OUTPUT_COMMANDS([if test -f .devel; then
        echo timestamp > stamp-h
        cat Makefile-devel-adds >> Makefile
        make depend
fi])
AC_OUTPUT(Makefile tcpdump.1)
exit 0