1dnl @(#) $Header: /tcpdump/master/libpcap/configure.in,v 1.168 2008-12-23 20:49:26 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_PREREQ(2.61)
19AC_INIT(pcap.c)
20
21AC_CANONICAL_SYSTEM
22
23AC_LBL_C_INIT_BEFORE_CC(V_CCOPT, V_INCLS)
24AC_PROG_CC
25AC_LBL_C_INIT(V_CCOPT, V_INCLS)
26AC_LBL_SHLIBS_INIT
27AC_LBL_C_INLINE
28AC_C___ATTRIBUTE__
29if test "$ac_cv___attribute__" = "yes"; then
30	AC_C___ATTRIBUTE___UNUSED
31	AC_C___ATTRIBUTE___FORMAT
32fi
33
34AC_CHECK_HEADERS(sys/bitypes.h)
35
36AC_CHECK_TYPE([int8_t], ,
37	[AC_DEFINE([int8_t], [signed char],
38	[Define to `signed char' if int8_t not defined.])],
39	[AC_INCLUDES_DEFAULT
40#ifdef HAVE_SYS_BITYPES_H
41#include <sys/bitypes.h>
42#endif])
43AC_CHECK_TYPE([u_int8_t], ,
44	[AC_DEFINE([u_int8_t], [unsigned char],
45	[Define to `unsigned char' if u_int8_t not defined.])],
46	[AC_INCLUDES_DEFAULT
47#ifdef HAVE_SYS_BITYPES_H
48#include <sys/bitypes.h>
49#endif])
50AC_CHECK_TYPE([int16_t], ,
51	[AC_DEFINE([int16_t], [short],
52	[Define to `short' if int16_t not defined.])]
53	[AC_INCLUDES_DEFAULT
54#ifdef HAVE_SYS_BITYPES_H
55#include <sys/bitypes.h>
56#endif])
57AC_CHECK_TYPE([u_int16_t], ,
58	[AC_DEFINE([u_int16_t], [unsigned short],
59	[Define to `unsigned short' if u_int16_t not defined.])],
60	[AC_INCLUDES_DEFAULT
61#ifdef HAVE_SYS_BITYPES_H
62#include <sys/bitypes.h>
63#endif])
64AC_CHECK_TYPE([int32_t], ,
65	[AC_DEFINE([int32_t], [int],
66	[Define to `int' if int32_t not defined.])],
67	[AC_INCLUDES_DEFAULT
68#ifdef HAVE_SYS_BITYPES_H
69#include <sys/bitypes.h>
70#endif])
71AC_CHECK_TYPE([u_int32_t], ,
72	[AC_DEFINE([u_int32_t], [unsigned int],
73	[Define to `unsigned int' if u_int32_t not defined.])],
74	[AC_INCLUDES_DEFAULT
75#ifdef HAVE_SYS_BITYPES_H
76#include <sys/bitypes.h>
77#endif])
78AC_CHECK_TYPE([int64_t], ,
79	[AC_DEFINE([int64_t], [long long],
80	[Define to `long long' if int64_t not defined.])],
81	[AC_INCLUDES_DEFAULT
82#ifdef HAVE_SYS_BITYPES_H
83#include <sys/bitypes.h>
84#endif])
85AC_CHECK_TYPE([u_int64_t], ,
86	[AC_DEFINE([u_int64_t], [unsigned long long],
87	[Define to `unsigned long long' if u_int64_t not defined.])],
88	[AC_INCLUDES_DEFAULT
89#ifdef HAVE_SYS_BITYPES_H
90#include <sys/bitypes.h>
91#endif])
92
93#
94# Try to arrange for large file support.
95#
96AC_SYS_LARGEFILE
97AC_FUNC_FSEEKO
98
99dnl
100dnl Even if <net/bpf.h> were, on all OSes that support BPF, fixed to
101dnl include <sys/ioccom.h>, and we were to drop support for older
102dnl releases without that fix, so that pcap-bpf.c doesn't need to
103dnl include <sys/ioccom.h>, the test program in "AC_LBL_FIXINCLUDES"
104dnl in "aclocal.m4" uses it, so we would still have to test for it
105dnl and set "HAVE_SYS_IOCCOM_H" if we have it, otherwise
106dnl "AC_LBL_FIXINCLUDES" wouldn't work on some platforms such as Solaris.
107dnl
108AC_CHECK_HEADERS(sys/ioccom.h sys/sockio.h limits.h paths.h)
109AC_CHECK_HEADERS(linux/types.h)
110AC_CHECK_HEADERS(linux/if_packet.h netpacket/packet.h netpacket/if_packet.h)
111AC_CHECK_HEADERS(net/pfvar.h, , , [#include <sys/types.h>
112#include <sys/socket.h>
113#include <net/if.h>])
114if test "$ac_cv_header_net_pfvar_h" = yes; then
115	#
116	# Check for various PF actions.
117	#
118	AC_MSG_CHECKING(whether net/pfvar.h defines PF_NAT through PF_NORDR)
119	AC_TRY_COMPILE(
120	    [#include <sys/types.h>
121	    #include <sys/socket.h>
122	    #include <net/if.h>
123	    #include <net/pfvar.h>],
124	    [return PF_NAT+PF_NONAT+PF_BINAT+PF_NOBINAT+PF_RDR+PF_NORDR;],
125	    [
126		AC_MSG_RESULT(yes)
127		AC_DEFINE(HAVE_PF_NAT_THROUGH_PF_NORDR, 1,
128		    [define if net/pfvar.h defines PF_NAT through PF_NORDR])
129	    ],
130	    AC_MSG_RESULT(no))
131fi
132AC_CHECK_HEADERS(netinet/if_ether.h, , , [#include <sys/types.h>
133#include <sys/socket.h>])
134if test "$ac_cv_header_netinet_if_ether_h" != yes; then
135	#
136	# The simple test didn't work.
137	# Do we need to include <net/if.h> first?
138	# Unset ac_cv_header_netinet_if_ether_h so we don't
139	# treat the previous failure as a cached value and
140	# suppress the next test.
141	#
142	AC_MSG_NOTICE([Rechecking with some additional includes])
143	unset ac_cv_header_netinet_if_ether_h
144	AC_CHECK_HEADERS(netinet/if_ether.h, , , [#include <sys/types.h>
145#include <sys/socket.h>
146#include <netinet/in.h>
147struct mbuf;
148struct rtentry;
149#include <net/if.h>])
150fi
151
152AC_LBL_FIXINCLUDES
153
154AC_CHECK_FUNCS(strerror strlcpy)
155
156needsnprintf=no
157AC_CHECK_FUNCS(vsnprintf snprintf,,
158	[needsnprintf=yes])
159if test $needsnprintf = yes; then
160	AC_LIBOBJ([snprintf])
161fi
162
163#
164# Do this before checking for ether_hostton(), as it's a
165# "gethostbyname() -ish function".
166#
167AC_LBL_LIBRARY_NET
168
169#
170# You are in a twisty little maze of UN*Xes, all different.
171# Some might not have ether_hostton().
172# Some might have it, but not declare it in any header file.
173# Some might have it, but declare it in <netinet/if_ether.h>.
174# Some might have it, but declare it in <netinet/ether.h>
175# (And some might have it but document it as something declared in
176# <netinet/ethernet.h>, although <netinet/if_ether.h> appears to work.)
177#
178# Before you is a C compiler.
179#
180AC_CHECK_FUNCS(ether_hostton)
181if test "$ac_cv_func_ether_hostton" = yes; then
182	#
183	# OK, we have ether_hostton().  Do we have <netinet/if_ether.h>?
184	#
185	if test "$ac_cv_header_netinet_if_ether_h" = yes; then
186		#
187		# Yes.  Does it declare ether_hostton()?
188		#
189		AC_CHECK_DECL(ether_hostton,
190		    [
191			AC_DEFINE(NETINET_IF_ETHER_H_DECLARES_ETHER_HOSTTON,,
192			    [Define to 1 if netinet/if_ether.h declares `ether_hostton'])
193		    ],,
194		    [
195#include <sys/types.h>
196#include <sys/socket.h>
197#include <netinet/in.h>
198#include <arpa/inet.h>
199struct mbuf;
200struct rtentry;
201#include <net/if.h>
202#include <netinet/if_ether.h>
203		    ])
204	fi
205	#
206	# Did that succeed?
207	#
208	if test "$ac_cv_have_decl_ether_hostton" != yes; then
209		#
210		# No, how about <netinet/ether.h>, as on Linux?
211		#
212		AC_CHECK_HEADERS(netinet/ether.h)
213		if test "$ac_cv_header_netinet_ether_h" = yes; then
214			#
215			# We have it - does it declare ether_hostton()?
216			# Unset ac_cv_have_decl_ether_hostton so we don't
217			# treat the previous failure as a cached value and
218			# suppress the next test.
219			#
220			unset ac_cv_have_decl_ether_hostton
221			AC_CHECK_DECL(ether_hostton,
222			    [
223				AC_DEFINE(NETINET_ETHER_H_DECLARES_ETHER_HOSTTON,,
224				    [Define to 1 if netinet/ether.h declares `ether_hostton'])
225			    ],,
226			    [
227#include <netinet/ether.h>
228			    ])
229		fi
230	fi
231	#
232	# Is ether_hostton() declared?
233	#
234	if test "$ac_cv_have_decl_ether_hostton" != yes; then
235		#
236		# No, we'll have to declare it ourselves.
237		# Do we have "struct ether_addr"?
238		#
239		AC_CHECK_TYPES(struct ether_addr,,,
240		    [
241#include <sys/types.h>
242#include <sys/socket.h>
243#include <netinet/in.h>
244#include <arpa/inet.h>
245struct mbuf;
246struct rtentry;
247#include <net/if.h>
248#include <netinet/if_ether.h>
249		    ])
250		AC_DEFINE(HAVE_DECL_ETHER_HOSTTON, 0,
251		    [Define to 1 if you have the declaration of `ether_hostton', and to 0 if you
252don't.])
253	else
254		AC_DEFINE(HAVE_DECL_ETHER_HOSTTON, 1,
255		    [Define to 1 if you have the declaration of `ether_hostton', and to 0 if you
256don't.])
257	fi
258fi
259
260dnl to pacify those who hate protochain insn
261AC_MSG_CHECKING(if --disable-protochain option is specified)
262AC_ARG_ENABLE(protochain,
263AC_HELP_STRING([--disable-protochain],[disable \"protochain\" insn]))
264case "x$enable_protochain" in
265xyes)	enable_protochain=enabled	;;
266xno)	enable_protochain=disabled	;;
267x)	enable_protochain=enabled	;;
268esac
269
270if test "$enable_protochain" = "disabled"; then
271	AC_DEFINE(NO_PROTOCHAIN,1,[do not use protochain])
272fi
273AC_MSG_RESULT(${enable_protochain})
274
275#
276# SITA support is mutually exclusive with native capture support;
277# "--with-sita" selects SITA support.
278#
279AC_ARG_WITH(sita,
280AC_HELP_STRING([--with-sita],[include SITA support]),
281[
282	if test ! "x$withval" = "xno" ; then
283		AC_DEFINE(SITA,1,[include ACN support])
284		AC_MSG_NOTICE(Enabling SITA ACN support)
285		V_PCAP=sita
286		V_FINDALLDEVS=sita
287	fi
288],
289[
290dnl
291dnl Not all versions of test support -c (character special) but it's a
292dnl better way of testing since the device might be protected. So we
293dnl check in our normal order using -r and then check the for the /dev
294dnl guys again using -c.
295dnl
296dnl XXX This could be done for cross-compiling, but for now it's not.
297dnl
298if test -z "$with_pcap" && test "$cross_compiling" = yes; then
299	AC_MSG_ERROR(pcap type not determined when cross-compiling; use --with-pcap=...)
300fi
301AC_ARG_WITH(pcap,
302AC_HELP_STRING([--with-pcap=TYPE],[use packet capture TYPE]))
303AC_MSG_CHECKING(packet capture type)
304if test ! -z "$with_pcap" ; then
305	V_PCAP="$withval"
306elif test -r /dev/bpf -o -h /dev/bpf ; then
307	#
308	# Cloning BPF device.
309	#
310	V_PCAP=bpf
311	AC_DEFINE(HAVE_CLONING_BPF,1,[define if you have a cloning BPF device])
312elif test -r /dev/bpf0 ; then
313	V_PCAP=bpf
314elif test -r /usr/include/net/pfilt.h ; then
315	V_PCAP=pf
316elif test -r /dev/enet ; then
317	V_PCAP=enet
318elif test -r /dev/nit ; then
319	V_PCAP=snit
320elif test -r /usr/include/sys/net/nit.h ; then
321	V_PCAP=nit
322elif test -r /usr/include/linux/socket.h ; then
323	V_PCAP=linux
324elif test -r /usr/include/net/raw.h ; then
325	V_PCAP=snoop
326elif test -r /usr/include/odmi.h ; then
327	#
328	# On AIX, the BPF devices might not yet be present - they're
329	# created the first time libpcap runs after booting.
330	# We check for odmi.h instead.
331	#
332	V_PCAP=bpf
333elif test -c /dev/bpf0 ; then		# check again in case not readable
334	V_PCAP=bpf
335elif test -r /usr/include/sys/dlpi.h ; then
336	V_PCAP=dlpi
337elif test -c /dev/enet ; then		# check again in case not readable
338	V_PCAP=enet
339elif test -c /dev/nit ; then		# check again in case not readable
340	V_PCAP=snit
341else
342	V_PCAP=null
343fi
344AC_MSG_RESULT($V_PCAP)
345
346#
347# Do capture-mechanism-dependent tests.
348#
349case "$V_PCAP" in
350dlpi)
351	#
352	# Needed for common functions used by pcap-[dlpi,libdlpi].c
353	#
354 	SSRC="dlpisubs.c"
355
356	#
357	# Checks for some header files.
358	#
359	AC_CHECK_HEADERS(sys/bufmod.h sys/dlpi_ext.h)
360
361	#
362	# Checks to see if Solaris has the public libdlpi(3LIB) library.
363	# Note: The existence of /usr/include/libdlpi.h does not mean it is the
364	# public libdlpi(3LIB) version. Before libdlpi was made public, a 
365	# private version also existed, which did not have the same APIs. 
366	# Due to a gcc bug, the default search path for 32-bit libraries does
367	# not include /lib, we add it explicitly here.
368	# [http://bugs.opensolaris.org/view_bug.do?bug_id=6619485]. 
369	# Also, due to the bug above applications that link to libpcap with
370	# libdlpi will have to add "-L/lib" option to "configure".
371	#
372	saved_ldflags=$LDFLAGS
373	LDFLAGS="$LIBS -L/lib"
374	AC_CHECK_LIB(dlpi, dlpi_walk,
375		[
376			LIBS="-ldlpi $LIBS"
377			V_PCAP=libdlpi
378			AC_DEFINE(HAVE_LIBDLPI,1,[if libdlpi exists])
379		],
380		V_PCAP=dlpi)
381	LDFLAGS=$saved_ldflags
382
383	#
384	# Checks whether <sys/dlpi.h> is usable, to catch weird SCO
385	# versions of DLPI.
386	#
387	AC_MSG_CHECKING(whether <sys/dlpi.h> is usable)
388	AC_CACHE_VAL(ac_cv_sys_dlpi_usable,
389		AC_TRY_COMPILE(
390		    [
391			#include <sys/types.h>
392			#include <sys/time.h>
393			#include <sys/dlpi.h>
394		    ],
395		    [int i = DL_PROMISC_PHYS;],
396		    ac_cv_sys_dlpi_usable=yes,
397		    ac_cv_sys_dlpi_usable=no))
398	AC_MSG_RESULT($ac_cv_sys_dlpi_usable)
399	if test $ac_cv_sys_dlpi_usable = no ; then
400		AC_MSG_ERROR(<sys/dlpi.h> is not usable on this system; it probably has a non-standard DLPI)
401	fi
402
403	#
404	# Check whether we have a /dev/dlpi device or have multiple devices.
405	#
406	AC_MSG_CHECKING(for /dev/dlpi device)
407	if test -c /dev/dlpi ; then
408		AC_MSG_RESULT(yes)
409		AC_DEFINE(HAVE_DEV_DLPI, 1, [define if you have a /dev/dlpi])
410	else
411		AC_MSG_RESULT(no)
412		dir="/dev/dlpi"
413		AC_MSG_CHECKING(for $dir directory)
414		if test -d $dir ; then
415			AC_MSG_RESULT(yes)
416			AC_DEFINE_UNQUOTED(PCAP_DEV_PREFIX, "$dir", [/dev/dlpi directory])
417		else
418			AC_MSG_RESULT(no)
419		fi
420	fi
421
422	#
423	# This check is for Solaris with DLPI support for passive modes.
424	# See dlpi(7P) for more details.
425	#
426	AC_LBL_DL_PASSIVE_REQ_T
427	;;
428
429linux)
430	#
431	# Do we have the wireless extensions?
432	#
433	AC_CHECK_HEADERS(linux/wireless.h, [], [],
434	[
435#include <sys/socket.h>
436#include <linux/if.h>
437#include <linux/types.h>
438	])
439
440	#
441	# Do we have libnl?
442	#
443	AC_ARG_WITH(libnl,
444	AC_HELP_STRING([--without-libnl],[disable libnl support @<:@default=yes, on Linux, if present@:>@]),
445		with_libnl=$withval,,)
446
447	if test x$with_libnl != xno ; then
448		have_any_nl="no"
449
450		#
451		# Try libnl 3.x first.
452		#
453		AC_CHECK_LIB(nl-3, nl_socket_alloc,
454		[
455			#
456			# Yes, we have libnl 3.x.
457			#
458			LIBS="-lnl-genl-3 -lnl-3 $LIBS"
459			AC_DEFINE(HAVE_LIBNL,1,[if libnl exists])
460			AC_DEFINE(HAVE_LIBNL_3_x,1,[if libnl exists and is version 3.x])
461			AC_DEFINE(HAVE_LIBNL_NLE,1,[libnl has NLE_FAILURE])
462			AC_DEFINE(HAVE_LIBNL_SOCKETS,1,[libnl has new-style socket api])
463			V_INCLS="$V_INCLS -I/usr/include/libnl3"
464			have_any_nl="yes"
465		])
466
467		if test x$have_any_nl = xno ; then
468			#
469			# Try libnl 2.x
470			#
471			AC_CHECK_LIB(nl, nl_socket_alloc,
472			[
473				#
474				# Yes, we have libnl 2.x.
475				#
476				LIBS="-lnl-genl -lnl $LIBS"
477				AC_DEFINE(HAVE_LIBNL,1,[if libnl exists])
478				AC_DEFINE(HAVE_LIBNL_2_x,1,[if libnl exists and is version 2.x])
479				AC_DEFINE(HAVE_LIBNL_NLE,1,[libnl has NLE_FAILURE])
480				AC_DEFINE(HAVE_LIBNL_SOCKETS,1,[libnl has new-style socket api])
481				have_any_nl="yes"
482			])
483		fi
484
485		if test x$have_any_nl = xno ; then
486			#
487			# No, we don't; do we have libnl 1.x?
488			#
489			AC_CHECK_LIB(nl, nl_handle_alloc,
490			[
491				#
492				# Yes.
493				#
494				LIBS="-lnl $LIBS"
495				AC_DEFINE(HAVE_LIBNL,1,[if libnl exists])
496				have_any_nl="yes"
497			])
498		fi
499
500		if test x$have_any_nl = xno ; then
501			#
502			# No, we don't have libnl at all.
503			#
504			if test x$with_libnl = xyes ; then
505				AC_MSG_ERROR([libnl support requested but libnl not found])
506			fi
507		fi
508	fi
509
510	AC_CHECK_HEADERS(linux/ethtool.h,,,
511	    [
512AC_INCLUDES_DEFAULT
513#include <linux/types.h>
514	    ])
515	AC_LBL_TPACKET_STATS
516	AC_LBL_LINUX_TPACKET_AUXDATA_TP_VLAN_TCI
517	;;
518
519bpf)
520	#
521	# Check whether we have the *BSD-style ioctls.
522	#
523	AC_CHECK_HEADERS(net/if_media.h)
524
525	AC_MSG_CHECKING(whether the system supports zerocopy BPF)
526	AC_TRY_COMPILE(
527	    [#include <sys/socket.h>
528	    #include <sys/ioctl.h>
529	    #include <net/if.h>
530	    #include <net/bpf.h>],
531	    [return (BIOCROTZBUF + BPF_BUFMODE_ZBUF);],
532	    [  
533		AC_MSG_RESULT(yes)
534		AC_DEFINE(HAVE_ZEROCOPY_BPF, 1,
535		[define if the system supports zerocopy BPF])
536	    ],
537	    AC_MSG_RESULT(no))
538
539	    #
540	    # Check whether we have struct BPF_TIMEVAL.
541	    #
542	    AC_CHECK_TYPES(struct BPF_TIMEVAL,,,
543		[
544#include <sys/types.h>
545#include <sys/ioctl.h>
546#ifdef HAVE_SYS_IOCCOM_H
547#include <sys/ioccom.h>
548#endif
549#include <net/bpf.h>
550		    ])
551	;;
552
553dag)
554	V_DEFS="$V_DEFS -DDAG_ONLY"
555	;;
556
557septel)
558	V_DEFS="$V_DEFS -DSEPTEL_ONLY"
559	;;
560
561snf)
562	V_DEFS="$V_DEFS -DSNF_ONLY"
563	;;
564
565null)
566	AC_MSG_WARN(cannot determine packet capture interface)
567	AC_MSG_WARN((see the INSTALL doc for more info))
568	;;
569esac
570
571dnl
572dnl Now figure out how we get a list of interfaces and addresses,
573dnl if we support capturing.  Don't bother if we don't support
574dnl capturing.
575dnl
576if test "$V_PCAP" = null
577then
578	#
579	# We can't capture, so we can't open any capture
580	# devices, so we won't return any interfaces.
581	#
582	V_FINDALLDEVS=null
583else
584	AC_CHECK_FUNC(getifaddrs,[
585		#
586		# We have "getifaddrs()"; make sure we have <ifaddrs.h>
587		# as well, just in case some platform is really weird.
588		#
589		AC_CHECK_HEADER(ifaddrs.h,[
590		    #
591		    # We have the header, so we use "getifaddrs()" to
592		    # get the list of interfaces.
593		    #
594		    V_FINDALLDEVS=getad
595		],[
596		    #
597		    # We don't have the header - give up.
598		    # XXX - we could also fall back on some other
599		    # mechanism, but, for now, this'll catch this
600		    # problem so that we can at least try to figure
601		    # out something to do on systems with "getifaddrs()"
602		    # but without "ifaddrs.h", if there is something
603		    # we can do on those systems.
604		    #
605		    AC_MSG_ERROR([Your system has getifaddrs() but doesn't have a usable <ifaddrs.h>.])
606		])
607	],[
608		#
609		# Well, we don't have "getifaddrs()", so we have to use
610		# some other mechanism; determine what that mechanism is.
611		#
612		# The first thing we use is the type of capture mechanism,
613		# which is somewhat of a proxy for the OS we're using.
614		#
615		case "$V_PCAP" in
616
617		dlpi|libdlpi)
618			#
619			# This might be Solaris 8 or later, with
620			# SIOCGLIFCONF, or it might be some other OS
621			# or some older version of Solaris, with
622			# just SIOCGIFCONF.
623			#
624			AC_MSG_CHECKING(whether we have SIOCGLIFCONF)
625			AC_CACHE_VAL(ac_cv_lbl_have_siocglifconf,
626			    AC_TRY_COMPILE(
627				[#include <sys/param.h>
628				#include <sys/file.h>
629				#include <sys/ioctl.h>
630				#include <sys/socket.h>
631				#include <sys/sockio.h>],
632				[ioctl(0, SIOCGLIFCONF, (char *)0);],
633				ac_cv_lbl_have_siocglifconf=yes,
634				ac_cv_lbl_have_siocglifconf=no))
635			AC_MSG_RESULT($ac_cv_lbl_have_siocglifconf)
636			if test $ac_cv_lbl_have_siocglifconf = yes ; then
637				V_FINDALLDEVS=glifc
638			else
639				V_FINDALLDEVS=gifc
640			fi
641			;;
642
643		*)
644			#
645			# Assume we just have SIOCGIFCONF.
646			# (XXX - on at least later Linux kernels, there's
647			# another mechanism, and we should be using that
648			# instead.)
649			#
650			V_FINDALLDEVS=gifc
651			;;
652		esac])
653fi
654])
655
656AC_MSG_CHECKING(for socklen_t)
657AC_TRY_COMPILE([
658	#include <sys/types.h>
659	#include <sys/socket.h>
660	],
661	[ socklen_t x; ],
662	have_socklen_t=yes,
663	have_socklen_t=no)
664if test "x$have_socklen_t" = "xyes"; then
665	AC_DEFINE(HAVE_SOCKLEN_T, 1, [define if socklen_t is defined])
666fi
667AC_MSG_RESULT($have_socklen_t)
668
669AC_ARG_ENABLE(ipv6,
670AC_HELP_STRING([--enable-ipv6],[build IPv6-capable version @<:@default=yes, if getaddrinfo available@:>@]),
671    [],
672    [enable_ipv6=ifavailable])
673if test "$enable_ipv6" != "no"; then
674	AC_CHECK_FUNC(getaddrinfo,
675	    [
676		AC_DEFINE(INET6,1,[IPv6])
677	    ],
678	    [
679		if test "$enable_ipv6" != "ifavailable"; then
680			AC_MSG_FAILURE([--enable-ipv6 was given, but getaddrinfo isn't available])
681		fi
682	    ])
683fi
684
685AC_MSG_CHECKING(whether to build optimizer debugging code)
686AC_ARG_ENABLE(optimizer-dbg,
687AC_HELP_STRING([--enable-optimizer-dbg],[build optimizer debugging code]))
688if test "$enable_optimizer_dbg" = "yes"; then
689	AC_DEFINE(BDEBUG,1,[Enable optimizer debugging])
690fi
691AC_MSG_RESULT(${enable_optimizer_dbg-no})
692
693AC_MSG_CHECKING(whether to build parser debugging code)
694AC_ARG_ENABLE(yydebug,
695AC_HELP_STRING([--enable-yydebug],[build parser debugging code]))
696if test "$enable_yydebug" = "yes"; then
697	AC_DEFINE(YYDEBUG,1,[Enable parser debugging])
698fi
699AC_MSG_RESULT(${enable_yydebug-no})
700
701# Check for Endace DAG card support.
702AC_ARG_WITH([dag],
703AC_HELP_STRING([--with-dag@<:@=DIR@:>@],[include Endace DAG support @<:@"yes", "no" or DIR; default="yes" on BSD and Linux if present@:>@]),
704[
705	if test "$withval" = no
706	then
707		# User doesn't want DAG support.
708		want_dag=no
709	elif test "$withval" = yes
710	then
711		# User wants DAG support but hasn't specified a directory.
712		want_dag=yes
713	else
714		# User wants DAG support and has specified a directory, so use the provided value.
715		want_dag=yes
716		dag_root=$withval
717	fi
718],[
719	#
720	# Use DAG API if present, otherwise don't
721	#
722	want_dag=ifpresent
723])
724
725AC_ARG_WITH([dag-includes],
726AC_HELP_STRING([--with-dag-includes=DIR],[Endace DAG include directory]),
727[
728	# User wants DAG support and has specified a header directory, so use the provided value.
729	want_dag=yes
730	dag_include_dir=$withval
731],[])
732
733AC_ARG_WITH([dag-libraries],
734AC_HELP_STRING([--with-dag-libraries=DIR],[Endace DAG library directory]),
735[
736	# User wants DAG support and has specified a library directory, so use the provided value.
737	want_dag=yes
738	dag_lib_dir=$withval
739],[])
740
741case "$V_PCAP" in
742linux|bpf|dag)
743	#
744	# We support the DAG API if we're on Linux or BSD, or if we're
745	# building a DAG-only libpcap.
746	#
747	;;
748*)
749	#
750	# If the user explicitly requested DAG, tell them it's not
751	# supported.
752	#
753	# If they expressed no preference, don't include it.
754	#
755	if test $want_dag = yes; then
756		AC_MSG_ERROR([DAG support is only available with 'linux' 'bpf' and 'dag' packet capture types])
757	elif test $want_dag = yes; then
758		want_dag=no
759	fi
760	;;
761esac
762
763ac_cv_lbl_dag_api=no
764if test "$want_dag" != no; then
765
766	AC_MSG_CHECKING([whether we have DAG API headers])
767
768	# If necessary, set default paths for DAG API headers and libraries.
769	if test -z "$dag_root"; then
770	    dag_root=/usr/local
771	fi
772
773	if test -z "$dag_include_dir"; then
774		dag_include_dir="$dag_root/include"
775	fi
776
777	if test -z "$dag_lib_dir"; then
778	    dag_lib_dir="$dag_root/lib"
779	fi
780	
781	if test -z "$dag_tools_dir"; then
782	    dag_tools_dir="$dag_root/tools"
783	fi
784
785	if test -r $dag_include_dir/dagapi.h; then
786		ac_cv_lbl_dag_api=yes
787	fi
788	AC_MSG_RESULT([$ac_cv_lbl_dag_api ($dag_include_dir)])
789fi
790
791if test $ac_cv_lbl_dag_api = yes; then
792	V_INCLS="$V_INCLS -I$dag_include_dir"
793
794	if test $V_PCAP != dag ; then
795		 SSRC="pcap-dag.c"
796	fi
797
798	# See if we can find a general version string.
799	# Don't need to save and restore LIBS to prevent -ldag being
800	# included if there's a found-action (arg 3).
801	saved_ldflags=$LDFLAGS
802	LDFLAGS="-L$dag_lib_dir"
803	AC_CHECK_LIB([dag], [dag_attach_stream], [dag_streams="1"], [dag_streams="0"])
804	AC_CHECK_LIB([dag],[dag_get_erf_types], [
805		AC_DEFINE(HAVE_DAG_GET_ERF_TYPES, 1, [define if you have dag_get_erf_types()])])
806	AC_CHECK_LIB([dag],[dag_get_stream_erf_types], [
807		AC_DEFINE(HAVE_DAG_GET_STREAM_ERF_TYPES, 1, [define if you have dag_get_stream_erf_types()])])
808
809	LDFLAGS=$saved_ldflags
810
811	if test "$dag_streams" = 1; then
812		AC_DEFINE(HAVE_DAG_STREAMS_API, 1, [define if you have streams capable DAG API])
813		LIBS="$LIBS -ldag"
814		LDFLAGS="$LDFLAGS -L$dag_lib_dir"
815		
816		AC_CHECK_LIB([vdag],[vdag_set_device_info], [ac_dag_have_vdag="1"], [ac_dag_have_vdag="0"])
817		if test "$ac_dag_have_vdag" = 1; then
818			AC_DEFINE(HAVE_DAG_VDAG, 1, [define if you have vdag_set_device_info()])
819			LIBS="$LIBS -lpthread"
820		fi
821	fi
822
823	AC_DEFINE(HAVE_DAG_API, 1, [define if you have the DAG API])
824fi
825
826AC_MSG_CHECKING(whether we have the DAG API)
827
828if test $ac_cv_lbl_dag_api = no; then
829	AC_MSG_RESULT(no)
830	if test "$want_dag" = yes; then
831        	# User wanted DAG support but we couldn't find it.
832		AC_MSG_ERROR([DAG API requested, but not found at $dag_root: use --without-dag])
833	fi
834
835	if test "$V_PCAP" = dag; then
836		# User requested "dag" capture type but the DAG API wasn't
837		# found.
838		AC_MSG_ERROR([Specifying the capture type as "dag" requires the DAG API to be present; use the --with-dag options to specify the location. (Try "./configure --help" for more information.)])
839	fi
840else
841	AC_MSG_RESULT(yes)
842fi
843
844AC_ARG_WITH(septel,
845AC_HELP_STRING([--with-septel@<:@=DIR@:>@],[include Septel support (located in directory DIR, if supplied).  @<:@default=yes, on Linux, if present@:>@]),
846[
847	if test "$withval" = no
848	then
849		want_septel=no
850	elif test "$withval" = yes
851	then
852		want_septel=yes
853		septel_root=
854	else
855		want_septel=yes
856		septel_root=$withval
857	fi
858],[
859	#
860	# Use Septel API if present, otherwise don't
861	#
862	want_septel=ifpresent
863	septel_root=./../septel
864])
865ac_cv_lbl_septel_api=no
866case "$V_PCAP" in
867linux|septel)
868	#
869	# We support the Septel API if we're on Linux, or if we're building
870	# a Septel-only libpcap.
871	#
872	;;
873*)
874	#
875	# If the user explicitly requested Septel, tell them it's not
876	# supported.
877	#
878	# If they expressed no preference, don't include it.
879	#
880	if test $want_septel = yes; then
881		AC_MSG_ERROR(Septel support only available with 'linux' and 'septel' packet capture types)
882	elif test $want_septel = yes; then
883		want_septel=no
884	fi
885	;;
886esac
887
888if test "$with_septel" != no; then
889	AC_MSG_CHECKING(whether we have Septel API)
890
891	if test -z "$septel_root"; then
892		septel_root=$srcdir/../septel
893	fi
894
895	septel_tools_dir="$septel_root"
896	septel_include_dir="$septel_root/INC"
897
898	ac_cv_lbl_septel_api=no
899	if test -r "$septel_include_dir/msg.h"; then
900		V_INCLS="$V_INCLS -I$septel_include_dir"
901		ADDLOBJS="$ADDLOBJS $septel_tools_dir/asciibin.o $septel_tools_dir/bit2byte.o $septel_tools_dir/confirm.o $septel_tools_dir/fmtmsg.o $septel_tools_dir/gct_unix.o $septel_tools_dir/hqueue.o $septel_tools_dir/ident.o $septel_tools_dir/mem.o $septel_tools_dir/pack.o $septel_tools_dir/parse.o $septel_tools_dir/pool.o $septel_tools_dir/sdlsig.o $septel_tools_dir/strtonum.o $septel_tools_dir/timer.o $septel_tools_dir/trace.o"
902		ADDLARCHIVEOBJS="$ADDLARCHIVEOBJS $septel_tools_dir/asciibin.o $septel_tools_dir/bit2byte.o $septel_tools_dir/confirm.o $septel_tools_dir/fmtmsg.o $septel_tools_dir/gct_unix.o $septel_tools_dir/hqueue.o $septel_tools_dir/ident.o $septel_tools_dir/mem.o $septel_tools_dir/pack.o $septel_tools_dir/parse.o $septel_tools_dir/pool.o $septel_tools_dir/sdlsig.o $septel_tools_dir/strtonum.o $septel_tools_dir/timer.o $septel_tools_dir/trace.o"
903
904		if test "$V_PCAP" != septel ; then
905			 SSRC="pcap-septel.c"
906		fi
907		ac_cv_lbl_septel_api=yes
908	fi
909
910	AC_MSG_RESULT($ac_cv_lbl_septel_api)
911	if test $ac_cv_lbl_septel_api = no; then
912		if test "$want_septel" = yes; then
913			AC_MSG_ERROR(Septel API not found under directory $septel_root; use --without-septel)
914		fi
915	else
916		AC_DEFINE(HAVE_SEPTEL_API, 1, [define if you have a Septel API])
917	fi
918fi
919
920if test "$V_PCAP" = septel -a "$ac_cv_lbl_septel_api" = no; then
921	AC_MSG_ERROR(Specifying the capture type as 'septel' requires the Septel API to be present; use --with-septel=DIR)
922fi
923
924# Check for Myricom SNF support.
925AC_ARG_WITH([snf],
926AC_HELP_STRING([--with-snf@<:@=DIR@:>@],[include Myricom SNF support @<:@"yes", "no" or DIR; default="yes" on BSD and Linux if present@:>@]),
927[
928	if test "$withval" = no
929	then
930		# User explicitly doesn't want SNF
931		want_snf=no
932	elif test "$withval" = yes
933	then
934		# User wants SNF support but hasn't specific a directory.
935		want_snf=yes
936	else
937		# User wants SNF support with a specified directory.
938		want_snf=yes
939		snf_root=$withval
940	fi
941],[
942	#
943	# Use Sniffer API if present, otherwise don't
944	#
945	want_snf=ifpresent
946])
947
948AC_ARG_WITH([snf-includes],
949AC_HELP_STRING([--with-snf-includes=DIR],[Myricom SNF include directory]),
950[
951	# User wants SNF with specific header directory
952	want_snf=yes
953	snf_include_dir=$withval
954],[])
955
956AC_ARG_WITH([snf-libraries],
957AC_HELP_STRING([--with-snf-libraries=DIR],[Myricom SNF library directory]),
958[
959	# User wants SNF with specific lib directory
960	want_snf=yes
961	snf_lib_dir=$withval
962],[])
963
964case "$V_PCAP" in
965bpf|linux|snf)
966	#
967	# We support the Sniffer API if we're on BSD, Linux, or if we're
968	# building a Sniffer-only libpcap.
969	#
970	;;
971*)
972	#
973	# If the user explicitly requested Sniffer, tell them it's not
974	# supported.
975	#
976	# If they expressed no preference, don't include it.
977	#
978	if test $want_snf = yes; then
979		AC_MSG_ERROR(Myricom SNF support only available with 'bpf' 'linux' and 'snf' packet capture types)
980	elif test $want_snf = yes; then
981		want_snf=no
982	fi
983	;;
984esac
985
986ac_cv_lbl_snf_api=no
987if test "$with_snf" != no; then
988
989	AC_MSG_CHECKING(whether we have Myricom Sniffer API)
990
991	if test -z "$snf_root"; then
992		snf_root=/opt/snf
993	fi
994
995	if test -z "$snf_include_dir"; then
996		snf_include_dir="$snf_root/include"
997	fi
998
999	if test -z "$snf_lib_dir"; then
1000		snf_lib_dir="$snf_root/lib"
1001	fi
1002
1003	if test -f "$snf_include_dir/snf.h"; then
1004		ac_cv_lbl_snf_api=yes
1005	fi
1006	AC_MSG_RESULT([$ac_cv_lbl_snf_api ($snf_root)])
1007
1008	if test $ac_cv_lbl_snf_api = no; then
1009		if test "$want_snf" = yes; then
1010			AC_MSG_ERROR(SNF API headers not found under $snf_include_dir; use --without-snf)
1011		fi
1012	else
1013		saved_ldflags=$LDFLAGS
1014		LDFLAGS="$LDFLAGS -L$snf_lib_dir"
1015		AC_CHECK_LIB([snf], [snf_init], [ac_cv_lbl_snf_api="yes"], [ac_cv_lbl_snf_api="no"])
1016		LDFLAGS="$saved_ldflags"
1017
1018		if test $ac_cv_lbl_snf_api = no; then
1019			if test "$want_snf" = yes; then
1020				AC_MSG_ERROR(SNF API cannot correctly be linked check config.log; use --without-snf)
1021			fi
1022		else
1023			V_INCLS="$V_INCLS -I$snf_include_dir"
1024			LIBS="$LIBS -lsnf"
1025			LDFLAGS="$LDFLAGS -L$snf_lib_dir"
1026			if test "$V_PCAP" != snf ; then
1027				SSRC="pcap-snf.c"
1028			fi
1029			AC_DEFINE(HAVE_SNF_API, 1, [define if you have Myricom SNF API])
1030		fi
1031	fi
1032fi
1033
1034if test "$V_PCAP" = snf -a "$ac_cv_lbl_snf_api" = no; then
1035	AC_MSG_ERROR(Specifying the capture type as 'snf' requires the Myricom Sniffer API to be present; use --with-snf=DIR)
1036fi
1037
1038AC_LBL_LEX_AND_YACC(V_LEX, V_YACC, pcap_)
1039if test "$V_LEX" = lex ; then
1040# Some versions of lex can't handle the definitions section of scanner.l .
1041# Try lexing it and complain if it can't deal.
1042	AC_CACHE_CHECK([for capable lex], tcpdump_cv_capable_lex,
1043		if lex -t scanner.l > /dev/null 2>&1; then
1044			tcpdump_cv_capable_lex=yes
1045		else
1046			tcpdump_cv_capable_lex=insufficient
1047		fi)
1048	if test $tcpdump_cv_capable_lex = insufficient ; then
1049		AC_MSG_ERROR([Your operating system's lex is insufficient to compile
1050 libpcap.  flex is a lex replacement that has many advantages, including
1051 being able to compile libpcap.  For more information, see
1052 http://www.gnu.org/software/flex/flex.html .])
1053	fi
1054fi
1055
1056#
1057# Assume, by default, no support for shared libraries and V7/BSD convention
1058# for man pages (file formats in section 5, miscellaneous info in section 7).
1059# Individual cases can override this.
1060#
1061DYEXT="none"
1062MAN_FILE_FORMATS=5
1063MAN_MISC_INFO=7
1064case "$host_os" in
1065
1066aix*)
1067	dnl Workaround to enable certain features
1068	AC_DEFINE(_SUN,1,[define on AIX to get certain functions])
1069
1070	#
1071	# AIX makes it fun to build shared and static libraries,
1072	# because they're *both* ".a" archive libraries.  We
1073	# build the static library for the benefit of the traditional
1074	# scheme of building libpcap and tcpdump in subdirectories of
1075	# the same directory, with tcpdump statically linked with the
1076	# libpcap in question, but we also build a shared library as
1077	# "libpcap.shareda" and install *it*, rather than the static
1078	# library, as "libpcap.a".
1079	#
1080	DYEXT="shareda"
1081
1082	case "$V_PCAP" in
1083
1084	dlpi)
1085		#
1086		# If we're using DLPI, applications will need to
1087		# use /lib/pse.exp if present, as we use the
1088		# STREAMS routines.
1089		#
1090		pseexe="/lib/pse.exp"
1091		AC_MSG_CHECKING(for $pseexe)
1092		if test -f $pseexe ; then
1093			AC_MSG_RESULT(yes)
1094			LIBS="-I:$pseexe"
1095		fi
1096		;;
1097
1098	bpf)
1099		#
1100		# If we're using BPF, we need "-lodm" and "-lcfg", as
1101		# we use them to load the BPF module.
1102		#
1103		LIBS="-lodm -lcfg"
1104		;;
1105	esac
1106	;;
1107
1108darwin*)
1109	DYEXT="dylib"
1110	V_CCOPT="$V_CCOPT -fno-common"
1111	AC_ARG_ENABLE(universal,
1112	AC_HELP_STRING([--disable-universal],[don't build universal on OS X]))
1113	if test "$enable_universal" != "no"; then
1114		case "$host_os" in
1115
1116		darwin[0-7].*)
1117			#
1118			# Pre-Tiger.  Build only for 32-bit PowerPC; no
1119			# need for any special compiler or linker flags.
1120			#
1121			;;
1122
1123		darwin8.[0123]*)
1124			#
1125			# Tiger, prior to Intel support.  Build for 32-bit
1126			# PowerPC and 64-bit PowerPC, with 32-bit PowerPC
1127			# first.  (I'm guessing that's what Apple does.)
1128			#
1129			V_CCOPT="$V_CCOPT -arch ppc -arch ppc64"
1130			LDFLAGS="$LDFLAGS -arch ppc -arch ppc64"
1131			;;
1132
1133		darwin8.[456]*)
1134			#
1135			# Tiger, subsequent to Intel support but prior to
1136			# x86-64 support.  Build for 32-bit PowerPC, 64-bit
1137			# PowerPC, and x86, with 32-bit PowerPC first.
1138			# (I'm guessing that's what Apple does.)
1139			#
1140			V_CCOPT="$V_CCOPT -arch ppc -arch ppc64 -arch i386"
1141			LDFLAGS="$LDFLAGS -arch ppc -arch ppc64 -arch i386"
1142			;;
1143
1144		darwin8.*)
1145			#
1146			# All other Tiger, so subsequent to x86-64
1147			# support. Build for 32-bit PowerPC, 64-bit
1148			# PowerPC, x86, and x86-64, and with 32-bit PowerPC
1149			# first.  (I'm guessing that's what Apple does.)
1150			#
1151			V_CCOPT="$V_CCOPT -arch ppc -arch ppc64 -arch i386 -arch x86_64"
1152			LDFLAGS="$LDFLAGS -arch ppc -arch ppc64 -arch i386 -arch x86_64"
1153			;;
1154
1155		darwin9.*)
1156			#
1157			# Leopard.  Build for 32-bit PowerPC, 64-bit
1158			# PowerPC, x86, and x86-64, with 32-bit PowerPC
1159			# first.  (That's what Apple does.)
1160			#
1161			V_CCOPT="$V_CCOPT -arch ppc -arch ppc64 -arch i386 -arch x86_64"
1162			LDFLAGS="$LDFLAGS -arch ppc -arch ppc64 -arch i386 -arch x86_64"
1163			;;
1164
1165		darwin10.*)
1166			#
1167			# Snow Leopard.  Build for x86-64, x86, and
1168			# 32-bit PowerPC, with x86-64 first.  (That's
1169			# what Apple does, even though Snow Leopard
1170			# doesn't run on PPC, so PPC libpcap runs under
1171			# Rosetta, and Rosetta doesn't support BPF
1172			# ioctls, so PPC programs can't do live
1173			# captures.)
1174			#
1175			V_CCOPT="$V_CCOPT -arch x86_64 -arch i386 -arch ppc"
1176			LDFLAGS="$LDFLAGS -arch x86_64 -arch i386 -arch ppc"
1177			;;
1178
1179		darwin*)
1180			#
1181			# Post-Snow Leopard.  Build for x86-64 and
1182			# x86, with x86-64 first.  (That's probably what
1183			# Apple does, given that Rosetta is gone.)
1184			# XXX - update if and when Apple drops support
1185			# for 32-bit x86 code.
1186			#
1187			V_CCOPT="$V_CCOPT -arch x86_64 -arch i386"
1188			LDFLAGS="$LDFLAGS -arch x86_64 -arch i386"
1189			;;
1190		esac
1191	fi
1192	;;
1193
1194hpux9*)
1195	AC_DEFINE(HAVE_HPUX9,1,[on HP-UX 9.x])
1196
1197	#
1198	# Use System V conventions for man pages.
1199	#
1200	MAN_FILE_FORMATS=4
1201	MAN_MISC_INFO=5
1202	;;
1203
1204hpux10.0*)
1205
1206	#
1207	# Use System V conventions for man pages.
1208	#
1209	MAN_FILE_FORMATS=4
1210	MAN_MISC_INFO=5
1211	;;
1212
1213hpux10.1*)
1214
1215	#
1216	# Use System V conventions for man pages.
1217	#
1218	MAN_FILE_FORMATS=4
1219	MAN_MISC_INFO=5
1220	;;
1221
1222hpux*)
1223	dnl HPUX 10.20 and above is similar to HPUX 9, but
1224	dnl not the same....
1225	dnl
1226	dnl XXX - DYEXT should be set to "sl" if this is building
1227	dnl for 32-bit PA-RISC, but should be left as "so" for
1228	dnl 64-bit PA-RISC or, I suspect, IA-64.
1229	AC_DEFINE(HAVE_HPUX10_20_OR_LATER,1,[on HP-UX 10.20 or later])
1230	if test "`uname -m`" = "ia64"; then
1231		DYEXT="so"
1232	else
1233		DYEXT="sl"
1234	fi
1235
1236	#
1237	# "-b" builds a shared library; "+h" sets the soname.
1238	#
1239	SHLIB_OPT="-b"
1240	SONAME_OPT="+h"
1241
1242	#
1243	# Use System V conventions for man pages.
1244	#
1245	MAN_FILE_FORMATS=4
1246	MAN_MISC_INFO=5
1247	;;
1248
1249irix*)
1250	#
1251	# Use System V conventions for man pages.
1252	#
1253	MAN_FILE_FORMATS=4
1254	MAN_MISC_INFO=5
1255	;;
1256
1257linux*|freebsd*|netbsd*|openbsd*|dragonfly*|kfreebsd*|gnu*)
1258	DYEXT="so"
1259
1260	#
1261	# Compiler assumed to be GCC; run-time linker may require a -R
1262	# flag.
1263	#
1264	if test "$libdir" != "/usr/lib"; then
1265		V_RFLAGS=-Wl,-R$libdir
1266	fi
1267	;;
1268
1269osf*)
1270	DYEXT="so"
1271
1272	#
1273	# Use System V conventions for man pages.
1274	#
1275	MAN_FILE_FORMATS=4
1276	MAN_MISC_INFO=5
1277	;;
1278
1279sinix*)
1280	AC_MSG_CHECKING(if SINIX compiler defines sinix)
1281	AC_CACHE_VAL(ac_cv_cc_sinix_defined,
1282		AC_TRY_COMPILE(
1283		    [],
1284		    [int i = sinix;],
1285		    ac_cv_cc_sinix_defined=yes,
1286		    ac_cv_cc_sinix_defined=no))
1287	    AC_MSG_RESULT($ac_cv_cc_sinix_defined)
1288	    if test $ac_cv_cc_sinix_defined = no ; then
1289		    AC_DEFINE(sinix,1,[on sinix])
1290	    fi
1291	;;
1292
1293solaris*)
1294	AC_DEFINE(HAVE_SOLARIS,1,[On solaris])
1295
1296	DYEXT="so"
1297	#
1298	# Use System V conventions for man pages.
1299	#
1300	MAN_FILE_FORMATS=4
1301	MAN_MISC_INFO=5
1302	;;
1303esac
1304
1305AC_ARG_ENABLE(shared,
1306AC_HELP_STRING([--enable-shared],[build shared libraries @<:@default=yes, if support available@:>@]))
1307test "x$enable_shared" = "xno" && DYEXT="none"
1308
1309AC_PROG_RANLIB
1310AC_CHECK_TOOL([AR], [ar])
1311
1312AC_PROG_LN_S
1313AC_SUBST(LN_S)
1314
1315AC_LBL_DEVEL(V_CCOPT)
1316
1317AC_LBL_SOCKADDR_SA_LEN
1318
1319AC_LBL_SOCKADDR_STORAGE
1320
1321AC_LBL_HP_PPA_INFO_T_DL_MODULE_ID_1
1322
1323AC_LBL_UNALIGNED_ACCESS
1324
1325#
1326# Makefile.in includes rules to generate version.h, so we assume
1327# that it will be generated if autoconf is used.
1328#
1329AC_DEFINE(HAVE_VERSION_H, 1, [define if version.h is generated in the build procedure])
1330
1331rm -f net
1332ln -s ${srcdir}/bpf/net net
1333
1334AC_SUBST(V_CCOPT)
1335AC_SUBST(V_DEFS)
1336AC_SUBST(V_FINDALLDEVS)
1337AC_SUBST(V_INCLS)
1338AC_SUBST(V_LEX)
1339AC_SUBST(V_PCAP)
1340AC_SUBST(V_SHLIB_CMD)
1341AC_SUBST(V_SHLIB_OPT)
1342AC_SUBST(V_SONAME_OPT)
1343AC_SUBST(V_RPATH_OPT)
1344AC_SUBST(V_YACC)
1345AC_SUBST(ADDLOBJS)
1346AC_SUBST(ADDLARCHIVEOBJS)
1347AC_SUBST(SSRC)
1348AC_SUBST(DYEXT)
1349AC_SUBST(MAN_FILE_FORMATS)
1350AC_SUBST(MAN_MISC_INFO)
1351
1352dnl check for USB sniffing support
1353AC_MSG_CHECKING(for USB sniffing support)
1354case "$host_os" in
1355linux*)
1356	AC_DEFINE(PCAP_SUPPORT_USB, 1, [target host supports USB sniffing])
1357	USB_SRC=pcap-usb-linux.c
1358	AC_MSG_RESULT(yes)
1359	ac_usb_dev_name=`udevinfo -q name -p /sys/class/usb_device/usbmon 2>/dev/null`
1360	if test $? -ne 0 ; then
1361	  ac_usb_dev_name="usbmon"
1362	fi
1363	AC_DEFINE_UNQUOTED(LINUX_USB_MON_DEV, "/dev/$ac_usb_dev_name", [path for device for USB sniffing])
1364	AC_MSG_NOTICE(Device for USB sniffing is /dev/$ac_usb_dev_name)
1365	#
1366	# Do we have a version of <linux/compiler.h> available?
1367	# If so, we might need it for <linux/usbdevice_fs.h>.
1368	#
1369	AC_CHECK_HEADERS(linux/compiler.h)
1370	if test "$ac_cv_header_linux_compiler_h" = yes; then
1371	  #
1372	  # Yes - include it when testing for <linux/usbdevice_fs.h>.
1373	  #
1374	  AC_CHECK_HEADERS(linux/usbdevice_fs.h,,,[#include <linux/compiler.h>])
1375	else
1376	  AC_CHECK_HEADERS(linux/usbdevice_fs.h)
1377	fi
1378	if test "$ac_cv_header_linux_usbdevice_fs_h" = yes; then
1379	  #
1380	  # OK, does it define bRequestType?  Older versions of the kernel
1381	  # define fields with names like "requesttype, "request", and
1382	  # "value", rather than "bRequestType", "bRequest", and
1383	  # "wValue".
1384	  #
1385	  AC_MSG_CHECKING(if usbdevfs_ctrltransfer struct has bRequestType member)
1386	  AC_CACHE_VAL(ac_cv_usbdevfs_ctrltransfer_has_bRequestType,
1387	    AC_TRY_COMPILE([
1388AC_INCLUDES_DEFAULT
1389#ifdef HAVE_SYS_BITYPES_H
1390#include <sys/bitypes.h>
1391#endif
1392#ifdef HAVE_LINUX_COMPILER_H
1393#include <linux/compiler.h>
1394#endif
1395#include <linux/usbdevice_fs.h>],
1396	      [u_int i = sizeof(((struct usbdevfs_ctrltransfer *)0)->bRequestType)],
1397	      ac_cv_usbdevfs_ctrltransfer_has_bRequestType=yes,
1398	      ac_cv_usbdevfs_ctrltransfer_has_bRequestType=no))
1399	    AC_MSG_RESULT($ac_cv_usbdevfs_ctrltransfer_has_bRequestType)
1400	    if test $ac_cv_usbdevfs_ctrltransfer_has_bRequestType = yes ; then
1401	      AC_DEFINE(HAVE_USBDEVFS_CTRLTRANSFER_BREQUESTTYPE,1,
1402	        [if struct usbdevfs_ctrltransfer has bRequestType])
1403	    fi
1404	fi
1405	;;
1406*)
1407	AC_MSG_RESULT(no)
1408	;;
1409esac
1410AC_SUBST(PCAP_SUPPORT_USB)
1411AC_SUBST(USB_SRC)
1412
1413dnl check for netfilter sniffing support
1414AC_MSG_CHECKING(whether the platform could support netfilter sniffing)
1415case "$host_os" in
1416linux*)
1417	AC_MSG_RESULT(yes)
1418	#
1419	# Life's too short to deal with trying to get this to compile
1420	# if you don't get the right types defined with
1421	# __KERNEL_STRICT_NAMES getting defined by some other include.
1422	#
1423	# Check whether the includes Just Work.  If not, don't turn on
1424	# netfilter support.
1425	#
1426	AC_MSG_CHECKING(whether we can compile the netfilter support)
1427	AC_CACHE_VAL(ac_cv_netfilter_can_compile,
1428	  AC_TRY_COMPILE([
1429AC_INCLUDES_DEFAULT
1430#include <sys/socket.h>
1431#include <netinet/in.h>
1432#include <linux/types.h>
1433
1434#include <linux/netlink.h>
1435#include <linux/netfilter.h>
1436#include <linux/netfilter/nfnetlink.h>
1437#include <linux/netfilter/nfnetlink_log.h>
1438#include <linux/netfilter/nfnetlink_queue.h>],
1439	    [],
1440	    ac_cv_netfilter_can_compile=yes,
1441	    ac_cv_netfilter_can_compile=no))
1442	AC_MSG_RESULT($ac_cv_netfilter_can_compile)
1443	if test $ac_cv_netfilter_can_compile = yes ; then
1444	  AC_DEFINE(PCAP_SUPPORT_NETFILTER, 1,
1445	    [target host supports netfilter sniffing])
1446	  NETFILTER_SRC=pcap-netfilter-linux.c
1447	fi
1448	;;
1449*)
1450	AC_MSG_RESULT(no)
1451	;;
1452esac
1453AC_SUBST(PCAP_SUPPORT_NETFILTER)
1454AC_SUBST(NETFILTER_SRC)
1455
1456AC_ARG_ENABLE([bluetooth],
1457[AC_HELP_STRING([--enable-bluetooth],[enable Bluetooth support @<:@default=yes, if support available@:>@])],
1458    [],
1459    [enable_bluetooth=yes])
1460
1461if test "x$enable_bluetooth" != "xno" ; then
1462	dnl check for Bluetooth sniffing support
1463	case "$host_os" in
1464	linux*)
1465		AC_CHECK_HEADER(bluetooth/bluetooth.h,
1466		[
1467		  AC_DEFINE(PCAP_SUPPORT_BT, 1, [target host supports Bluetooth sniffing])
1468		  BT_SRC=pcap-bt-linux.c
1469		  AC_MSG_NOTICE(Bluetooth sniffing is supported)
1470
1471		  #
1472		  # OK, does struct sockaddr_hci have an hci_channel
1473		  # member?
1474		  #
1475		  AC_MSG_CHECKING(if struct sockaddr_hci has hci_channel member)
1476		  AC_CACHE_VAL(ac_cv_lbl_sockaddr_hci_has_hci_channel,
1477		    AC_TRY_COMPILE(
1478[
1479#include <bluetooth/bluetooth.h>
1480#include <bluetooth/hci.h>
1481],
1482		      [u_int i = sizeof(((struct sockaddr_hci *)0)->hci_channel)],
1483		      ac_cv_lbl_sockaddr_hci_has_hci_channel=yes,
1484		      ac_cv_lbl_sockaddr_hci_has_hci_channel=no))
1485		    AC_MSG_RESULT($ac_cv_lbl_sockaddr_hci_has_hci_channel)
1486		    if test $ac_cv_lbl_sockaddr_hci_has_hci_channel = yes ; then
1487		      AC_DEFINE(SOCKADDR_HCI_HAS_HCI_CHANNEL,,
1488			[if struct sockaddr_hci has hci_channel member])
1489		    fi
1490		],
1491		AC_MSG_NOTICE(Bluetooth sniffing is not supported; install bluez-lib devel to enable it)
1492		)
1493		;;
1494	*)
1495		AC_MSG_NOTICE(no Bluetooth sniffing support implemented for $host_os)
1496		;;
1497	esac
1498	AC_SUBST(PCAP_SUPPORT_BT)
1499	AC_SUBST(BT_SRC)
1500fi
1501
1502AC_ARG_ENABLE([canusb],
1503[AC_HELP_STRING([--enable-canusb],[enable canusb support @<:@default=yes, if support available@:>@])],
1504    [],
1505    [enable_canusb=yes])
1506
1507if test "x$enable_canusb" != "xno" ; then
1508	dnl check for canusb support
1509	case "$host_os" in
1510	linux*)
1511		AC_CHECK_HEADER(libusb-1.0/libusb.h,
1512		[
1513		    AC_DEFINE(PCAP_SUPPORT_CANUSB, 1, [target host supports canusb])
1514		    CANUSB_SRC=pcap-canusb-linux.c
1515		    LIBS="-lusb-1.0 -lpthread $LIBS"
1516		    AC_MSG_NOTICE(canusb sniffing is supported)
1517		],
1518		AC_MSG_NOTICE(canusb sniffing is not supported; install libusb1.0 lib devel to enable it)
1519		)
1520		;;
1521	*)
1522		AC_MSG_NOTICE(no canusb support implemented for $host_os)
1523		;;
1524	esac
1525	AC_SUBST(PCAP_SUPPORT_CANUSB)
1526	AC_SUBST(CANUSB_SRC)
1527fi
1528
1529AC_ARG_ENABLE([can],
1530[AC_HELP_STRING([--enable-can],[enable CAN support @<:@default=yes, if support available@:>@])],
1531    [],
1532    [enable_can=yes])
1533
1534if test "x$enable_can" != "xno" ; then
1535	dnl check for CAN sniffing support
1536	case "$host_os" in
1537	linux*)
1538		AC_CHECK_HEADER(linux/can.h,
1539			[ AC_DEFINE(PCAP_SUPPORT_CAN, 1, [target host supports CAN sniffing])
1540			CAN_SRC=pcap-can-linux.c
1541			AC_MSG_NOTICE(CAN sniffing is supported)],
1542			AC_MSG_NOTICE(CAN sniffing is not supported),
1543			[#include <sys/socket.h>]
1544		   )
1545		;;
1546	*)
1547		AC_MSG_NOTICE(no CAN sniffing support implemented for $host_os)
1548		;;
1549	esac
1550	AC_SUBST(PCAP_SUPPORT_CAN)
1551	AC_SUBST(CAN_SRC)
1552fi
1553
1554AC_ARG_ENABLE([dbus],
1555[AC_HELP_STRING([--enable-dbus],[enable D-Bus capture support @<:@default=yes, if support available@:>@])],
1556    [],
1557    [enable_dbus=ifavailable])
1558
1559if test "x$enable_dbus" != "xno"; then
1560	AC_CHECK_PROG([PKGCONFIG], [pkg-config], [pkg-config], [no])
1561	if test "x$PKGCONFIG" != "xno"; then
1562		AC_MSG_CHECKING([for D-Bus])
1563		if "$PKGCONFIG" dbus-1; then
1564			AC_MSG_RESULT([yes])
1565			DBUS_CFLAGS=`"$PKGCONFIG" --cflags dbus-1`
1566			DBUS_LIBS=`"$PKGCONFIG" --libs dbus-1`
1567			save_CFLAGS="$CFLAGS"
1568			save_LIBS="$LIBS"
1569			CFLAGS="$CFLAGS $DBUS_CFLAGS"
1570			LIBS="$LIBS $DBUS_LIBS"
1571			AC_MSG_CHECKING(whether the D-Bus library defines dbus_connection_read_write)
1572			AC_TRY_LINK(
1573			    [#include <string.h>
1574
1575			     #include <time.h>
1576			     #include <sys/time.h>
1577
1578			     #include <dbus/dbus.h>],
1579			    [return dbus_connection_read_write(NULL, 0);],
1580			    [
1581				AC_MSG_RESULT([yes])
1582				AC_DEFINE(PCAP_SUPPORT_DBUS, 1, [support D-Bus sniffing])
1583				DBUS_SRC=pcap-dbus.c
1584				V_INCLS="$V_INCLS $DBUS_CFLAGS"
1585			    ],
1586			    [
1587				AC_MSG_RESULT([no])
1588				if test "x$enable_dbus" = "xyes"; then
1589				    AC_MSG_ERROR([--enable-dbus was given, but the D-Bus library doesn't define dbus_connection_read_write()])
1590				fi
1591				LIBS="$save_LIBS"
1592			     ])
1593			CFLAGS="$save_CFLAGS"
1594		else
1595			AC_MSG_RESULT([no])
1596			if test "x$enable_dbus" = "xyes"; then
1597				AC_MSG_ERROR([--enable-dbus was given, but the dbus-1 package is not installed])
1598			fi
1599		fi
1600	fi
1601	AC_SUBST(PCAP_SUPPORT_DBUS)
1602	AC_SUBST(DBUS_SRC)
1603fi
1604
1605dnl check for hardware timestamp support
1606case "$host_os" in
1607linux*)
1608	AC_CHECK_HEADERS([linux/net_tstamp.h])
1609	;;
1610*)
1611	AC_MSG_NOTICE(no hardware timestamp support implemented for $host_os)
1612	;;
1613esac
1614
1615AC_PROG_INSTALL
1616
1617AC_CONFIG_HEADER(config.h)
1618
1619AC_OUTPUT_COMMANDS([if test -f .devel; then
1620	echo timestamp > stamp-h
1621	cat Makefile-devel-adds >> Makefile
1622	make depend
1623fi])
1624AC_OUTPUT(Makefile pcap-filter.manmisc pcap-linktype.manmisc
1625	pcap-tstamp.manmisc pcap-savefile.manfile pcap.3pcap
1626	pcap_compile.3pcap pcap_datalink.3pcap pcap_dump_open.3pcap
1627	pcap_get_tstamp_precision.3pcap pcap_list_datalinks.3pcap
1628	pcap_list_tstamp_types.3pcap pcap_open_dead.3pcap
1629	pcap_open_offline.3pcap pcap_set_tstamp_precision.3pcap
1630	pcap_set_tstamp_type.3pcap)
1631exit 0
1632