xref: /freebsd/contrib/tcpdump/configure.in (revision 884a2a699669ec61e2366e3e358342dbc94be24a)
1dnl @(#) $Header: /tcpdump/master/tcpdump/configure.in,v 1.204 2008-11-18 07:39:20 guy Exp $ (LBL)
2dnl
3dnl Copyright (c) 1994, 1995, 1996, 1997
4dnl	The Regents of the University of California.  All rights reserved.
5dnl
6dnl Process this file with autoconf to produce a configure script.
7dnl
8
9#
10# See
11#
12#	http://ftp.gnu.org/gnu/config/README
13#
14# for the URLs to use to fetch new versions of config.guess and
15# config.sub.
16#
17
18AC_REVISION($Revision: 1.204 $)
19AC_PREREQ(2.50)
20AC_INIT(tcpdump.c)
21
22AC_CANONICAL_HOST
23
24AC_LBL_C_INIT_BEFORE_CC(V_CCOPT, V_INCLS)
25AC_PROG_CC
26AC_LBL_C_INIT(V_CCOPT, V_INCLS)
27AC_LBL_C_INLINE
28AC_C___ATTRIBUTE__
29if test "$ac_cv___attribute__" = "yes"; then
30	AC_C___ATTRIBUTE___FORMAT_FUNCTION_POINTER
31fi
32AC_CHECK_HEADERS(fcntl.h rpc/rpcent.h netdnet/dnetdb.h)
33AC_CHECK_HEADERS(net/pfvar.h, , , [#include <sys/types.h>
34#include <sys/socket.h>
35#include <net/if.h>])
36if test "$ac_cv_header_net_pfvar_h" = yes; then
37	LOCALSRC="print-pflog.c $LOCALSRC"
38fi
39AC_CHECK_HEADERS(netinet/if_ether.h, , , [#include <sys/types.h>
40#include <sys/socket.h>])
41if test "$ac_cv_header_netinet_if_ether_h" != yes; then
42	#
43	# The simple test didn't work.
44	# Do we need to include <net/if.h> first?
45	# Unset ac_cv_header_netinet_if_ether_h so we don't
46	# treat the previous failure as a cached value and
47	# suppress the next test.
48	#
49	AC_MSG_NOTICE([Rechecking with some additional includes])
50	unset ac_cv_header_netinet_if_ether_h
51	AC_CHECK_HEADERS(netinet/if_ether.h, , , [#include <sys/types.h>
52#include <sys/socket.h>
53#include <netinet/in.h>
54struct mbuf;
55struct rtentry;
56#include <net/if.h>])
57fi
58
59AC_HEADER_TIME
60
61case "$host_os" in
62
63linux*)
64	AC_MSG_CHECKING(Linux kernel version)
65 	if test "$cross_compiling" = yes; then
66 		AC_CACHE_VAL(ac_cv_linux_vers,
67 		    ac_cv_linux_vers=unknown)
68 	else
69 		AC_CACHE_VAL(ac_cv_linux_vers,
70 		    ac_cv_linux_vers=`uname -r 2>&1 | \
71 			sed -n -e '$s/.* //' -e '$s/\..*//p'`)
72 	fi
73	AC_MSG_RESULT($ac_cv_linux_vers)
74 	if test $ac_cv_linux_vers = unknown ; then
75 		AC_MSG_ERROR(cannot determine linux version when cross-compiling)
76 	fi
77	if test $ac_cv_linux_vers -lt 2 ; then
78		AC_MSG_ERROR(version 2 or higher required; see the INSTALL doc for more info)
79	fi
80	;;
81
82*)
83	;;
84esac
85
86
87AC_ARG_WITH(smi,
88[  --with-smi              link with libsmi (allows to load MIBs on the fly to decode SNMP packets. [default=yes]
89  --without-smi           don't link with libsmi],,
90   with_smi=yes)
91
92if test "x$with_smi" != "xno" ; then
93AC_CHECK_HEADERS(smi.h)
94AC_CHECK_LIB(smi, smiInit)
95if test "$ac_cv_header_smi_h" = yes -a "$ac_cv_lib_smi_smiInit" = yes
96then
97AC_MSG_CHECKING([whether to enable libsmi])
98        AC_TRY_RUN([ /* libsmi available check */
99#include <smi.h>
100main()
101{
102  int current, revision, age, n;
103  const int required = 2;
104  if (smiInit(""))
105    exit(1);
106  if (strcmp(SMI_LIBRARY_VERSION, smi_library_version))
107    exit(2);
108  n = sscanf(smi_library_version, "%d:%d:%d", &current, &revision, &age);
109  if (n != 3)
110    exit(3);
111  if (required < current - age || required > current)
112    exit(4);
113  exit(0);
114}
115],
116[ AC_MSG_RESULT(yes)
117  AC_DEFINE(LIBSMI)
118  libsmi=yes],
119dnl autoconf documentation says that $? contains the exit value.
120dnl reality is that it does not.  We leave this in just in case
121dnl autoconf ever comes back to match the documentation.
122[ case $? in
123  1) AC_MSG_RESULT(no - smiInit failed) ;;
124  2) AC_MSG_RESULT(no - header/library version mismatch) ;;
125  3) AC_MSG_RESULT(no - can't determine library version) ;;
126  4) AC_MSG_RESULT(no - too old) ;;
127  *) AC_MSG_RESULT(no) ;;
128  esac
129  libsmi=no],
130[ AC_MSG_RESULT(not when cross-compiling)
131  libsmi=no]
132)
133fi
134fi
135
136AC_MSG_CHECKING([whether to enable the possibly-buggy SMB printer])
137AC_ARG_ENABLE(smb,
138[  --enable-smb            enable possibly-buggy SMB printer [default=yes]
139  --disable-smb           disable possibly-buggy SMB printer],,
140   enableval=yes)
141case "$enableval" in
142yes)	AC_MSG_RESULT(yes)
143	AC_WARN([The SMB printer may have exploitable buffer overflows!!!])
144	AC_DEFINE(TCPDUMP_DO_SMB)
145	LOCALSRC="print-smb.c smbutil.c $LOCALSRC"
146	;;
147*)	AC_MSG_RESULT(no)
148	;;
149esac
150
151AC_ARG_WITH(user, [  --with-user=USERNAME    drop privileges by default to USERNAME])
152AC_MSG_CHECKING([whether to drop root privileges by default])
153if test ! -z "$with_user" ; then
154        AC_DEFINE_UNQUOTED(WITH_USER, "$withval")
155       AC_MSG_RESULT(to \"$withval\")
156else
157       AC_MSG_RESULT(no)
158fi
159
160AC_ARG_WITH(chroot, [  --with-chroot=DIRECTORY when dropping privileges, chroot to DIRECTORY])
161AC_MSG_CHECKING([whether to chroot])
162if test ! -z "$with_chroot" && test "$with_chroot" != "no" ; then
163        AC_DEFINE_UNQUOTED(WITH_CHROOT, "$withval")
164       AC_MSG_RESULT(to \"$withval\")
165else
166       AC_MSG_RESULT(no)
167fi
168
169AC_MSG_CHECKING([whether to enable ipv6])
170AC_ARG_ENABLE(ipv6,
171[  --enable-ipv6           enable ipv6 (with ipv4) support
172  --disable-ipv6          disable ipv6 support],
173[ case "$enableval" in
174yes)   AC_MSG_RESULT(yes)
175       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"
176       AC_DEFINE(INET6)
177       ipv6=yes
178       ;;
179*)
180       AC_MSG_RESULT(no)
181       ipv6=no
182       ;;
183  esac ],
184
185  AC_TRY_RUN([ /* AF_INET6 available check */
186#include <sys/types.h>
187#include <sys/socket.h>
188main()
189{
190 if (socket(AF_INET6, SOCK_STREAM, 0) < 0)
191   exit(1);
192 else
193   exit(0);
194}
195],
196[ AC_MSG_RESULT(yes)
197  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"
198  AC_DEFINE(INET6)
199  ipv6=yes],
200[ AC_MSG_RESULT(no)
201  ipv6=no],
202[ AC_MSG_RESULT(no)
203  ipv6=no]
204))
205
206ipv6type=unknown
207ipv6lib=none
208ipv6trylibc=no
209
210if test "$ipv6" = "yes"; then
211	AC_MSG_CHECKING([ipv6 stack type])
212	for i in inria kame linux-glibc linux-libinet6 toshiba v6d zeta; do
213		case $i in
214		inria)
215			dnl http://www.kame.net/
216			AC_EGREP_CPP(yes,
217[#include <netinet/in.h>
218#ifdef IPV6_INRIA_VERSION
219yes
220#endif],
221				[ipv6type=$i;
222				CFLAGS="-DINET6 $CFLAGS"])
223			;;
224		kame)
225			dnl http://www.kame.net/
226			AC_EGREP_CPP(yes,
227[#include <netinet/in.h>
228#ifdef __KAME__
229yes
230#endif],
231				[ipv6type=$i;
232				ipv6lib=inet6;
233				ipv6libdir=/usr/local/v6/lib;
234				ipv6trylibc=yes;
235				CFLAGS="-DINET6 $CFLAGS"])
236			;;
237		linux-glibc)
238			dnl http://www.v6.linux.or.jp/
239			AC_EGREP_CPP(yes,
240[#include <features.h>
241#if defined(__GLIBC__) && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1
242yes
243#endif],
244				[ipv6type=$i;
245				CFLAGS="-DINET6 $CFLAGS"])
246			;;
247		linux-libinet6)
248			dnl http://www.v6.linux.or.jp/
249			dnl
250			dnl This also matches Solaris 8 and Tru64 UNIX 5.1,
251			dnl and possibly other versions of those OSes
252			dnl
253			if test -d /usr/inet6 -o -f /usr/include/netinet/ip6.h; then
254				ipv6type=$i
255				ipv6lib=inet6
256				ipv6libdir=/usr/inet6/lib
257				ipv6trylibc=yes;
258				CFLAGS="-DINET6 -I/usr/inet6/include $CFLAGS"
259			fi
260			;;
261		toshiba)
262			AC_EGREP_CPP(yes,
263[#include <sys/param.h>
264#ifdef _TOSHIBA_INET6
265yes
266#endif],
267				[ipv6type=$i;
268				ipv6lib=inet6;
269				ipv6libdir=/usr/local/v6/lib;
270				CFLAGS="-DINET6 $CFLAGS"])
271			;;
272		v6d)
273			AC_EGREP_CPP(yes,
274[#include </usr/local/v6/include/sys/v6config.h>
275#ifdef __V6D__
276yes
277#endif],
278				[ipv6type=$i;
279				ipv6lib=v6;
280				ipv6libdir=/usr/local/v6/lib;
281				CFLAGS="-I/usr/local/v6/include $CFLAGS"])
282			;;
283		zeta)
284			AC_EGREP_CPP(yes,
285[#include <sys/param.h>
286#ifdef _ZETA_MINAMI_INET6
287yes
288#endif],
289				[ipv6type=$i;
290				ipv6lib=inet6;
291				ipv6libdir=/usr/local/v6/lib;
292				CFLAGS="-DINET6 $CFLAGS"])
293			;;
294		esac
295		if test "$ipv6type" != "unknown"; then
296			break
297		fi
298	done
299	AC_MSG_RESULT($ipv6type)
300fi
301
302if test "$ipv6" = "yes" -a "$ipv6lib" != "none"; then
303	if test -d $ipv6libdir -a -f $ipv6libdir/lib$ipv6lib.a; then
304		LIBS="-L$ipv6libdir -l$ipv6lib $LIBS"
305		echo "You have $ipv6lib library, using it"
306	else
307		if test "$ipv6trylibc" = "yes"; then
308			echo "You do not have $ipv6lib library, using libc"
309		else
310			echo 'Fatal: no $ipv6lib library found.  cannot continue.'
311			echo "You need to fetch lib$ipv6lib.a from appropriate"
312			echo 'ipv6 kit and compile beforehand.'
313			exit 1
314		fi
315	fi
316fi
317
318
319if test "$ipv6" = "yes"; then
320	#
321	# XXX - on Tru64 UNIX 5.1, there is no "getaddrinfo()"
322	# function in libc; there are "ngetaddrinfo()" and
323	# "ogetaddrinfo()" functions, and <netdb.h> #defines
324	# "getaddrinfo" to be either "ngetaddrinfo" or
325	# "ogetaddrinfo", depending on whether _SOCKADDR_LEN
326	# or _XOPEN_SOURCE_EXTENDED are defined or not.
327	#
328	# So this test doesn't work on Tru64 5.1, and possibly
329	# on other 5.x releases.  This causes the configure
330	# script to become confused, and results in libpcap
331	# being unbuildable.
332	#
333	AC_SEARCH_LIBS(getaddrinfo, socket, [dnl
334	AC_MSG_CHECKING(getaddrinfo bug)
335	AC_CACHE_VAL(td_cv_buggygetaddrinfo, [AC_TRY_RUN([
336#include <sys/types.h>
337#include <netdb.h>
338#include <string.h>
339#include <sys/socket.h>
340#include <netinet/in.h>
341
342main()
343{
344  int passive, gaierr, inet4 = 0, inet6 = 0;
345  struct addrinfo hints, *ai, *aitop;
346  char straddr[INET6_ADDRSTRLEN], strport[16];
347
348  for (passive = 0; passive <= 1; passive++) {
349    memset(&hints, 0, sizeof(hints));
350    hints.ai_family = AF_UNSPEC;
351    hints.ai_flags = passive ? AI_PASSIVE : 0;
352    hints.ai_socktype = SOCK_STREAM;
353    hints.ai_protocol = IPPROTO_TCP;
354    if ((gaierr = getaddrinfo(NULL, "54321", &hints, &aitop)) != 0) {
355      (void)gai_strerror(gaierr);
356      goto bad;
357    }
358    for (ai = aitop; ai; ai = ai->ai_next) {
359      if (ai->ai_addr == NULL ||
360          ai->ai_addrlen == 0 ||
361          getnameinfo(ai->ai_addr, ai->ai_addrlen,
362                      straddr, sizeof(straddr), strport, sizeof(strport),
363                      NI_NUMERICHOST|NI_NUMERICSERV) != 0) {
364        goto bad;
365      }
366      switch (ai->ai_family) {
367      case AF_INET:
368        if (strcmp(strport, "54321") != 0) {
369          goto bad;
370        }
371        if (passive) {
372          if (strcmp(straddr, "0.0.0.0") != 0) {
373            goto bad;
374          }
375        } else {
376          if (strcmp(straddr, "127.0.0.1") != 0) {
377            goto bad;
378          }
379        }
380        inet4++;
381        break;
382      case AF_INET6:
383        if (strcmp(strport, "54321") != 0) {
384          goto bad;
385        }
386        if (passive) {
387          if (strcmp(straddr, "::") != 0) {
388            goto bad;
389          }
390        } else {
391          if (strcmp(straddr, "::1") != 0) {
392            goto bad;
393          }
394        }
395        inet6++;
396        break;
397      case AF_UNSPEC:
398        goto bad;
399        break;
400#ifdef AF_UNIX
401      case AF_UNIX:
402#else
403#ifdef AF_LOCAL
404      case AF_LOCAL:
405#endif
406#endif
407      default:
408        /* another family support? */
409        break;
410      }
411    }
412  }
413
414  /* supported family should be 2, unsupported family should be 0 */
415  if (!(inet4 == 0 || inet4 == 2))
416    goto bad;
417  if (!(inet6 == 0 || inet6 == 2))
418    goto bad;
419
420  if (aitop)
421    freeaddrinfo(aitop);
422  exit(0);
423
424 bad:
425  if (aitop)
426    freeaddrinfo(aitop);
427  exit(1);
428}
429],
430	td_cv_buggygetaddrinfo=no,
431	td_cv_buggygetaddrinfo=yes,
432	td_cv_buggygetaddrinfo=yes)])
433	if test "$td_cv_buggygetaddrinfo" = no; then
434		AC_MSG_RESULT(good)
435	else
436		AC_MSG_RESULT(buggy)
437	fi
438
439	if test "$td_cv_buggygetaddrinfo" = "yes"; then
440		#
441		# XXX - it doesn't appear that "ipv6type" can ever be
442		# set to "linux".  Should this be testing for
443		# "linux-glibc", or for that *or* "linux-libinet6"?
444		# If the latter, note that "linux-libinet6" is also
445		# the type given to some non-Linux OSes.
446		#
447		if test "$ipv6type" != "linux"; then
448			echo 'Fatal: You must get working getaddrinfo() function.'
449			echo '       or you can specify "--disable-ipv6"'.
450			exit 1
451		else
452			echo 'Warning: getaddrinfo() implementation on your system seems be buggy.'
453			echo '         Better upgrade your system library to newest version'
454			echo '         of GNU C library (aka glibc).'
455		fi
456	fi
457	])
458	AC_REPLACE_FUNCS(getnameinfo)
459fi
460
461AC_CACHE_CHECK([for dnet_htoa declaration in netdnet/dnetdb.h],
462[td_cv_decl_netdnet_dnetdb_h_dnet_htoa],
463[AC_EGREP_HEADER(dnet_htoa, netdnet/dnetdb.h,
464	td_cv_decl_netdnet_dnetdb_h_dnet_htoa=yes,
465	td_cv_decl_netdnet_dnetdb_h_dnet_htoa=no)])
466if test "$td_cv_decl_netdnet_dnetdb_h_dnet_htoa" = yes; then
467	AC_DEFINE(HAVE_NETDNET_DNETDB_H_DNET_HTOA)
468fi
469
470dnl
471dnl check sizeof basic types.
472dnl They're very likely to be wrong for cross-compiling.
473AC_CHECK_SIZEOF(char, 1)
474AC_CHECK_SIZEOF(short, 2)
475AC_CHECK_SIZEOF(int, 4)
476AC_CHECK_SIZEOF(long, 4)
477AC_CHECK_SIZEOF(long long, 8)
478
479dnl
480dnl Checks for addrinfo structure
481AC_STRUCT_ADDRINFO(ac_cv_addrinfo)
482if test "$ac_cv_addrinfo" = no; then
483	missing_includes=yes
484fi
485
486dnl
487dnl Checks for NI_MAXSERV
488AC_NI_MAXSERV(ac_cv_maxserv)
489if test "$ac_cv_maxserv" = no; then
490	missing_includes=yes
491fi
492
493dnl
494dnl Checks for NI_NAMEREQD
495AC_NI_NAMEREQD(ac_cv_namereqd)
496if test "$ac_cv_namereqd" = no; then
497	missing_includes=yes
498fi
499
500dnl
501dnl Checks for sockaddr_storage structure
502AC_STRUCT_SA_STORAGE(ac_cv_sa_storage)
503if test "$ac_cv_sa_storage" = no; then
504	missing_includes=yes
505fi
506
507dnl
508dnl Checks for IN[6]ADDRSZ
509AC_CHECK_ADDRSZ(ac_cv_addrsz)
510if test "$ac_cv_addrsz" = no; then
511	missing_includes=yes
512fi
513
514dnl
515dnl Checks for RES_USE_INET6
516AC_CHECK_RES_USE_INET6(ac_cv_res_inet6)
517if test "$ac_cv_res_inet6" = no; then
518	missing_includes=yes
519fi
520
521dnl
522dnl Checks for res_state_ext structure
523AC_STRUCT_RES_STATE_EXT(ac_cv_res_state_ext)
524if test "$ac_cv_res_state_ext" = no; then
525	missing_includes=yes
526fi
527
528dnl
529dnl Checks if res_state structure has nsort member.
530AC_STRUCT_RES_STATE(ac_cv_res_state)
531
532
533AC_REPLACE_FUNCS(vfprintf strcasecmp strlcat strlcpy strdup strsep)
534AC_CHECK_FUNCS(strftime)
535AC_CHECK_FUNCS(setlinebuf alarm)
536
537needsnprintf=no
538AC_CHECK_FUNCS(vsnprintf snprintf,,
539	[needsnprintf=yes])
540if test $needsnprintf = yes; then
541	AC_LIBOBJ(snprintf)
542fi
543
544AC_LBL_TYPE_SIGNAL
545
546AC_SEARCH_LIBS(dnet_htoa, dnet, AC_DEFINE(HAVE_DNET_HTOA))
547
548AC_CHECK_LIB(rpc, main)		dnl It's unclear why we might need -lrpc
549
550dnl Some platforms may need -lnsl for getrpcbynumber.
551AC_SEARCH_LIBS(getrpcbynumber, nsl, AC_DEFINE(HAVE_GETRPCBYNUMBER))
552
553dnl AC_CHECK_LIB(z, uncompress)
554dnl AC_CHECK_HEADERS(zlib.h)
555
556AC_LBL_LIBPCAP(V_PCAPDEP, V_INCLS)
557
558#
559# Check for these after AC_LBL_LIBPCAP, so we link with the appropriate
560# libraries (e.g., "-lsocket -lnsl" on Solaris).
561#
562# We don't use AC_REPLACE_FUNCS because that uses AC_CHECK_FUNCS which
563# use AC_CHECK_FUNC which doesn't let us specify the right #includes
564# to make this work on BSD/OS 4.x.  BSD/OS 4.x ships with the BIND8
565# resolver, and the way it defines inet_{ntop,pton} is rather strange;
566# it does not ship with a libc symbol "inet_ntop()", it ships with
567# "_inet_ntop()", and has a #define macro in one of the system headers
568# to rename it.
569#
570dnl AC_TRY_COMPILE(inet_ntop inet_pton inet_aton)
571AC_MSG_CHECKING(for inet_ntop)
572AC_TRY_LINK([#include <sys/types.h>
573#include <sys/socket.h>
574#include <netinet/in.h>
575#include <arpa/inet.h>], [char src[4], dst[128];
576inet_ntop(AF_INET, src, dst, sizeof(dst));],
577	[AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no)
578	AC_LIBOBJ(inet_ntop)])
579AC_MSG_CHECKING(for inet_pton)
580AC_TRY_LINK([#include <sys/types.h>
581#include <sys/socket.h>
582#include <netinet/in.h>
583#include <arpa/inet.h>], [char src[128], dst[4];
584inet_pton(AF_INET, src, dst);],
585	[AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no)
586	AC_LIBOBJ(inet_pton)])
587AC_MSG_CHECKING(for inet_aton)
588AC_TRY_LINK([#include <sys/types.h>
589#include <netinet/in.h>
590#include <arpa/inet.h>], [char src[128];
591struct in_addr dst;
592inet_aton(src, &dst);],
593	[AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no)
594	AC_LIBOBJ(inet_aton)])
595
596#
597# Check for these after AC_LBL_LIBPCAP, for the same reason.
598#
599# You are in a twisty little maze of UN*Xes, all different.
600# Some might not have ether_ntohost().
601# Some might have it, but not declare it in any header file.
602# Some might have it, but declare it in <netinet/if_ether.h>.
603# Some might have it, but declare it in <netinet/ether.h>
604# (And some might have it but document it as something declared in
605# <netinet/ethernet.h>, although <netinet/if_ether.h> appears to work.)
606#
607# Before you is a C compiler.
608#
609AC_CHECK_FUNCS(ether_ntohost, [
610    AC_CACHE_CHECK(for buggy ether_ntohost, ac_cv_buggy_ether_ntohost, [
611	AC_TRY_RUN([
612		#include <netdb.h>
613		#include <sys/types.h>
614		#include <sys/param.h>
615		#include <sys/socket.h>
616
617		int
618		main(int argc, char **argv)
619		{
620			u_char ea[6] = { 0xff, 0xff, 0xff, 0xff, 0xff };
621			char name[MAXHOSTNAMELEN];
622
623			ether_ntohost(name, (struct ether_addr *)ea);
624			exit(0);
625		}
626	], [ac_cv_buggy_ether_ntohost=no],
627	   [ac_cv_buggy_ether_ntohost=yes],
628	   [ac_cv_buggy_ether_ntohost="not while cross-compiling"])])
629    if test "$ac_cv_buggy_ether_ntohost" = "no"; then
630	AC_DEFINE(USE_ETHER_NTOHOST)
631    fi
632])
633if test "$ac_cv_func_ether_ntohost" = yes -a \
634    "$ac_cv_buggy_ether_ntohost" = "no"; then
635	#
636	# OK, we have ether_ntohost().  Do we have <netinet/if_ether.h>?
637	#
638	if test "$ac_cv_header_netinet_if_ether_h" = yes; then
639		#
640		# Yes.  Does it declare ether_ntohost()?
641		#
642		AC_CHECK_DECL(ether_ntohost,
643		    [
644			AC_DEFINE(NETINET_IF_ETHER_H_DECLARES_ETHER_NTOHOST,,
645			    [Define to 1 if netinet/if_ether.h declares `ether_ntohost'])
646		    ],,
647		    [
648#include <sys/types.h>
649#include <sys/socket.h>
650#include <netinet/in.h>
651#include <arpa/inet.h>
652struct mbuf;
653struct rtentry;
654#include <net/if.h>
655#include <netinet/if_ether.h>
656		    ])
657	fi
658	#
659	# Did that succeed?
660	#
661	if test "$ac_cv_have_decl_ether_ntohost" != yes; then
662		#
663		# No, how about <netinet/ether.h>, as on Linux?
664		#
665		AC_CHECK_HEADERS(netinet/ether.h)
666		if test "$ac_cv_header_netinet_ether_h" = yes; then
667			#
668			# We have it - does it declare ether_ntohost()?
669			# Unset ac_cv_have_decl_ether_ntohost so we don't
670			# treat the previous failure as a cached value and
671			# suppress the next test.
672			#
673			unset ac_cv_have_decl_ether_ntohost
674			AC_CHECK_DECL(ether_ntohost,
675			    [
676				AC_DEFINE(NETINET_ETHER_H_DECLARES_ETHER_NTOHOST,,
677				    [Define to 1 if netinet/ether.h declares `ether_ntohost'])
678			    ],,
679			    [
680#include <netinet/ether.h>
681			    ])
682		fi
683	fi
684	#
685	# Is ether_ntohost() declared?
686	#
687	if test "$ac_cv_have_decl_ether_ntohost" != yes; then
688		#
689		# No, we'll have to declare it ourselves.
690		# Do we have "struct ether_addr"?
691		#
692		AC_CHECK_TYPES(struct ether_addr,,,
693		    [
694#include <sys/types.h>
695#include <sys/socket.h>
696#include <netinet/in.h>
697#include <arpa/inet.h>
698struct mbuf;
699struct rtentry;
700#include <net/if.h>
701#include <netinet/if_ether.h>
702		    ])
703		AC_DEFINE(HAVE_DECL_ETHER_NTOHOST, 0,
704		    [Define to 1 if you have the declaration of `ether_ntohost', and to 0 if you
705don't.])
706	else
707		AC_DEFINE(HAVE_DECL_ETHER_NTOHOST, 1,
708		    [Define to 1 if you have the declaration of `ether_ntohost', and to 0 if you
709don't.])
710	fi
711fi
712
713# libdlpi is needed for Solaris 11 and later.
714AC_CHECK_LIB(dlpi, dlpi_walk, LIBS="$LIBS -ldlpi" LDFLAGS="-L/lib $LDFLAGS", ,-L/lib)
715
716dnl portability macros for getaddrinfo/getnameinfo
717dnl
718dnl Check for sa_len
719AC_CHECK_SA_LEN(ac_cv_sockaddr_has_sa_len)
720if test "$ac_cv_sockaddr_has_sa_len" = no; then
721	missing_includes=yes
722fi
723
724#
725# Do we have the new open API?  Check for pcap_create, and assume that,
726# if we do, we also have pcap_activate() and the other new routines.
727AC_CHECK_FUNCS(pcap_create)
728
729AC_CHECK_FUNCS(pcap_findalldevs pcap_dump_flush pcap_lib_version)
730if test $ac_cv_func_pcap_findalldevs = "yes" ; then
731dnl Check for Mac OS X, which may ship pcap.h from 0.6 but libpcap may
732dnl be 0.8; this means that lib has pcap_findalldevs but header doesn't
733dnl have pcap_if_t.
734    savedppflags="$CPPLAGS"
735    CPPFLAGS="$CPPFLAGS $V_INCLS"
736    AC_CHECK_TYPES(pcap_if_t, , , [#include <pcap.h>])
737    CPPFLAGS="$savedcppflags"
738fi
739
740if test $ac_cv_func_pcap_lib_version = "no" ; then
741    AC_MSG_CHECKING(whether pcap_version is defined by libpcap)
742    AC_TRY_LINK([],
743       [
744	extern char pcap_version[];
745
746	return (int)pcap_version;
747       ],
748       ac_lbl_cv_pcap_version_defined=yes,
749       ac_lbl_cv_pcap_version_defined=no)
750    if test "$ac_lbl_cv_pcap_version_defined" = yes ; then
751    	AC_MSG_RESULT(yes)
752	AC_DEFINE(HAVE_PCAP_VERSION)
753    else
754	AC_MSG_RESULT(no)
755    fi
756fi
757AC_MSG_CHECKING(whether pcap_debug is defined by libpcap)
758AC_TRY_LINK([],
759   [
760	extern int pcap_debug;
761
762	return pcap_debug;
763   ],
764   ac_lbl_cv_pcap_debug_defined=yes,
765   ac_lbl_cv_pcap_debug_defined=no)
766if test "$ac_lbl_cv_pcap_debug_defined" = yes ; then
767	AC_MSG_RESULT(yes)
768	AC_DEFINE(HAVE_PCAP_DEBUG)
769else
770	AC_MSG_RESULT(no)
771	#
772	# OK, what about "yydebug"?
773	#
774	AC_MSG_CHECKING(whether yydebug is defined by libpcap)
775	AC_TRY_LINK([],
776	   [
777		extern int yydebug;
778
779		return yydebug;
780	   ],
781	   ac_lbl_cv_yydebug_defined=yes,
782	   ac_lbl_cv_yydebug_defined=no)
783	if test "$ac_lbl_cv_yydebug_defined" = yes ; then
784		AC_MSG_RESULT(yes)
785		AC_DEFINE(HAVE_YYDEBUG)
786	else
787		AC_MSG_RESULT(no)
788	fi
789fi
790AC_REPLACE_FUNCS(bpf_dump)	dnl moved to libpcap in 0.6
791
792V_GROUP=0
793if test -f /etc/group -a ! -z "`grep '^wheel:' /etc/group`" ; then
794	V_GROUP=wheel
795fi
796#
797# Assume V7/BSD convention for man pages (file formats in section 5,
798# miscellaneous info in section 7).
799#
800MAN_FILE_FORMATS=5
801MAN_MISC_INFO=7
802case "$host_os" in
803
804aix*)
805	dnl Workaround to enable certain features
806	AC_DEFINE(_SUN)
807	;;
808
809hpux*)
810	#
811	# Use System V conventions for man pages.
812	#
813	MAN_FILE_FORMATS=4
814	MAN_MISC_INFO=5
815	;;
816
817irix*)
818	V_GROUP=sys
819
820	#
821	# Use System V conventions for man pages.
822	#
823	MAN_FILE_FORMATS=4
824	MAN_MISC_INFO=5
825	;;
826
827osf*)
828	V_GROUP=system
829
830	#
831	# Use System V conventions for man pages.
832	#
833	MAN_FILE_FORMATS=4
834	MAN_MISC_INFO=5
835	;;
836
837solaris*)
838	V_GROUP=sys
839
840	#
841	# Use System V conventions for man pages.
842	#
843	MAN_FILE_FORMATS=4
844	MAN_MISC_INFO=5
845	;;
846esac
847
848if test -f /dev/bpf0 ; then
849	V_GROUP=bpf
850fi
851
852#
853# Check for some headers introduced in later versions of libpcap
854# and used by some printers.
855#
856savedcppflags="$CPPFLAGS"
857CPPFLAGS="$CPPFLAGS $V_INCLS"
858AC_CHECK_HEADERS(pcap/bluetooth.h)
859AC_CHECK_HEADERS(pcap/usb.h)
860CPPFLAGS="$savedcppflags"
861
862AC_CHECK_HEADERS(sys/bitypes.h)
863
864AC_CHECK_TYPE([int8_t], ,
865	[AC_DEFINE([int8_t], [signed char],
866	[Define to `signed char' if int8_t not defined.])],
867	[AC_INCLUDES_DEFAULT
868#ifdef HAVE_SYS_BITYPES_H
869#include <sys/bitypes.h>
870#endif])
871AC_CHECK_TYPE([u_int8_t], ,
872	[AC_DEFINE([u_int8_t], [unsigned char],
873	[Define to `unsigned char' if u_int8_t not defined.])],
874	[AC_INCLUDES_DEFAULT
875#ifdef HAVE_SYS_BITYPES_H
876#include <sys/bitypes.h>
877#endif])
878AC_CHECK_TYPE([int16_t], ,
879	[AC_DEFINE([int16_t], [short],
880	[Define to `short' if int16_t not defined.])]
881	[AC_INCLUDES_DEFAULT
882#ifdef HAVE_SYS_BITYPES_H
883#include <sys/bitypes.h>
884#endif])
885AC_CHECK_TYPE([u_int16_t], ,
886	[AC_DEFINE([u_int16_t], [unsigned short],
887	[Define to `unsigned short' if u_int16_t not defined.])],
888	[AC_INCLUDES_DEFAULT
889#ifdef HAVE_SYS_BITYPES_H
890#include <sys/bitypes.h>
891#endif])
892AC_CHECK_TYPE([int32_t], ,
893	[AC_DEFINE([int32_t], [int],
894	[Define to `int' if int32_t not defined.])],
895	[AC_INCLUDES_DEFAULT
896#ifdef HAVE_SYS_BITYPES_H
897#include <sys/bitypes.h>
898#endif])
899AC_CHECK_TYPE([u_int32_t], ,
900	[AC_DEFINE([u_int32_t], [unsigned int],
901	[Define to `unsigned int' if u_int32_t not defined.])],
902	[AC_INCLUDES_DEFAULT
903#ifdef HAVE_SYS_BITYPES_H
904#include <sys/bitypes.h>
905#endif])
906AC_CHECK_TYPE([int64_t], ,
907	[AC_DEFINE([int64_t], [long long],
908	[Define to `long long' if int64_t not defined.])],
909	[AC_INCLUDES_DEFAULT
910#ifdef HAVE_SYS_BITYPES_H
911#include <sys/bitypes.h>
912#endif])
913AC_CHECK_TYPE([u_int64_t], ,
914	[AC_DEFINE([u_int64_t], [unsigned long long],
915	[Define to `unsigned long long' if u_int64_t not defined.])],
916	[AC_INCLUDES_DEFAULT
917#ifdef HAVE_SYS_BITYPES_H
918#include <sys/bitypes.h>
919#endif])
920
921#
922# We can't just check for <inttypes.h> - some systems have one that
923# doesn't define all the PRI[doxu]64 macros.
924#
925AC_CHECK_HEADERS(inttypes.h,
926  [
927    #
928    # OK, we have inttypes.h, but does it define those macros?
929    #
930    AC_MSG_CHECKING([[whether inttypes.h defines the PRI[doxu]64 macros]])
931    AC_COMPILE_IFELSE(
932      [
933	AC_LANG_SOURCE(
934	  [[
935	    #include <inttypes.h>
936	    #include <stdio.h>
937	    #include <sys/types.h>
938	    #ifdef HAVE_SYS_BITYPES_H
939	    #include <sys/bitypes.h>
940	    #endif
941
942	    main()
943	    {
944	      printf("%" PRId64 "\n", (u_int64_t)1);
945	      printf("%" PRIo64 "\n", (u_int64_t)1);
946	      printf("%" PRIx64 "\n", (u_int64_t)1);
947	      printf("%" PRIu64 "\n", (u_int64_t)1);
948	    }
949	  ]])
950      ],
951      [
952	AC_MSG_RESULT(yes)
953	ac_lbl_inttypes_h_defines_formats=yes
954      ],
955      [
956	AC_MSG_RESULT(no)
957	ac_lbl_inttypes_h_defines_formats=no
958      ])
959  ],
960  [
961    #
962    # We don't have inttypes.h, so it obviously can't define those
963    # macros.
964    #
965    ac_lbl_inttypes_h_defines_formats=no
966  ])
967if test "$ac_lbl_inttypes_h_defines_formats" = no; then
968  AC_LBL_CHECK_64BIT_FORMAT(l,
969    [
970      AC_LBL_CHECK_64BIT_FORMAT(ll,
971        [
972          AC_LBL_CHECK_64BIT_FORMAT(L,
973	    [
974	      AC_LBL_CHECK_64BIT_FORMAT(q,
975	        [
976	          AC_MSG_ERROR([neither %llx nor %Lx nor %qx worked on a 64-bit integer])
977	        ])
978	    ])
979	])
980    ])
981fi
982
983AC_PROG_RANLIB
984
985AC_LBL_DEVEL(V_CCOPT)
986
987AC_LBL_SOCKADDR_SA_LEN
988
989AC_LBL_UNALIGNED_ACCESS
990
991AC_VAR_H_ERRNO
992
993# Check for SSLeay
994AC_MSG_CHECKING(whether to use SSLeay libcrypto)
995# Specify location for both includes and libraries.
996want_libcrypto=youmama
997AC_ARG_WITH(crypto,
998    AS_HELP_STRING([--with-crypto@<:@=PATH@:>@],
999		   [use SSLeay libcrypto (located in directory PATH, if supplied).  @<:@default=yes, if available@:>@]),
1000[
1001	if test $withval = no
1002	then
1003		want_libcrypto=no
1004		AC_MSG_RESULT(no)
1005	elif test $withval = yes
1006	then
1007		want_libcrypto=yes
1008		AC_MSG_RESULT(yes)
1009	else
1010		want_libcrypto=yes
1011		AC_MSG_RESULT(yes)
1012		crypto_dir=$withval
1013	fi
1014],[
1015	#
1016	# Use libcrypto if it's present, otherwise don't.
1017	#
1018	want_libcrypto=ifavailable
1019	AC_MSG_RESULT([yes, if available])
1020])
1021if test "$want_libcrypto" != "no"; then
1022	ac_cv_ssleay_path=no
1023	incdir=no
1024	if test "x$crypto_dir" = x; then
1025		#
1026		# Location not specified; check the default locations.
1027		#
1028		AC_MSG_CHECKING(where SSLeay is located)
1029		dirs="/usr /usr/local /usr/local/ssl /usr/pkg"
1030		if test "x${host_alias}" != x; then
1031			dirs="/usr/${host_alias} $dirs"
1032		fi
1033		for dir in $dirs; do
1034			AC_LBL_SSLEAY($dir)
1035
1036			if test "$ac_cv_ssleay_path" != "no" -a "$incdir" != "no"; then
1037				break;
1038			else
1039				ac_cv_ssleay_path=no
1040				incdir=no
1041			fi
1042		done
1043		if test "$ac_cv_ssleay_path" != no; then
1044			AC_MSG_RESULT($ac_cv_ssleay_path)
1045		fi
1046	else
1047		AC_MSG_CHECKING(for SSLeay in $crypto_dir)
1048		AC_LBL_SSLEAY($crypto_dir)
1049		if test "$ac_cv_ssleay_path" != no; then
1050			AC_MSG_RESULT(found)
1051		fi
1052	fi
1053	if test "$ac_cv_ssleay_path" != no; then
1054		V_INCLS="$V_INCLS $incdir"
1055		if test "$dir" != "/usr"; then
1056			LDFLAGS="-L$dir/lib $LDFLAGS"
1057		fi
1058		if test -f $ac_cv_ssleay_path/lib/libRSAglue.a; then
1059			LIBS="$LIBS -lRSAglue"
1060		fi
1061		if test -f $ac_cv_ssleay_path/lib/librsaref.a; then
1062			LIBS="$LIBS -lrsaref"
1063		fi
1064		AC_CHECK_LIB(crypto, DES_cbc_encrypt)
1065
1066		CPPFLAGS="$CPPFLAGS $V_INCLS"
1067		AC_CHECK_HEADERS(openssl/evp.h)
1068	else
1069		#
1070		# Not found.  Did the user explicitly ask for it?
1071		#
1072		AC_MSG_RESULT(not found)
1073		if test "$want_libcrypto" = yes; then
1074			AC_MSG_ERROR(SSLeay not found)
1075		fi
1076	fi
1077fi
1078
1079dnl
1080dnl set additional include path if necessary
1081if test "$missing_includes" = "yes"; then
1082	CPPFLAGS="$CPPFLAGS -I\$(srcdir)/missing"
1083	V_INCLS="$V_INCLS -I\$(srcdir)/missing"
1084fi
1085
1086AC_SUBST(V_CCOPT)
1087AC_SUBST(V_DEFS)
1088AC_SUBST(V_GROUP)
1089AC_SUBST(V_INCLS)
1090AC_SUBST(V_PCAPDEP)
1091AC_SUBST(LOCALSRC)
1092AC_SUBST(MAN_FILE_FORMATS)
1093AC_SUBST(MAN_MISC_INFO)
1094
1095AC_PROG_INSTALL
1096
1097AC_CONFIG_HEADER(config.h)
1098
1099AC_OUTPUT_COMMANDS([if test -f .devel; then
1100	echo timestamp > stamp-h
1101	cat Makefile-devel-adds >> Makefile
1102	make depend
1103fi])
1104AC_OUTPUT(Makefile tcpdump.1)
1105exit 0
1106