xref: /freebsd/contrib/libpcap/configure.ac (revision 3c4ba5f55438f7afd4f4b0b56f88f2bb505fd6a6)
1dnl
2dnl Copyright (c) 1994, 1995, 1996, 1997
3dnl	The Regents of the University of California.  All rights reserved.
4dnl
5dnl Process this file with autoconf to produce a configure script.
6dnl
7
8#
9# See
10#
11#	https://ftp.gnu.org/gnu/config/README
12#
13# for the URLs to use to fetch new versions of config.guess and
14# config.sub.
15#
16
17AC_PREREQ(2.64)
18
19AC_INIT(pcap, m4_esyscmd_s([cat VERSION]))
20AC_CONFIG_SRCDIR(pcap.c)
21AC_SUBST(PACKAGE_NAME)
22
23#
24# These are the variables that are used in Makefile, pcap-config, and
25# libpcap.pc.
26#
27# CFLAGS: inherited from the environment, not modified by us (except
28# temporarily during tests that involve compilation).  Used only when
29# compiling C source.
30#
31# CXXFLAGS: inherited from the environment, not modified by us.  Used only
32# when compiling C++ source.
33#
34# LDFLAGS: inherited from the environment, not modified by us.
35#
36# LIBS: inherited from the environment; we add libraries required by
37# libpcap.  Librares that the core libpcap code requires are added
38# first; libraries required by additional pcap modules are first
39# added to ADDITIONAL_LIBS, and only added to LIBS at the end, after
40# we're finished doing configuration tests for the modules.
41#
42# LIBS_STATIC: libraries with which a program using the libpcap *static*
43# library needs to be linked.  This is a superset of LIBS, used in
44# pcap-config, so that "pcap-config --libs --static" will report them.
45# Initialized to LIBS.
46#
47# REQUIRES_PRIVATE: pkg-config package names for additional libraries
48# with which a program using the libpcap *static* library needs to be
49# linked and for which a .pc file exists.  This is used in libpcap.pc,
50# so that "pkg-config --libs --static" will report them, and so that
51# those libraries will be determined using the library's .pc file, not
52# from our .pc file.  Initialized to an empty string.
53#
54# V_CCOPT: additional compiler flags other than -I and -D flags
55# needed when compiling libpcap.  Used in Makefile for both C and
56# C++ source.
57#
58# V_DEFS: additional -D compiler flags needed when compiling
59# libpcap.  Used in Makefile for both C and C++ source.
60#
61# V_INCLS: additional -I compiler flags needed when compiling
62# libpcap.  Used in Makefile for both C and C++ source.
63#
64# ADDITIONAL_LIBS: additional libraries with which the libpcap dynamic
65# library needs to be linked.  Used in Makwfile; not used in pcap-config
66# or libpcap.pc, as, in all platforms on which we run, if a dynamic
67# library is linked with other dynamic libraries, a program using
68# that dynamic library doesn't have to link with those libraries -
69# they will be automatically loaded at run time.  Initialized to an
70# empty string.
71#
72# ADDITIONAL_LIBS_STATIC: additional libraries with which a program
73# using the libpcap *static* library needs to be linked.  This is used
74# in pcap-config, so that "pcap-config --libs --static" will report
75# them.  Initialized to an empty string.
76#
77# REQUIRES_PRIVATE: pkg-config package names for additional libraries
78# with which a program using the libpcap *static* library needs to be
79# linked and for which a .pc file exists.  This is used in libpcap.pc,
80# so that "pkg-config --libs --static" will report them, and so that
81# those libraries will be determined using the library's .pc file, not
82# from our .pc file.  Initialized to an empty string.
83#
84# LIBS_PRIVATE: pkg-config package names for additional libraries with
85# which a program using the libpcap *static* library needs to be linked
86# and for which a .pc file does not exist.  This is used in libpcap.pc,
87# so that "pkg-config --libs --static" will report them (those libraries
88# cannot be determined using the library's .pc file, as there is no such
89# file, so it has to come from our .pc file.  Initialized to an empty
90# string.
91#
92LIBS_STATIC=""
93REQUIRES_PRIVATE=""
94LIBS_PRIVATE=""
95
96AC_SUBST(V_CCOPT)
97AC_SUBST(V_DEFS)
98AC_SUBST(V_INCLS)
99AC_SUBST(LIBS_STATIC)
100AC_SUBST(REQUIRES_PRIVATE)
101AC_SUBST(LIBS_PRIVATE)
102
103AC_CANONICAL_SYSTEM
104
105AC_LBL_C_INIT_BEFORE_CC(V_CCOPT, V_INCLS)
106#
107# We require C99 or later.
108# Try to get it, which may involve adding compiler flags;
109# if that fails, give up.
110#
111AC_PROG_CC_C99
112if test "$ac_cv_prog_cc_c99" = "no"; then
113	AC_MSG_ERROR([The C compiler does not support C99])
114fi
115
116#
117# Get the size of a void *, to determine whether this is a 32-bit
118# or 64-bit build.
119#
120AC_CHECK_SIZEOF([void *])
121ac_lbl_c_sizeof_void_p="$ac_cv_sizeof_void_p"
122
123#
124# We only need a C++ compiler for Haiku; all code except for its
125# pcap module is in C.
126#
127case "$host_os" in
128haiku*)
129	AC_PROG_CXX
130
131	#
132	# Make sure C and C++ have the same pointer sizes with the flags
133	# they're given; if they don't, it means that the compilers for the
134	# languages will, with those flags, not produce code that can be
135	# linked together.
136	#
137	# We have to use different data types, because the results of
138	# a test are cached, so if we test for the size of a given type
139	# in C, the subsequent test in C++ will use the cached variable.
140	# We trick autoconf by testing the size of a "void *" in C and a
141	# "const void *" in C++.
142	#
143	AC_LANG_PUSH([C++])
144	AC_CHECK_SIZEOF([const void *])
145	ac_lbl_cxx_sizeof_void_p="$ac_cv_sizeof_const_void_p"
146	AC_LANG_POP([C++])
147	if test "$ac_lbl_cxx_sizeof_void_p" -eq 0; then
148		AC_MSG_ERROR([No C++ compiler was found])
149	fi
150	if test "$ac_lbl_c_sizeof_void_p" -ne "$ac_lbl_cxx_sizeof_void_p"; then
151		AC_MSG_ERROR([C compiler $CC produces code with $ac_lbl_c_sizeof_void_p-byte pointers
152while C++ compiler $CXX produces code with $ac_lbl_cxx_sizeof_void_p-byte pointers.  This prevents
153code in those languages from being combined.])
154	fi
155	;;
156esac
157
158AC_LBL_C_INIT(V_CCOPT, V_INCLS)
159AC_LBL_SHLIBS_INIT
160AC_LBL_C_INLINE
161AC_PCAP_C___ATOMICS
162
163#
164# Try to arrange for large file support.
165#
166AC_SYS_LARGEFILE
167AC_FUNC_FSEEKO
168
169dnl
170dnl Even if <net/bpf.h> were, on all OSes that support BPF, fixed to
171dnl include <sys/ioccom.h>, and we were to drop support for older
172dnl releases without that fix, so that pcap-bpf.c doesn't need to
173dnl include <sys/ioccom.h>, the test program in "AC_LBL_FIXINCLUDES"
174dnl in "aclocal.m4" uses it, so we would still have to test for it
175dnl and set "HAVE_SYS_IOCCOM_H" if we have it, otherwise
176dnl "AC_LBL_FIXINCLUDES" wouldn't work on some platforms such as Solaris.
177dnl
178AC_CHECK_HEADERS(sys/ioccom.h sys/sockio.h)
179AC_CHECK_HEADERS(netpacket/packet.h)
180
181AC_LBL_SAVE_CHECK_STATE
182case "$host_os" in
183haiku*)
184	#
185	# Haiku needs _BSD_SOURCE for the _IO* macros because it doesn't use them.
186	#
187	CFLAGS="$CFLAGS -D_BSD_SOURCE"
188	#
189	# Haiku has getpass in libbsd.
190	#
191	AC_CHECK_LIB(bsd, getpass)
192	;;
193esac
194
195AC_LBL_FIXINCLUDES
196AC_LBL_RESTORE_CHECK_STATE
197
198AC_CHECK_FUNCS(strerror)
199AC_CHECK_FUNC(strerror_r,
200    [
201	#
202	# We have strerror_r; if we define _GNU_SOURCE, is it a
203	# POSIX-compliant strerror_r() or a GNU strerror_r()?
204	#
205	AC_MSG_CHECKING(whether strerror_r is GNU-style)
206	AC_COMPILE_IFELSE(
207	    [
208		AC_LANG_SOURCE(
209#define _GNU_SOURCE
210#include <string.h>
211
212/* Define it GNU-style; that will cause an error if it's not GNU-style */
213extern char *strerror_r(int, char *, size_t);
214
215int
216main(void)
217{
218	return 0;
219}
220)
221	    ],
222	    [
223	        # GNU-style
224		AC_MSG_RESULT(yes)
225		AC_DEFINE(HAVE_GNU_STRERROR_R,,
226		    [Define to 1 if you have a GNU-style `strerror_r' function.])
227	    ],
228	    [
229		AC_MSG_RESULT(no)
230		AC_DEFINE(HAVE_POSIX_STRERROR_R,,
231		    [Define to 1 if you have a POSIX-style `strerror_r' function.])
232	    ])
233    ],
234    [
235	#
236	# We don't have strerror_r; do we have _wcserror_s?
237	#
238	AC_CHECK_FUNCS(_wcserror_s)
239    ])
240
241#
242# Thanks, IBM, for not providing vsyslog() in AIX!
243#
244AC_CHECK_FUNCS(vsyslog)
245
246#
247# Make sure we have vsnprintf() and snprintf(); we require them.
248#
249AC_CHECK_FUNC(vsnprintf,,
250    AC_MSG_ERROR([vsnprintf() is required but wasn't found]))
251AC_CHECK_FUNC(snprintf,,
252    AC_MSG_ERROR([snprintf() is required but wasn't found]))
253
254needasprintf=no
255AC_CHECK_FUNCS(vasprintf asprintf,,
256	[needasprintf=yes])
257if test $needasprintf = yes; then
258	AC_LIBOBJ([asprintf])
259fi
260
261needstrlcat=no
262AC_CHECK_FUNCS(strlcat,,
263	[needstrlcat=yes])
264if test $needstrlcat = yes; then
265	AC_LIBOBJ([strlcat])
266fi
267
268needstrlcpy=no
269AC_CHECK_FUNCS(strlcpy,,
270	[needstrlcpy=yes])
271if test $needstrlcpy = yes; then
272	AC_LIBOBJ([strlcpy])
273fi
274
275needstrtok_r=no
276AC_CHECK_FUNCS(strtok_r,,
277	[needstrtok_r=yes])
278if test $needstrtok_r = yes; then
279	AC_LIBOBJ([strtok_r])
280fi
281
282#
283# Do we have ffs(), and is it declared in <strings.h>?
284#
285AC_CHECK_FUNCS(ffs)
286if test "$ac_cv_func_ffs" = yes; then
287	#
288	# We have ffs(); is it declared in <strings.h>?
289	#
290	# This test fails if we don't have <strings.h> or if we do
291	# but it doesn't declare ffs().
292	#
293	AC_CHECK_DECL(ffs,
294	    [
295		AC_DEFINE(STRINGS_H_DECLARES_FFS,,
296		    [Define to 1 if strings.h declares `ffs'])
297	    ],,
298	    [
299#include <strings.h>
300	    ])
301fi
302
303#
304# Do this before checking for ether_hostton(), as it's a
305# "getaddrinfo()-ish function".
306#
307AC_LBL_LIBRARY_NET
308
309#
310# Check for reentrant versions of getnetbyname_r(), as provided by
311# Linux (glibc), Solaris/IRIX, and AIX (with three different APIs!).
312# If we don't find one, we just use getnetbyname(), which uses
313# thread-specific data on many platforms, but doesn't use it on
314# NetBSD or OpenBSD, and may not use it on older versions of other
315# platforms.
316#
317# Only do the check if we have a declaration of getnetbyname_r();
318# without it, we can't check which API it has.  (We assume that
319# if there's a declaration, it has a prototype, so that the API
320# can be checked.)
321#
322AC_CHECK_DECL(getnetbyname_r,
323    [
324	AC_MSG_CHECKING([for the Linux getnetbyname_r()])
325	AC_TRY_LINK(
326	    [#include <netdb.h>],
327	    [
328		struct netent netent_buf;
329		char buf[1024];
330		struct netent *resultp;
331		int h_errnoval;
332
333		return getnetbyname_r((const char *)0, &netent_buf, buf, sizeof buf, &resultp, &h_errnoval);
334	    ],
335	    [
336		AC_MSG_RESULT(yes)
337		AC_DEFINE(HAVE_LINUX_GETNETBYNAME_R, 1,
338		    [define if we have the Linux getnetbyname_r()])
339	    ],
340	    [
341		AC_MSG_RESULT(no)
342
343		AC_MSG_CHECKING([for Solaris/IRIX getnetbyname_r()])
344		AC_TRY_LINK(
345		    [#include <netdb.h>],
346		    [
347			struct netent netent_buf;
348			char buf[1024];
349
350			return getnetbyname_r((const char *)0, &netent_buf, buf, (int)sizeof buf) != NULL;
351		    ],
352		    [
353			AC_MSG_RESULT(yes)
354			AC_DEFINE(HAVE_SOLARIS_IRIX_GETNETBYNAME_R, 1,
355			    [define if we have the Solaris/IRIX getnetbyname_r()])
356		    ],
357		    [
358			AC_MSG_RESULT(no)
359
360			AC_MSG_CHECKING([for AIX getnetbyname_r()])
361			AC_TRY_LINK(
362			    [#include <netdb.h>],
363			    [
364				struct netent netent_buf;
365				struct netent_data net_data;
366
367				return getnetbyname_r((const char *)0, &netent_buf, &net_data);
368			    ],
369			    [
370				AC_MSG_RESULT(yes)
371				AC_DEFINE(HAVE_AIX_GETNETBYNAME_R, 1,
372				    [define if we have the AIX getnetbyname_r()])
373			    ],
374			    [
375				AC_MSG_RESULT(no)
376			    ])
377		    ])
378	    ])
379    ],,[#include <netdb.h>])
380
381#
382# Check for reentrant versions of getprotobyname_r(), as provided by
383# Linux (glibc), Solaris/IRIX, and AIX (with three different APIs!).
384# If we don't find one, we just use getprotobyname(), which uses
385# thread-specific data on many platforms, but doesn't use it on
386# NetBSD or OpenBSD, and may not use it on older versions of other
387# platforms.
388#
389# Only do the check if we have a declaration of getprotobyname_r();
390# without it, we can't check which API it has.  (We assume that
391# if there's a declaration, it has a prototype, so that the API
392# can be checked.)
393#
394AC_CHECK_DECL(getprotobyname_r,
395    [
396	AC_MSG_CHECKING([for the Linux getprotobyname_r()])
397	AC_TRY_LINK(
398	    [#include <netdb.h>],
399	    [
400		struct protoent protoent_buf;
401		char buf[1024];
402		struct protoent *resultp;
403
404		return getprotobyname_r((const char *)0, &protoent_buf, buf, sizeof buf, &resultp);
405	    ],
406	    [
407		AC_MSG_RESULT(yes)
408		AC_DEFINE(HAVE_LINUX_GETPROTOBYNAME_R, 1,
409		    [define if we have the Linux getprotobyname_r()])
410	    ],
411	    [
412		AC_MSG_RESULT(no)
413
414		AC_MSG_CHECKING([for Solaris/IRIX getprotobyname_r()])
415		AC_TRY_LINK(
416		    [#include <netdb.h>],
417		    [
418			struct protoent protoent_buf;
419			char buf[1024];
420
421			return getprotobyname_r((const char *)0, &protoent_buf, buf, (int)sizeof buf) != NULL;
422		    ],
423		    [
424			AC_MSG_RESULT(yes)
425			AC_DEFINE(HAVE_SOLARIS_IRIX_GETPROTOBYNAME_R, 1,
426			    [define if we have the Solaris/IRIX getprotobyname_r()])
427		    ],
428		    [
429			AC_MSG_RESULT(no)
430
431			AC_MSG_CHECKING([for AIX getprotobyname_r()])
432			AC_TRY_LINK(
433			    [#include <netdb.h>],
434			    [
435				struct protoent protoent_buf;
436				struct protoent_data proto_data;
437
438				return getprotobyname_r((const char *)0, &protoent_buf, &proto_data);
439			    ],
440			    [
441				AC_MSG_RESULT(yes)
442				AC_DEFINE(HAVE_AIX_GETPROTOBYNAME_R, 1,
443				    [define if we have the AIX getprotobyname_r()])
444			    ],
445			    [
446				AC_MSG_RESULT(no)
447			    ])
448		    ])
449	    ])
450    ],,[#include <netdb.h>])
451
452#
453# You are in a twisty little maze of UN*Xes, all different.
454# Some might not have ether_hostton().
455# Some might have it and declare it in <net/ethernet.h>.
456# Some might have it and declare it in <netinet/ether.h>
457# Some might have it and declare it in <sys/ethernet.h>.
458# Some might have it and declare it in <arpa/inet.h>.
459# Some might have it and declare it in <netinet/if_ether.h>.
460# Some might have it and not declare it in any header file.
461#
462# Before you is a C compiler.
463#
464AC_CHECK_FUNCS(ether_hostton)
465if test "$ac_cv_func_ether_hostton" = yes; then
466	#
467	# OK, we have ether_hostton().  Is it declared in <net/ethernet.h>?
468	#
469	# This test fails if we don't have <net/ethernet.h> or if we do
470	# but it doesn't declare ether_hostton().
471	#
472	AC_CHECK_DECL(ether_hostton,
473	    [
474		AC_DEFINE(NET_ETHERNET_H_DECLARES_ETHER_HOSTTON,,
475		    [Define to 1 if net/ethernet.h declares `ether_hostton'])
476	    ],,
477	    [
478#include <net/ethernet.h>
479	    ])
480	#
481	# Did that succeed?
482	#
483	if test "$ac_cv_have_decl_ether_hostton" != yes; then
484		#
485		# No, how about <netinet/ether.h>, as on Linux?
486		#
487		# This test fails if we don't have <netinet/ether.h>
488		# or if we do but it doesn't declare ether_hostton().
489		#
490		# Unset ac_cv_have_decl_ether_hostton so we don't
491		# treat the previous failure as a cached value and
492		# suppress the next test.
493		#
494		unset ac_cv_have_decl_ether_hostton
495		AC_CHECK_DECL(ether_hostton,
496		    [
497			AC_DEFINE(NETINET_ETHER_H_DECLARES_ETHER_HOSTTON,,
498			    [Define to 1 if netinet/ether.h declares `ether_hostton'])
499		    ],,
500		    [
501#include <netinet/ether.h>
502		    ])
503	fi
504	#
505	# Did that succeed?
506	#
507	if test "$ac_cv_have_decl_ether_hostton" != yes; then
508		#
509		# No, how about <sys/ethernet.h>, as on Solaris 10
510		# and later?
511		#
512		# This test fails if we don't have <sys/ethernet.h>
513		# or if we do but it doesn't declare ether_hostton().
514		#
515		# Unset ac_cv_have_decl_ether_hostton so we don't
516		# treat the previous failure as a cached value and
517		# suppress the next test.
518		#
519		unset ac_cv_have_decl_ether_hostton
520		AC_CHECK_DECL(ether_hostton,
521		    [
522			AC_DEFINE(SYS_ETHERNET_H_DECLARES_ETHER_HOSTTON,,
523			    [Define to 1 if sys/ethernet.h declares `ether_hostton'])
524		    ],,
525		    [
526#include <sys/ethernet.h>
527		    ])
528	fi
529	#
530	# Did that succeed?
531	#
532	if test "$ac_cv_have_decl_ether_hostton" != yes; then
533		#
534		# No, how about <arpa/inet.h>, as in AIX?
535		#
536		# This test fails if we don't have <arpa/inet.h>
537		# (if we have ether_hostton(), we should have
538		# networking, and if we have networking, we should
539		# have <arpa/inet.h>) or if we do but it doesn't
540		# declare ether_hostton().
541		#
542		# Unset ac_cv_have_decl_ether_hostton so we don't
543		# treat the previous failure as a cached value and
544		# suppress the next test.
545		#
546		unset ac_cv_have_decl_ether_hostton
547		AC_CHECK_DECL(ether_hostton,
548		    [
549			AC_DEFINE(ARPA_INET_H_DECLARES_ETHER_HOSTTON,,
550			    [Define to 1 if arpa/inet.h declares `ether_hostton'])
551		    ],,
552		    [
553#include <arpa/inet.h>
554		    ])
555	fi
556	#
557	# Did that succeed?
558	#
559	if test "$ac_cv_have_decl_ether_hostton" != yes; then
560		#
561		# No, how about <netinet/if_ether.h>?
562		# On some platforms, it requires <net/if.h> and
563		# <netinet/in.h>, and we always include it with
564		# both of them, so test it with both of them.
565		#
566		# This test fails if we don't have <netinet/if_ether.h>
567		# and the headers we include before it, or if we do but
568		# <netinet/if_ether.h> doesn't declare ether_hostton().
569		#
570		# Unset ac_cv_have_decl_ether_hostton so we don't
571		# treat the previous failure as a cached value and
572		# suppress the next test.
573		#
574		unset ac_cv_have_decl_ether_hostton
575		AC_CHECK_DECL(ether_hostton,
576		    [
577			AC_DEFINE(NETINET_IF_ETHER_H_DECLARES_ETHER_HOSTTON,,
578			    [Define to 1 if netinet/if_ether.h declares `ether_hostton'])
579		    ],,
580		    [
581#include <sys/types.h>
582#include <sys/socket.h>
583#include <net/if.h>
584#include <netinet/in.h>
585#include <netinet/if_ether.h>
586		    ])
587	fi
588	#
589	# After all that, is ether_hostton() declared?
590	#
591	if test "$ac_cv_have_decl_ether_hostton" = yes; then
592		#
593		# Yes.
594		#
595		AC_DEFINE(HAVE_DECL_ETHER_HOSTTON, 1,
596		    [Define to 1 if you have the declaration of `ether_hostton'])
597        else
598		#
599		# No, we'll have to declare it ourselves.
600		# Do we have "struct ether_addr" if we include
601		# <netinet/if_ether.h>?
602		#
603		AC_CHECK_TYPES(struct ether_addr,,,
604		    [
605			#include <sys/types.h>
606			#include <sys/socket.h>
607			#include <net/if.h>
608			#include <netinet/in.h>
609			#include <netinet/if_ether.h>
610		    ])
611	fi
612fi
613
614#
615# For various things that might use pthreads.
616#
617AC_CHECK_HEADER(pthread.h,
618    [
619	#
620	# OK, we have pthread.h.  Do we have pthread_create in the
621	# system libraries?
622	#
623	AC_CHECK_FUNC(pthread_create,
624	    [
625		#
626		# Yes.
627		#
628		ac_lbl_have_pthreads="found"
629	    ],
630	    [
631		#
632		# No - do we have it in -lpthreads?
633		#
634		AC_CHECK_LIB(pthreads, pthread_create,
635		    [
636			#
637			# Yes - add -lpthreads.
638			#
639			ac_lbl_have_pthreads="found"
640			PTHREAD_LIBS="$PTHREAD_LIBS -lpthreads"
641		    ],
642		    [
643			#
644			# No - do we have it in -lpthread?
645			#
646			AC_CHECK_LIB(pthread, pthread_create,
647			    [
648				#
649				# Yes - add -lpthread.
650				#
651                                ac_lbl_have_pthreads="found"
652				PTHREAD_LIBS="$PTHREAD_LIBS -lpthread"
653			    ],
654			    [
655				#
656				# No.
657				#
658				ac_lbl_have_pthreads="not found"
659			    ])
660		    ])
661	    ])
662    ],
663    [
664	#
665	# We didn't find pthread.h.
666	#
667	ac_lbl_have_pthreads="not found"
668    ]
669)
670
671dnl to pacify those who hate protochain insn
672AC_MSG_CHECKING(if --disable-protochain option is specified)
673AC_ARG_ENABLE(protochain,
674AS_HELP_STRING([--disable-protochain],[disable \"protochain\" insn]))
675case "x$enable_protochain" in
676xyes)	enable_protochain=enabled	;;
677xno)	enable_protochain=disabled	;;
678x)	enable_protochain=enabled	;;
679esac
680
681if test "$enable_protochain" = "disabled"; then
682	AC_DEFINE(NO_PROTOCHAIN,1,[do not use protochain])
683fi
684AC_MSG_RESULT(${enable_protochain})
685
686#
687# valgrindtest directly uses the native capture mechanism, but
688# only tests with BPF and PF_PACKET sockets; only enable it if
689# we have BPF or PF_PACKET sockets.
690#
691VALGRINDTEST_SRC=
692
693AC_ARG_WITH(pcap,
694AS_HELP_STRING([--with-pcap=TYPE],[use packet capture TYPE]))
695if test ! -z "$with_pcap" ; then
696	V_PCAP="$withval"
697else
698	#
699	# Check for a bunch of headers for various packet
700	# capture mechanisms.
701	#
702	AC_CHECK_HEADERS(net/bpf.h)
703	if test "$ac_cv_header_net_bpf_h" = yes; then
704		#
705		# Does it define BIOCSETIF?
706		# I.e., is it a header for an LBL/BSD-style capture
707		# mechanism, or is it just a header for a BPF filter
708		# engine?  Some versions of Arch Linux, for example,
709		# have a net/bpf.h that doesn't define BIOCSETIF;
710		# as it's a Linux, it should use packet sockets,
711		# instead.
712		#
713		# We need:
714		#
715		#  sys/types.h, because FreeBSD 10's net/bpf.h
716		#  requires that various BSD-style integer types
717		#  be defined;
718		#
719		#  sys/time.h, because AIX 5.2 and 5.3's net/bpf.h
720		#  doesn't include it but does use struct timeval
721		#  in ioctl definitions;
722		#
723		#  sys/ioctl.h and, if we have it, sys/ioccom.h,
724		#  because net/bpf.h defines ioctls;
725		#
726		#  net/if.h, because it defines some structures
727		#  used in ioctls defined by net/bpf.h;
728		#
729		#  sys/socket.h, because OpenBSD 5.9's net/bpf.h
730		#  defines some structure fields as being
731		#  struct sockaddrs;
732		#
733		# and net/bpf.h doesn't necessarily include all
734		# of those headers itself.
735		#
736		AC_MSG_CHECKING(if net/bpf.h defines BIOCSETIF)
737		AC_CACHE_VAL(ac_cv_lbl_bpf_h_defines_biocsetif,
738			AC_TRY_COMPILE(
739[
740#include <sys/types.h>
741#include <sys/time.h>
742#include <sys/ioctl.h>
743#include <sys/socket.h>
744#ifdef HAVE_SYS_IOCCOM_H
745#include <sys/ioccom.h>
746#endif
747#include <net/bpf.h>
748#include <net/if.h>
749],
750			[u_int i = BIOCSETIF;],
751			ac_cv_lbl_bpf_h_defines_biocsetif=yes,
752			ac_cv_lbl_bpf_h_defines_biocsetif=no))
753		AC_MSG_RESULT($ac_cv_lbl_bpf_h_defines_biocsetif)
754	fi
755	AC_CHECK_HEADERS(net/pfilt.h net/enet.h)
756	AC_CHECK_HEADERS(net/nit.h sys/net/nit.h)
757	AC_CHECK_HEADERS(linux/socket.h net/raw.h sys/dlpi.h)
758	AC_CHECK_HEADERS(config/HaikuConfig.h)
759
760	if test "$ac_cv_lbl_bpf_h_defines_biocsetif" = yes; then
761		#
762		# BPF.
763		# Check this before DLPI, so that we pick BPF on
764		# Solaris 11 and later.
765		#
766		V_PCAP=bpf
767
768		#
769		# We have BPF, so build valgrindtest with "make test"
770		# on macOS and FreeBSD (add your OS once there's a
771		# valgrind for it).
772		#
773		case "$host_os" in
774
775		freebsd*|darwin*|linux*)
776			VALGRINDTEST_SRC=valgrindtest.c
777			;;
778		esac
779	elif test "$ac_cv_header_linux_socket_h" = yes; then
780		#
781		# No prizes for guessing this one.
782		#
783		V_PCAP=linux
784		VALGRINDTEST_SRC=valgrindtest.c
785	elif test "$ac_cv_header_net_pfilt_h" = yes; then
786	        #
787	        # DEC OSF/1, Digital UNIX, Tru64 UNIX
788        	#
789		V_PCAP=pf
790	elif test "$ac_cv_header_net_enet_h" = yes; then
791		#
792		# Stanford Enetfilter.
793		#
794		V_PCAP=enet
795	elif test "$ac_cv_header_net_nit_h" = yes; then
796		#
797		# SunOS 4.x STREAMS NIT.
798		#
799		V_PCAP=snit
800	elif test "$ac_cv_header_sys_net_nit_h" = yes; then
801		#
802		# Pre-SunOS 4.x non-STREAMS NIT.
803		#
804		V_PCAP=nit
805	elif test "$ac_cv_header_net_raw_h" = yes; then
806		#
807		# IRIX snoop.
808		#
809		V_PCAP=snoop
810	elif test "$ac_cv_header_sys_dlpi_h" = yes; then
811		#
812		# DLPI on pre-Solaris 11 SunOS 5, HP-UX, possibly others.
813		#
814		V_PCAP=dlpi
815	elif test "$ac_cv_header_config_HaikuConfig_h" = yes; then
816		#
817		# Haiku.
818		#
819		V_PCAP=haiku
820	else
821		#
822		# Nothing we support.
823		#
824		V_PCAP=null
825		AC_MSG_WARN(cannot determine packet capture interface)
826		AC_MSG_WARN((see the INSTALL.md file for more info))
827	fi
828fi
829AC_MSG_CHECKING(packet capture type)
830AC_MSG_RESULT($V_PCAP)
831AC_SUBST(VALGRINDTEST_SRC)
832
833#
834# Do we have pkg-config?
835#
836PKG_PROG_PKG_CONFIG
837
838#
839# Do we have the brew command from Homebrew?
840#
841AC_PATH_PROG([BREW], [brew])
842
843#
844# Solaris pkg-config is annoying.  For at least one package (D-Bus, I'm
845# looking at *you*!), there are separate include files for 32-bit and
846# 64-bit builds (I guess using "unsigned long long" as a 64-bit integer
847# type on a 64-bit build is like crossing the beams or soething), and
848# there are two separate .pc files, so if we're doing a 32-bit build we
849# should make sure we look in /usr/lib/pkgconfig for .pc files and if
850# we're doing a 64-bit build we should make sure we look in
851# /usr/lib/amd64/pkgconfig for .pc files.
852#
853case "$host_os" in
854
855solaris*)
856	if test "$ac_cv_sizeof_void_p" -eq 8; then
857		#
858		# 64-bit build.  If the path is empty, set it to
859                # /usr/lib/amd64/pkgconfig; otherwise, if
860                # /usr/lib/pkgconfig appears in the path, prepend
861		# /usr/lib/amd64/pkgconfig to it; otherwise, put
862		# /usr/lib/amd64/pkgconfig at the end.
863		#
864		if test -z "$PKG_CONFIG_PATH"; then
865			#
866			# Not set, or empty.  Set it to
867			# /usr/lib/amd64/pkgconfig.
868			#
869			PKG_CONFIG_PATH=/usr/lib/amd64/pkgconfig
870		elif test ! -z `echo "$PKG_CONFIG_PATH" | grep "/usr/lib/pkgconfig"`; then
871			#
872			# It contains /usr/lib/pkgconfig.  Prepend
873			# /usr/lib/amd64/pkgconfig to /usr/lib/pkgconfig.
874			#
875			PKG_CONFIG_PATH=`echo "$PKG_CONFIG_PATH" | sed "s;/usr/lib/pkgconfig;/usr/lib/amd64/pkgconfig:/usr/lib/pkgconfig;"`
876		else
877			#
878			# Not empty, but doesn't contain /usr/lib/pkgconfig.
879			# Append /usr/lib/amd64/pkgconfig to it.
880			#
881			PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/lib/amd64/pkgconfig"
882		fi
883		export PKG_CONFIG_PATH
884	elif test "$ac_cv_sizeof_void_p" -eq 4; then
885		#
886		# 32-bit build.  If /usr/amd64/lib/pkgconfig appears
887		# in the path, prepend /usr/lib/pkgconfig to it.
888		#
889		if test ! -z `echo "$PKG_CONFIG_PATH" | grep "/usr/lib/amd64/pkgconfig"`; then
890			#
891			# It contains /usr/lib/amd64/pkgconfig.  Prepend
892			# /usr/lib/pkgconfig to /usr/lib/amd64/pkgconfig.
893			#
894			PKG_CONFIG_PATH=`echo "$PKG_CONFIG_PATH" | sed "s;/usr/lib/amd64/pkgconfig;/usr/lib/pkgconfig:/usr/lib/amd64/pkgconfig;"`
895			export PKG_CONFIG_PATH
896		fi
897	fi
898esac
899
900#
901# Handle each capture type.
902#
903case "$V_PCAP" in
904dlpi)
905	#
906	# Checks for some header files.
907	#
908	AC_CHECK_HEADERS(sys/bufmod.h sys/dlpi_ext.h)
909
910	#
911	# Checks to see if Solaris has the public libdlpi(3LIB) library.
912	# Note: The existence of /usr/include/libdlpi.h does not mean it is the
913	# public libdlpi(3LIB) version. Before libdlpi was made public, a
914	# private version also existed, which did not have the same APIs.
915	# Due to a gcc bug, the default search path for 32-bit libraries does
916	# not include /lib, we add it explicitly here.
917	# [http://bugs.opensolaris.org/view_bug.do?bug_id=6619485].
918	# Also, due to the bug above applications that link to libpcap with
919	# libdlpi will have to add "-L/lib" option to "configure".
920	#
921	save_LDFLAGS="$LDFLAGS"
922	LDFLAGS="$LIBS -L/lib"
923	AC_CHECK_LIB(dlpi, dlpi_walk,
924		[
925			LIBS="-ldlpi $LIBS"
926			LIBS_STATIC="-ldlpi $LIBS_STATIC"
927			LIBS_PRIVATE="-ldlpi $LIBS_PRIVATE"
928			V_PCAP=libdlpi
929
930			#
931			# Capture module plus common code needed for
932			# common functions used by pcap-[dlpi,libdlpi].c
933			#
934			PLATFORM_C_SRC="pcap-libdlpi.c dlpisubs.c"
935			AC_DEFINE(HAVE_LIBDLPI,1,[if libdlpi exists])
936		],
937		[
938			V_PCAP=dlpi
939
940			#
941			# Capture module plus common code needed for
942			# common functions used by pcap-[dlpi,libdlpi].c
943			#
944			PLATFORM_C_SRC="pcap-dlpi.c dlpisubs.c"
945		])
946	LDFLAGS="$save_LDFLAGS"
947
948	#
949	# Checks whether <sys/dlpi.h> is usable, to catch weird SCO
950	# versions of DLPI.
951	#
952	AC_MSG_CHECKING(whether <sys/dlpi.h> is usable)
953	AC_CACHE_VAL(ac_cv_sys_dlpi_usable,
954		AC_TRY_COMPILE(
955		    [
956			#include <sys/types.h>
957			#include <sys/time.h>
958			#include <sys/dlpi.h>
959		    ],
960		    [int i = DL_PROMISC_PHYS;],
961		    ac_cv_sys_dlpi_usable=yes,
962		    ac_cv_sys_dlpi_usable=no))
963	AC_MSG_RESULT($ac_cv_sys_dlpi_usable)
964	if test $ac_cv_sys_dlpi_usable = no ; then
965		AC_MSG_ERROR(<sys/dlpi.h> is not usable on this system; it probably has a non-standard DLPI)
966	fi
967
968	#
969	# Check to see if Solaris has the dl_passive_req_t struct defined
970	# in <sys/dlpi.h>.
971	# This check is for DLPI support for passive modes.
972	# See dlpi(7P) for more details.
973	#
974	AC_CHECK_TYPES(dl_passive_req_t,,,
975	    [
976		#include <sys/types.h>
977		#include <sys/dlpi.h>
978	    ])
979	;;
980
981enet)
982	#
983	# Capture module
984	#
985 	PLATFORM_C_SRC="pcap-enet.c"
986	;;
987
988haiku)
989	#
990	# Capture module
991	#
992 	PLATFORM_CXX_SRC="pcap-haiku.cpp"
993
994	#
995	# Just for the sake of it.
996	#
997	AC_CHECK_HEADERS(net/if.h net/if_dl.h net/if_types.h)
998	;;
999
1000linux)
1001	#
1002	# Capture module
1003	#
1004 	PLATFORM_C_SRC="pcap-linux.c"
1005
1006	#
1007	# Do we have the wireless extensions?
1008	#
1009	AC_CHECK_HEADERS(linux/wireless.h, [], [],
1010	[
1011#include <sys/socket.h>
1012#include <linux/if.h>
1013#include <linux/types.h>
1014	])
1015
1016	#
1017	# Do we have libnl?
1018	# We only want version 3.  Version 2 was, apparently,
1019	# short-lived, and version 1 is source and binary
1020	# incompatible with version 3, and it appears that,
1021	# these days, everybody's using version 3.  We're
1022	# not supporting older versions of the Linux kernel;
1023	# let's drop support for older versions of libnl, too.
1024	#
1025	AC_ARG_WITH(libnl,
1026	AS_HELP_STRING([--without-libnl],[disable libnl support @<:@default=yes, on Linux, if present@:>@]),
1027		with_libnl=$withval,with_libnl=if_available)
1028
1029	if test x$with_libnl != xno ; then
1030		#
1031		# Check for libnl-genl-3.0 with pkg-config.
1032		#
1033		PKG_CHECK_MODULES(LIBNL, libnl-genl-3.0,
1034		    [
1035			pkg_config_found_libnl=yes
1036			V_INCLS="$V_INCLS $LIBNL_CFLAGS"
1037			ADDITIONAL_LIBS="$LIBNL_LIBS $ADDITIONAL_LIBS"
1038			ADDITIONAL_LIBS_STATIC="$LIBNL_LIBS_STATIC $ADDITIONAL_LIBS_STATIC"
1039			REQUIRES_PRIVATE="libnl-genl-3.0 $REQUIRES_PRIVATE"
1040			AC_DEFINE(HAVE_LIBNL,1,[if libnl exists])
1041		    ])
1042
1043		if test x$pkg_config_found_libnl != xyes; then
1044			#
1045			# OK, either we don't have pkg-config or there
1046			# wasn't a .pc file for it; Check for it directly.
1047			#
1048			case "$with_libnl" in
1049
1050			yes|if_available)
1051				incdir=-I/usr/include/libnl3
1052				libnldir=
1053				;;
1054
1055			*)
1056				if test -d $withval; then
1057					libnldir=-L${withval}/lib
1058					incdir=-I${withval}/include
1059				fi
1060				;;
1061			esac
1062
1063			AC_CHECK_LIB(nl-3, nl_socket_alloc,
1064			[
1065				#
1066				# Yes, we have libnl 3.x.
1067				#
1068				ADDITIONAL_LIBS="${libnldir} -lnl-genl-3 -lnl-3 $ADDITIONAL_LIBS"
1069				ADDITIONAL_LIBS_STATIC="${libnldir} -lnl-genl-3 -lnl-3 $ADDITIONAL_LIBS_STATIC"
1070				LIBS_PRIVATE="${libnldir} -lnl-genl-3 -lnl-3 $LIBS_PRIVATE"
1071				AC_DEFINE(HAVE_LIBNL,1,[if libnl exists])
1072				V_INCLS="$V_INCLS ${incdir}"
1073			],[
1074				#
1075				# No, we don't have libnl at all.
1076				# Fail if the user explicitly requested
1077				# it.
1078				#
1079				if test x$with_libnl = xyes ; then
1080					AC_MSG_ERROR([libnl support requested but libnl not found])
1081				fi
1082			], ${incdir} ${libnldir} -lnl-genl-3 -lnl-3 )
1083		fi
1084	fi
1085
1086	#
1087	# Check to see if the tpacket_auxdata struct has a tp_vlan_tci member.
1088	#
1089	# NOTE: any failure means we conclude that it doesn't have that
1090	# member, so if we don't have tpacket_auxdata, we conclude it
1091	# doesn't have that member (which is OK, as either we won't be
1092	# using code that would use that member, or we wouldn't compile
1093	# in any case).
1094	AC_CHECK_MEMBERS([struct tpacket_auxdata.tp_vlan_tci],,,
1095	    [
1096		#include <sys/types.h>
1097		#include <linux/if_packet.h>
1098	    ])
1099	;;
1100
1101bpf)
1102	#
1103	# Capture module
1104	#
1105 	PLATFORM_C_SRC="pcap-bpf.c"
1106
1107	#
1108	# Check whether we have the *BSD-style ioctls.
1109	#
1110	AC_CHECK_HEADERS(net/if_media.h)
1111
1112	#
1113	# Check whether we have struct BPF_TIMEVAL.
1114	#
1115	AC_CHECK_TYPES(struct BPF_TIMEVAL,,,
1116	    [
1117		#include <sys/types.h>
1118		#include <sys/ioctl.h>
1119		#ifdef HAVE_SYS_IOCCOM_H
1120		#include <sys/ioccom.h>
1121		#endif
1122		#include <net/bpf.h>
1123	    ])
1124	;;
1125
1126pf)
1127	#
1128	# Capture module
1129	#
1130 	PLATFORM_C_SRC="pcap-pf.c"
1131	;;
1132
1133snit)
1134	#
1135	# Capture module
1136	#
1137 	PLATFORM_C_SRC="pcap-snit.c"
1138	;;
1139
1140snoop)
1141	#
1142	# Capture module
1143	#
1144 	PLATFORM_C_SRC="pcap-snoop.c"
1145	;;
1146
1147dag)
1148	#
1149	# --with-pcap=dag is the only way to get here, and it means
1150	# "DAG support but nothing else"
1151	#
1152	V_DEFS="$V_DEFS -DDAG_ONLY"
1153	PLATFORM_C_SRC="pcap-dag.c"
1154	xxx_only=yes
1155	;;
1156
1157dpdk)
1158	#
1159	# --with-pcap=dpdk is the only way to get here, and it means
1160	# "DPDK support but nothing else"
1161	#
1162	V_DEFS="$V_DEFS -DDPDK_ONLY"
1163	PLATFORM_C_SRC="pcap-dpdk.c"
1164	xxx_only=yes
1165	;;
1166
1167septel)
1168	#
1169	# --with-pcap=septel is the only way to get here, and it means
1170	# "Septel support but nothing else"
1171	#
1172	V_DEFS="$V_DEFS -DSEPTEL_ONLY"
1173	PLATFORM_C_SRC="pcap-septel.c"
1174	xxx_only=yes
1175	;;
1176
1177snf)
1178	#
1179	# --with-pcap=snf is the only way to get here, and it means
1180	# "SNF support but nothing else"
1181	#
1182	V_DEFS="$V_DEFS -DSNF_ONLY"
1183	PLATFORM_C_SRC="pcap-snf.c"
1184	xxx_only=yes
1185	;;
1186
1187null)
1188	#
1189	# Capture module
1190	#
1191 	PLATFORM_C_SRC="pcap-null.c"
1192	;;
1193
1194*)
1195	AC_MSG_ERROR($V_PCAP is not a valid pcap type)
1196	;;
1197esac
1198
1199dnl
1200dnl Now figure out how we get a list of interfaces and addresses,
1201dnl if we support capturing.  Don't bother if we don't support
1202dnl capturing.
1203dnl
1204if test "$V_PCAP" != null
1205then
1206	AC_CHECK_FUNC(getifaddrs,[
1207		#
1208		# We have "getifaddrs()"; make sure we have <ifaddrs.h>
1209		# as well, just in case some platform is really weird.
1210		#
1211		AC_CHECK_HEADER(ifaddrs.h,[
1212		    #
1213		    # We have the header, so we use "getifaddrs()" to
1214		    # get the list of interfaces.
1215		    #
1216		    PLATFORM_C_SRC="$PLATFORM_C_SRC fad-getad.c"
1217		],[
1218		    #
1219		    # We don't have the header - give up.
1220		    # XXX - we could also fall back on some other
1221		    # mechanism, but, for now, this'll catch this
1222		    # problem so that we can at least try to figure
1223		    # out something to do on systems with "getifaddrs()"
1224		    # but without "ifaddrs.h", if there is something
1225		    # we can do on those systems.
1226		    #
1227		    AC_MSG_ERROR([Your system has getifaddrs() but doesn't have a usable <ifaddrs.h>.])
1228		])
1229	],[
1230		#
1231		# Well, we don't have "getifaddrs()", at least not with the
1232		# libraries with which we've decided we need to link
1233		# libpcap with, so we have to use some other mechanism.
1234		#
1235		# Note that this may happen on Solaris, which has
1236		# getifaddrs(), but in -lsocket, not in -lxnet, so we
1237		# won't find it if we link with -lxnet, which we want
1238		# to do for other reasons.
1239		#
1240		# For now, we use either the SIOCGIFCONF ioctl or the
1241		# SIOCGLIFCONF ioctl, preferring the latter if we have
1242		# it; the latter is a Solarisism that first appeared
1243		# in Solaris 8.  (Solaris's getifaddrs() appears to
1244		# be built atop SIOCGLIFCONF; using it directly
1245		# avoids a not-all-that-useful middleman.)
1246		#
1247		AC_MSG_CHECKING(whether we have SIOCGLIFCONF)
1248		AC_CACHE_VAL(ac_cv_lbl_have_siocglifconf,
1249		    AC_TRY_COMPILE(
1250			[#include <sys/param.h>
1251			#include <sys/file.h>
1252			#include <sys/ioctl.h>
1253			#include <sys/socket.h>
1254			#include <sys/sockio.h>],
1255			[ioctl(0, SIOCGLIFCONF, (char *)0);],
1256			ac_cv_lbl_have_siocglifconf=yes,
1257			ac_cv_lbl_have_siocglifconf=no))
1258		AC_MSG_RESULT($ac_cv_lbl_have_siocglifconf)
1259		if test $ac_cv_lbl_have_siocglifconf = yes ; then
1260			PLATFORM_C_SRC="$PLATFORM_C_SRC fad-glifc.c"
1261		else
1262			PLATFORM_C_SRC="$PLATFORM_C_SRC fad-gifc.c"
1263		fi
1264	])
1265fi
1266
1267dnl check for hardware timestamp support
1268case "$host_os" in
1269linux*)
1270	AC_CHECK_HEADERS([linux/net_tstamp.h])
1271	;;
1272*)
1273	AC_MSG_NOTICE(no hardware timestamp support implemented for $host_os)
1274	;;
1275esac
1276
1277#
1278# Check for socklen_t.
1279#
1280AC_CHECK_TYPES(socklen_t,,,
1281    [
1282	#include <sys/types.h>
1283	#include <sys/socket.h>
1284    ])
1285
1286AC_ARG_ENABLE(ipv6,
1287AS_HELP_STRING([--enable-ipv6],[build IPv6-capable version @<:@default=yes@:>@]),
1288    [],
1289    [enable_ipv6=yes])
1290if test "$enable_ipv6" != "no"; then
1291	#
1292	# We've already made sure we have getaddrinfo above in
1293	# AC_LBL_LIBRARY_NET.
1294	#
1295	AC_DEFINE(INET6,1,[IPv6])
1296fi
1297
1298# Check for Endace DAG card support.
1299AC_ARG_WITH([dag],
1300AS_HELP_STRING([--with-dag@<:@=DIR@:>@],[include Endace DAG support (located in directory DIR, if supplied).  @<:@default=yes, if present@:>@]),
1301[
1302	if test "$withval" = no
1303	then
1304		# User doesn't want DAG support.
1305		want_dag=no
1306	elif test "$withval" = yes
1307	then
1308		# User wants DAG support but hasn't specified a directory.
1309		want_dag=yes
1310	else
1311		# User wants DAG support and has specified a directory, so use the provided value.
1312		want_dag=yes
1313		dag_root=$withval
1314	fi
1315],[
1316	if test "$V_PCAP" = dag; then
1317		# User requested DAG-only libpcap, so we'd better have
1318		# the DAG API.
1319		want_dag=yes
1320	elif test "xxx_only" = yes; then
1321		# User requested something-else-only pcap, so they don't
1322		# want DAG support.
1323		want_dag=no
1324	else
1325		#
1326		# Use DAG API if present, otherwise don't
1327		#
1328		want_dag=ifpresent
1329	fi
1330])
1331
1332AC_ARG_WITH([dag-includes],
1333AS_HELP_STRING([--with-dag-includes=IDIR],[Endace DAG include directory, if not DIR/include]),
1334[
1335	# User wants DAG support and has specified a header directory, so use the provided value.
1336	want_dag=yes
1337	dag_include_dir=$withval
1338],[])
1339
1340AC_ARG_WITH([dag-libraries],
1341AS_HELP_STRING([--with-dag-libraries=LDIR],[Endace DAG library directory, if not DIR/lib]),
1342[
1343	# User wants DAG support and has specified a library directory, so use the provided value.
1344	want_dag=yes
1345	dag_lib_dir=$withval
1346],[])
1347
1348if test "$want_dag" != no; then
1349
1350	# If necessary, set default paths for DAG API headers and libraries.
1351	if test -z "$dag_root"; then
1352		dag_root=/usr/local
1353	fi
1354
1355	if test -z "$dag_include_dir"; then
1356		dag_include_dir="$dag_root/include"
1357	fi
1358
1359	if test -z "$dag_lib_dir"; then
1360		dag_lib_dir="$dag_root/lib"
1361		#
1362		# Handle multiarch systems.
1363		#
1364		if test -d "$dag_lib_dir/$host"
1365		then
1366			dag_lib_dir="$dag_lib_dir/$host"
1367		fi
1368	fi
1369
1370	AC_LBL_SAVE_CHECK_STATE
1371	CFLAGS="$CFLAGS -I$dag_include_dir"
1372	AC_CHECK_HEADERS([dagapi.h])
1373	AC_LBL_RESTORE_CHECK_STATE
1374
1375	if test "$ac_cv_header_dagapi_h" = yes; then
1376
1377		V_INCLS="$V_INCLS -I$dag_include_dir"
1378
1379		if test $V_PCAP != dag ; then
1380			 MODULE_C_SRC="$MODULE_C_SRC pcap-dag.c"
1381		fi
1382
1383		# Check for various DAG API functions.
1384		# Don't need to save and restore LIBS to prevent -ldag being
1385		# included if there's a found-action (arg 3).
1386		AC_LBL_SAVE_CHECK_STATE
1387		LDFLAGS="-L$dag_lib_dir"
1388		AC_CHECK_LIB([dag], [dag_attach_stream],
1389		    [
1390			#
1391			# We assume that if we have libdag we have
1392			# libdagconf, as they're installed at the
1393			# same time from the same package.
1394			#
1395			ADDITIONAL_LIBS="-L$dag_lib_dir $ADDITIONAL_LIBS -ldag -ldagconf"
1396			ADDITIONAL_LIBS_STATIC="-L$dag_lib_dir $ADDITIONAL_LIBS_STATIC -ldag -ldagconf"
1397			LIBS_PRIVATE="-L$dag_lib_dir $LIBS_PRIVATE -ldag -ldagconf"
1398		    ],
1399		    [AC_MSG_ERROR(DAG library lacks streams support)])
1400		AC_CHECK_LIB([dag], [dag_attach_stream64], [dag_large_streams="1"], [dag_large_streams="0"])
1401		AC_CHECK_LIB([dag],[dag_get_erf_types], [
1402			AC_DEFINE(HAVE_DAG_GET_ERF_TYPES, 1, [define if you have dag_get_erf_types()])])
1403		AC_CHECK_LIB([dag],[dag_get_stream_erf_types], [
1404			AC_DEFINE(HAVE_DAG_GET_STREAM_ERF_TYPES, 1, [define if you have dag_get_stream_erf_types()])])
1405		AC_LBL_RESTORE_CHECK_STATE
1406
1407		#
1408		# We assume that if we have libdag we have libdagconf,
1409		# as they're installed at the same time from the same
1410		# package.
1411		#
1412		if test "$dag_large_streams" = 1; then
1413			AC_DEFINE(HAVE_DAG_LARGE_STREAMS_API, 1, [define if you have large streams capable DAG API])
1414			AC_LBL_SAVE_CHECK_STATE
1415			LIBS="$LIBS -ldag -ldagconf"
1416			LDFLAGS="$LDFLAGS -L$dag_lib_dir"
1417			AC_CHECK_LIB([vdag],[vdag_set_device_info], [ac_dag_have_vdag="1"], [ac_dag_have_vdag="0"])
1418			AC_LBL_RESTORE_CHECK_STATE
1419			if test "$ac_dag_have_vdag" = 1; then
1420				AC_DEFINE(HAVE_DAG_VDAG, 1, [define if you have vdag_set_device_info()])
1421				if test "$ac_lbl_have_pthreads" != "found"; then
1422					AC_MSG_ERROR([DAG requires pthreads, but we didn't find them])
1423				fi
1424				ADDITIONAL_LIBS="$ADDITIONAL_LIBS $PTHREAD_LIBS"
1425				ADDITIONAL_LIBS_STATIC="$ADDITIONAL_LIBS_STATIC $PTHREAD_LIBS"
1426				LIBS_PRIVATE="$LIBS_PRIVATE $PTHREAD_LIBS"
1427			fi
1428		fi
1429
1430		AC_DEFINE(HAVE_DAG_API, 1, [define if you have the DAG API])
1431	else
1432		if test "$V_PCAP" = dag; then
1433			# User requested "dag" capture type but we couldn't
1434			# find the DAG API support.
1435			AC_MSG_ERROR([DAG support requested with --with-pcap=dag, but the DAG headers weren't found at $dag_include_dir: make sure the DAG support is installed, specify a different path or paths if necessary, or don't request DAG support])
1436		fi
1437
1438		if test "$want_dag" = yes; then
1439			# User wanted DAG support but we couldn't find it.
1440			AC_MSG_ERROR([DAG support requested with --with-dag, but the DAG headers weren't found at $dag_include_dir: make sure the DAG support is installed, specify a different path or paths if necessary, or don't request DAG support])
1441		fi
1442	fi
1443	CFLAGS="$save_CFLAGS"
1444fi
1445
1446AC_ARG_WITH(septel,
1447AS_HELP_STRING([--with-septel@<:@=DIR@:>@],[include Septel support (located in directory DIR, if supplied).  @<:@default=yes, if present@:>@]),
1448[
1449	if test "$withval" = no
1450	then
1451		want_septel=no
1452	elif test "$withval" = yes
1453	then
1454		want_septel=yes
1455		septel_root=
1456	else
1457		want_septel=yes
1458		septel_root=$withval
1459	fi
1460],[
1461	if test "$V_PCAP" = septel; then
1462		# User requested Septel-only libpcap, so we'd better have
1463		# the Septel API.
1464		want_septel=yes
1465	elif test "xxx_only" = yes; then
1466		# User requested something-else-only pcap, so they don't
1467		# want Septel support.
1468		want_septel=no
1469	else
1470		#
1471		# Use Septel API if present, otherwise don't
1472		#
1473		want_septel=ifpresent
1474	fi
1475])
1476
1477ac_cv_lbl_septel_api=no
1478if test "$with_septel" != no; then
1479
1480	AC_MSG_CHECKING([whether we have Septel API headers])
1481
1482	# If necessary, set default paths for Septel API headers and libraries.
1483	if test -z "$septel_root"; then
1484		septel_root=$srcdir/../septel
1485	fi
1486
1487	septel_tools_dir="$septel_root"
1488	septel_include_dir="$septel_root/INC"
1489
1490	if test -r "$septel_include_dir/msg.h"; then
1491		ac_cv_lbl_septel_api=yes
1492	fi
1493
1494	if test "$ac_cv_lbl_septel_api" = yes; then
1495		AC_MSG_RESULT([yes ($septel_include_dir)])
1496
1497		V_INCLS="$V_INCLS -I$septel_include_dir"
1498		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"
1499		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"
1500
1501		if test "$V_PCAP" != septel ; then
1502			 MODULE_C_SRC="$MODULE_C_SRC pcap-septel.c"
1503		fi
1504
1505		AC_DEFINE(HAVE_SEPTEL_API, 1, [define if you have the Septel API])
1506	else
1507		AC_MSG_RESULT(no)
1508
1509		if test "$V_PCAP" = septel; then
1510			# User requested "septel" capture type but
1511			# we couldn't find the Septel API support.
1512			AC_MSG_ERROR([Septel support requested with --with-pcap=septel, but the Septel headers weren't found at $septel_include_dir: make sure the Septel support is installed, specify a different path or paths if necessary, or don't request Septel support])
1513		fi
1514
1515		if test "$want_septel" = yes; then
1516			# User wanted Septel support but we couldn't find it.
1517			AC_MSG_ERROR([Septel support requested with --with-septel, but the Septel headers weren't found at $septel_include_dir: make sure the Septel support is installed, specify a different path or paths if necessary, or don't request Septel support])
1518		fi
1519	fi
1520fi
1521
1522# Check for Myricom SNF support.
1523AC_ARG_WITH([snf],
1524AS_HELP_STRING([--with-snf@<:@=DIR@:>@],[include Myricom SNF support (located in directory DIR, if supplied).  @<:@default=yes, if present@:>@]),
1525[
1526	if test "$withval" = no
1527	then
1528		# User explicitly doesn't want SNF
1529		want_snf=no
1530	elif test "$withval" = yes
1531	then
1532		# User wants SNF support but hasn't specified a directory.
1533		want_snf=yes
1534	else
1535		# User wants SNF support with a specified directory.
1536		want_snf=yes
1537		snf_root=$withval
1538	fi
1539],[
1540	if test "$V_PCAP" = snf; then
1541		# User requested Sniffer-only libpcap, so we'd better have
1542		# the Sniffer API.
1543		want_snf=yes
1544	elif test "xxx_only" = yes; then
1545		# User requested something-else-only pcap, so they don't
1546		# want SNF support.
1547		want_snf=no
1548	else
1549		#
1550		# Use Sniffer API if present, otherwise don't
1551		#
1552		want_snf=ifpresent
1553	fi
1554])
1555
1556AC_ARG_WITH([snf-includes],
1557AS_HELP_STRING([--with-snf-includes=IDIR],[Myricom SNF include directory, if not DIR/include]),
1558[
1559	# User wants SNF with specific header directory
1560	want_snf=yes
1561	snf_include_dir=$withval
1562],[])
1563
1564AC_ARG_WITH([snf-libraries],
1565AS_HELP_STRING([--with-snf-libraries=LDIR],[Myricom SNF library directory, if not DIR/lib]),
1566[
1567	# User wants SNF with specific lib directory
1568	want_snf=yes
1569	snf_lib_dir=$withval
1570],[])
1571
1572ac_cv_lbl_snf_api=no
1573if test "$with_snf" != no; then
1574
1575	AC_MSG_CHECKING(whether we have Myricom Sniffer API)
1576
1577	# If necessary, set default paths for Sniffer headers and libraries.
1578	if test -z "$snf_root"; then
1579		snf_root=/opt/snf
1580	fi
1581
1582	if test -z "$snf_include_dir"; then
1583		snf_include_dir="$snf_root/include"
1584	fi
1585
1586	if test -z "$snf_lib_dir"; then
1587		snf_lib_dir="$snf_root/lib"
1588		#
1589		# Handle multiarch systems.
1590		#
1591		if test -d "$snf_lib_dir/$host"
1592		then
1593			snf_lib_dir="$snf_lib_dir/$host"
1594		fi
1595	fi
1596
1597	if test -f "$snf_include_dir/snf.h"; then
1598		# We found a header; make sure we can link with the library
1599		AC_LBL_SAVE_CHECK_STATE
1600		LDFLAGS="$LDFLAGS -L$snf_lib_dir"
1601		AC_CHECK_LIB([snf], [snf_init], [ac_cv_lbl_snf_api="yes"])
1602		AC_LBL_RESTORE_CHECK_STATE
1603		if test "$ac_cv_lbl_snf_api" = no; then
1604			AC_MSG_ERROR(SNF API cannot correctly be linked; check config.log)
1605		fi
1606	fi
1607
1608	if test "$ac_cv_lbl_snf_api" = yes; then
1609		AC_MSG_RESULT([yes ($snf_root)])
1610
1611		V_INCLS="$V_INCLS -I$snf_include_dir"
1612		ADDITIONAL_LIBS="$ADDITIONAL_LIBS -L$snf_lib_dir -lsnf"
1613		ADDITIONAL_LIBS_STATIC="$ADDITIONAL_LIBS_STATIC -L$snf_lib_dir -lsnf"
1614		LIBS_PRIVATE="$LIBS_PRIVATE -L$snf_lib_dir -lsnf"
1615
1616		if test "$V_PCAP" != snf ; then
1617			MODULE_C_SRC="$MODULE_C_SRC pcap-snf.c"
1618		fi
1619
1620		AC_DEFINE(HAVE_SNF_API, 1, [define if you have the Myricom SNF API])
1621	else
1622		AC_MSG_RESULT(no)
1623
1624		if test "$want_snf" = yes; then
1625			# User requested "snf" capture type but
1626			# we couldn't find the Sniffer API support.
1627			AC_MSG_ERROR([Myricom Sniffer support requested with --with-pcap=snf, but the Sniffer headers weren't found at $snf_include_dir: make sure the Sniffer support is installed, specify a different path or paths if necessary, or don't request Sniffer support])
1628		fi
1629
1630		if test "$want_snf" = yes; then
1631			AC_MSG_ERROR([Myricom Sniffer support requested with --with-snf, but the Sniffer headers weren't found at $snf_include_dir: make sure the Sniffer support is installed, specify a different path or paths if necessary, or don't request Sniffer support])
1632		fi
1633	fi
1634fi
1635
1636# Check for Riverbed TurboCap support.
1637AC_ARG_WITH([turbocap],
1638AS_HELP_STRING([--with-turbocap@<:@=DIR@:>@],[include Riverbed TurboCap support (located in directory DIR, if supplied).  @<:@default=yes, if present@:>@]),
1639[
1640	if test "$withval" = no
1641	then
1642		# User explicitly doesn't want TurboCap
1643		want_turbocap=no
1644	elif test "$withval" = yes
1645	then
1646		# User wants TurboCap support but hasn't specified a directory.
1647		want_turbocap=yes
1648	else
1649		# User wants TurboCap support with a specified directory.
1650		want_turbocap=yes
1651		turbocap_root=$withval
1652	fi
1653],[
1654	if test "xxx_only" = yes; then
1655		# User requested something-else-only pcap, so they don't
1656		# want TurboCap support.
1657		want_turbocap=no
1658	else
1659		#
1660		# Use TurboCap API if present, otherwise don't
1661		#
1662		want_turbocap=ifpresent
1663	fi
1664])
1665
1666ac_cv_lbl_turbocap_api=no
1667if test "$want_turbocap" != no; then
1668
1669	AC_MSG_CHECKING(whether TurboCap is supported)
1670
1671	AC_LBL_SAVE_CHECK_STATE
1672	if test ! -z "$turbocap_root"; then
1673		TURBOCAP_CFLAGS="-I$turbocap_root/include"
1674		TURBOCAP_LDFLAGS="-L$turbocap_root/lib"
1675		CFLAGS="$CFLAGS $TURBOCAP_CFLAGS"
1676		LDFLAGS="$LDFLAGS $TURBOCAP_LDFLAGS"
1677	fi
1678
1679	AC_TRY_COMPILE(
1680	[
1681	    #include <TcApi.h>
1682	],
1683	[
1684	    TC_INSTANCE a; TC_PORT b; TC_BOARD c;
1685	    TC_INSTANCE i;
1686	    (void)TcInstanceCreateByName("foo", &i);
1687	],
1688	ac_cv_lbl_turbocap_api=yes)
1689
1690	AC_LBL_RESTORE_CHECK_STATE
1691	if test $ac_cv_lbl_turbocap_api = yes; then
1692		AC_MSG_RESULT(yes)
1693
1694		MODULE_C_SRC="$MODULE_C_SRC pcap-tc.c"
1695		V_INCLS="$V_INCLS $TURBOCAP_CFLAGS"
1696		ADDITIONAL_LIBS="$ADDITIONAL_LIBS $TURBOCAP_LDFLAGS -lTcApi -lpthread -lstdc++"
1697		ADDITIONAL_LIBS_STATIC="$ADDITIONAL_LIBS_STATIC $TURBOCAP_LDFLAGS -lTcApi -lpthread -lstdc++"
1698		LIBS_PRIVATE="$LIBS_PRIVATE $TURBOCAP_LDFLAGS -lTcApi -lpthread -lstdc++"
1699
1700		AC_DEFINE(HAVE_TC_API, 1, [define if you have the TurboCap API])
1701	else
1702		AC_MSG_RESULT(no)
1703
1704		if test "$want_turbocap" = yes; then
1705			# User wanted Turbo support but we couldn't find it.
1706			AC_MSG_ERROR([TurboCap support requested with --with-turbocap, but the TurboCap headers weren't found: make sure the TurboCap support is installed or don't request TurboCap support])
1707		fi
1708	fi
1709fi
1710
1711dnl
1712dnl Allow the user to enable remote capture.
1713dnl It's off by default, as that increases the attack surface of
1714dnl libpcap, exposing it to malicious servers.
1715dnl
1716AC_MSG_CHECKING([whether to enable remote packet capture])
1717AC_ARG_ENABLE([remote],
1718   [AS_HELP_STRING([--enable-remote],
1719     [enable remote packet capture @<:@default=no@:>@])],
1720   [],
1721   [enableval=no])
1722case "$enableval" in
1723yes)	AC_MSG_RESULT(yes)
1724	AC_WARN([Remote packet capture may expose libpcap-based applications])
1725	AC_WARN([to attacks by malicious remote capture servers!])
1726	#
1727	# rpcapd requires pthreads on UN*X.
1728	#
1729	if test "$ac_lbl_have_pthreads" != "found"; then
1730		AC_MSG_ERROR([rpcapd requires pthreads, but we didn't find them])
1731	fi
1732	#
1733	# It also requires crypt().
1734	# Do we have it in the system libraries?
1735	#
1736	AC_CHECK_FUNC(crypt,,
1737	    [
1738		#
1739		# No.  Do we have it in -lcrypt?
1740		#
1741		AC_CHECK_LIB(crypt, crypt,
1742		    [
1743			#
1744			# Yes; add -lcrypt to the libraries for rpcapd.
1745			#
1746			RPCAPD_LIBS="$RPCAPD_LIBS -lcrypt"
1747		    ],
1748		    [
1749			AC_MSG_ERROR([rpcapd requires crypt(), but we didn't find it])
1750		    ])
1751	    ])
1752
1753	#
1754	# OK, we have crypt().  Do we have getspnam()?
1755	#
1756	AC_CHECK_FUNCS(getspnam)
1757
1758	#
1759	# Check for various members of struct msghdr.
1760	#
1761	AC_CHECK_MEMBERS([struct msghdr.msg_control],,,
1762	    [
1763		#include "ftmacros.h"
1764		#include <sys/socket.h>
1765	    ])
1766	AC_CHECK_MEMBERS([struct msghdr.msg_flags],,,
1767	    [
1768		#include "ftmacros.h"
1769		#include <sys/socket.h>
1770	    ])
1771
1772	#
1773	# Optionally, we may want to support SSL.
1774	# Check for OpenSSL/libressl.
1775	#
1776	# First, try looking for it with pkg-config, if we have it.
1777	#
1778	# Homebrew's pkg-config does not, by default, look for
1779	# pkg-config files for packages it has installed.
1780	# Furthermore, at least for OpenSSL, they appear to be
1781	# dumped in package-specific directories whose paths are
1782	# not only package-specific but package-version-specific.
1783	#
1784	# So the only way to find openssl is to get the value of
1785	# PKG_CONFIG_PATH from "brew --env openssl" and add that
1786	# to PKG_CONFIG_PATH.  (No, we can't just assume it's under
1787	# /usr/local; Homebrew have conveniently chosen to put it
1788	# under /opt/homebrew on ARM.)
1789	#
1790	# That's the nice thing about Homebrew - it makes things easier!
1791	# Thanks!
1792	#
1793	save_PKG_CONFIG_PATH="$PKG_CONFIG_PATH"
1794	if test -n "$BREW"; then
1795		openssl_pkgconfig_dir=`$BREW --env --plain openssl | sed -n 's/PKG_CONFIG_PATH: //p'`
1796		PKG_CONFIG_PATH="$openssl_pkgconfig_dir:$PKG_CONFIG_PATH"
1797	fi
1798	PKG_CHECK_MODULES(OPENSSL, openssl,
1799	    [
1800		#
1801		# We found OpenSSL/libressl.
1802		#
1803		HAVE_OPENSSL=yes
1804		REQUIRES_PRIVATE="$REQUIRES_PRIVATE openssl"
1805	    ])
1806	PKG_CONFIG_PATH="$save_PKG_CONFIG_PATH"
1807
1808	#
1809	# If it wasn't found, and we have Homebrew installed, see
1810	# if it's in Homebrew.
1811	#
1812	if test "x$HAVE_OPENSSL" != "xyes" -a -n "$BREW"; then
1813		AC_MSG_CHECKING(for openssl in Homebrew)
1814		#
1815		# The brew man page lies when it speaks of
1816		# $BREW --prefix --installed <formula>
1817		# outputting nothing.  In Homebrew 3.3.16,
1818		# it produces output regardless of whether
1819		# the formula is installed or not, so we
1820		# send the standard output and error to
1821		# the bit bucket.
1822		#
1823		if $BREW --prefix --installed openssl >/dev/null 2>&1; then
1824			#
1825			# Yes.  Get the include directory and library
1826			# directory.  (No, we can't just assume it's
1827			# under /usr/local; Homebrew have conveniently
1828			# chosen to put it under /opt/homebrew on ARM.)
1829			#
1830			AC_MSG_RESULT(yes)
1831			HAVE_OPENSSL=yes
1832			openssl_path=`$BREW --prefix openssl`
1833			OPENSSL_CFLAGS="-I$openssl_path/include"
1834			OPENSSL_LIBS="-L$openssl_path/lib -lssl -lcrypto"
1835			OPENSSL_LIBS_STATIC="-L$openssl_path/lib -lssl -lcrypto"
1836			OPENSSL_LIBS_PRIVATE="-L$openssl_path/lib -lssl -lcrypto"
1837		else
1838			AC_MSG_RESULT(no)
1839		fi
1840	fi
1841
1842	#
1843	# If it wasn't found, and /usr/local/include and /usr/local/lib
1844	# exist, check if it's in /usr/local.  (We check whether they
1845	# exist because, if they don't exist, the compiler will warn
1846	# about that and then ignore the argument, so they test
1847	# using just the system header files and libraries.)
1848	#
1849	# We include the standard include file to 1) make sure that
1850	# it's installed (if it's just a shared library for the
1851	# benefit of existing programs, that's not useful) and 2)
1852	# because SSL_library_init() is a library routine in some
1853	# versions and a #defined wrapper around OPENSSL_init_ssl()
1854	# in others.
1855	#
1856	if test "x$HAVE_OPENSSL" != "xyes" -a -d "/usr/local/include" -a -d "/usr/local/lib"; then
1857		AC_LBL_SAVE_CHECK_STATE
1858		CFLAGS="$CFLAGS -I/usr/local/include"
1859		LIBS="$LIBS -L/usr/local/lib -lssl -lcrypto"
1860		AC_MSG_CHECKING(whether we have OpenSSL/libressl in /usr/local that we can use)
1861		AC_TRY_LINK(
1862		    [
1863#include <openssl/ssl.h>
1864		    ],
1865		    [
1866SSL_library_init();
1867return 0;
1868		    ],
1869		    [
1870			AC_MSG_RESULT(yes)
1871			HAVE_OPENSSL=yes
1872			OPENSSL_CFLAGS="-I/usr/local/include"
1873			OPENSSL_LIBS="-L/usr/local/lib -lssl -lcrypto"
1874			OPENSSL_LIBS_STATIC="-L/usr/local/lib -lssl -lcrypto"
1875			OPENSSL_LIBS_PRIVATE="-L/usr/local/lib -lssl -lcrypto"
1876		    ],
1877		    AC_MSG_RESULT(no))
1878		AC_LBL_RESTORE_CHECK_STATE
1879	fi
1880
1881	#
1882	# If it wasn't found, check if it's a system library.
1883	#
1884	# We include the standard include file to 1) make sure that
1885	# it's installed (if it's just a shared library for the
1886	# benefit of existing programs, that's not useful) and 2)
1887	# because SSL_library_init() is a library routine in some
1888	# versions and a #defined wrapper around OPENSSL_init_ssl()
1889	# in others.
1890	#
1891	if test "x$HAVE_OPENSSL" != "xyes"; then
1892		AC_LBL_SAVE_CHECK_STATE
1893		LIBS="$LIBS -lssl -lcrypto"
1894		AC_MSG_CHECKING(whether we have a system OpenSSL/libressl that we can use)
1895		AC_TRY_LINK(
1896		    [
1897#include <openssl/ssl.h>
1898		    ],
1899		    [
1900SSL_library_init();
1901return 0;
1902		    ],
1903		    [
1904			AC_MSG_RESULT(yes)
1905			HAVE_OPENSSL=yes
1906			OPENSSL_LIBS="-lssl -lcrypto"
1907			OPENSSL_LIBS_STATIC="-lssl -lcrypto"
1908			OPENSSL_LIBS_PRIVATE="-lssl -lcrypto"
1909		    ],
1910		    AC_MSG_RESULT(no))
1911		AC_LBL_RESTORE_CHECK_STATE
1912	fi
1913
1914	#
1915	# OK, did we find it?
1916	#
1917	if test "x$HAVE_OPENSSL" = "xyes"; then
1918		AC_DEFINE([HAVE_OPENSSL], [1], [Use OpenSSL])
1919		V_INCLS="$V_INCLS $OPENSSL_CFLAGS"
1920		ADDITIONAL_LIBS="$ADDITIONAL_LIBS $OPENSSL_LIBS"
1921		ADDITIONAL_LIBS_STATIC="$ADDITIONAL_LIBS_STATIC $OPENSSL_LIBS_STATIC"
1922		LIBS_PRIVATE="$LIBS_PRIVATE $OPENSSL_LIBS_PRIVATE"
1923		REQUIRES_PRIVATE="$REQUIRES_PRIVATE $OPENSSL_REQUIRES_PRIVATE"
1924	else
1925		AC_MSG_NOTICE(OpenSSL not found)
1926	fi
1927
1928	AC_DEFINE(ENABLE_REMOTE,,
1929	    [Define to 1 if remote packet capture is to be supported])
1930	REMOTE_C_SRC="$REMOTE_C_SRC pcap-new.c pcap-rpcap.c rpcap-protocol.c sockutils.c sslutils.c"
1931	BUILD_RPCAPD=build-rpcapd
1932	INSTALL_RPCAPD=install-rpcapd
1933	;;
1934*)	AC_MSG_RESULT(no)
1935	;;
1936esac
1937
1938AC_MSG_CHECKING(whether to build optimizer debugging code)
1939AC_ARG_ENABLE(optimizer-dbg,
1940AS_HELP_STRING([--enable-optimizer-dbg],[build optimizer debugging code]))
1941if test "$enable_optimizer_dbg" = "yes"; then
1942	AC_DEFINE(BDEBUG,1,[Enable optimizer debugging])
1943fi
1944AC_MSG_RESULT(${enable_optimizer_dbg-no})
1945
1946AC_MSG_CHECKING(whether to build parser debugging code)
1947AC_ARG_ENABLE(yydebug,
1948AS_HELP_STRING([--enable-yydebug],[build parser debugging code]))
1949if test "$enable_yydebug" = "yes"; then
1950	AC_DEFINE(YYDEBUG,1,[Enable parser debugging])
1951fi
1952AC_MSG_RESULT(${enable_yydebug-no})
1953
1954#
1955# Look for {f}lex.
1956#
1957AC_PROG_LEX
1958if test "$LEX" = ":"; then
1959	AC_MSG_ERROR([Neither flex nor lex was found.])
1960fi
1961
1962#
1963# Make sure {f}lex supports the -P, --header-file, and --nounput flags
1964# and supports processing our scanner.l.
1965#
1966AC_CACHE_CHECK([for capable lex], tcpdump_cv_capable_lex,
1967	if $LEX -P pcap_ --header-file=/dev/null --nounput -t $srcdir/scanner.l > /dev/null 2>&1; then
1968	    tcpdump_cv_capable_lex=yes
1969	else
1970	    tcpdump_cv_capable_lex=insufficient
1971	fi)
1972if test $tcpdump_cv_capable_lex = insufficient ; then
1973	AC_MSG_ERROR([$LEX is insufficient to compile libpcap.
1974 libpcap requires Flex 2.5.31 or later, or a compatible version of lex.
1975 If a suitable version of Lex/Flex is available as a non-standard command
1976 and/or not in the PATH, you can specify it using the LEX environment
1977 variable. That said, on some systems the error can mean that Flex/Lex is
1978 actually acceptable, but m4 is not. Likewise, if a suitable version of
1979 m4 (such as GNU M4) is available but has not been detected, you can
1980 specify it using the M4 environment variable.])
1981fi
1982
1983#
1984# Look for yacc/bison/byacc.
1985# If it's Bison, we do not want -y, as 1) we will be using -o to cause
1986# the output for XXX.y to be written to XXX.c and 2) we don't want
1987# it to issue warnings about stuff not supported by POSIX YACC - we
1988# want to use that stuff, and don't care whether plain YACC supports
1989# it or not, we require either Bison or Berkeley YACC.
1990#
1991BISON_BYACC=""
1992#
1993# Look for Bison.
1994#
1995AC_CHECK_PROGS(BISON_BYACC, bison)
1996if test x"$BISON_BYACC" != x; then
1997	#
1998	# We found Bison.
1999	#
2000	# Bison prior to 2.4(.1) doesn't support "%define api.pure", so use
2001	# "%pure-parser".
2002	#
2003	bison_major_version=`$BISON_BYACC -V | sed -n 's/.* \(@<:@1-9@:>@@<:@0-9@:>@*\)\.@<:@0-9@:>@@<:@0-9.@:>@*/\1/p'`
2004	bison_minor_version=`$BISON_BYACC -V | sed -n 's/.* @<:@1-9@:>@@<:@0-9@:>@*\.\(@<:@0-9@:>@+\).*/\1/p'`
2005	if test "$bison_major_version" -lt 2 -o \
2006	    \( "$bison_major_version" -eq 2 -a "$bison_major_version" -lt 4 \)
2007	then
2008		REENTRANT_PARSER="%pure-parser"
2009	else
2010		REENTRANT_PARSER="%define api.pure"
2011	fi
2012else
2013	#
2014	# We didn't find Bison; check for Berkeley YACC, under the
2015	# names byacc and yacc.
2016	#
2017	AC_CHECK_PROGS(BISON_BYACC, byacc yacc)
2018	if test x"$BISON_BYACC" != x; then
2019		#
2020		# Make sure this is Berkeley YACC, not AT&T YACC;
2021		# the latter doesn't support reentrant parsers.
2022		# Run it with "-V"; that succeeds and reports the
2023		# version number with Berkeley YACC, but will
2024		# (probably) fail with various vendor flavors
2025		# of AT&T YACC.
2026		#
2027		# Hopefully this also eliminates any versions
2028		# of Berkeley YACC that don't support reentrant
2029		# parsers, if there are any.
2030		#
2031		AC_CACHE_CHECK([for capable yacc], tcpdump_cv_capable_yacc,
2032		    if $BISON_BYACC -V >/dev/null 2>&1; then
2033			tcpdump_cv_capable_yacc=yes
2034		    else
2035			tcpdump_cv_capable_yacc=insufficient
2036		    fi)
2037		if test $tcpdump_cv_capable_yacc = insufficient ; then
2038		    AC_MSG_ERROR([$BISON_BYACC is insufficient to compile libpcap.
2039 libpcap requires Bison, a newer version of Berkeley YACC with support
2040 for reentrant parsers, or another YACC compatible with them.])
2041		fi
2042	else
2043		#
2044		# OK, we found neither byacc nor yacc.
2045		#
2046		AC_MSG_ERROR([Neither bison, byacc, nor yacc was found.
2047 libpcap requires Bison, a newer version of Berkeley YACC with support
2048 for reentrant parsers, or another YACC compatible with them.])
2049	fi
2050
2051	#
2052	# Berkeley YACC doesn't support "%define api.pure", so use
2053	# "%pure-parser".
2054	#
2055	REENTRANT_PARSER="%pure-parser"
2056fi
2057AC_SUBST(BISON_BYACC)
2058AC_SUBST(REENTRANT_PARSER)
2059
2060#
2061# Do various checks for various OSes and versions of those OSes.
2062#
2063# Assume, by default, no support for shared libraries and V7/BSD
2064# convention for man pages (devices in section 4, file formats in
2065# section 5, miscellaneous info in section 7, administrative commands
2066# and daemons in section 8).  Individual cases can override this.
2067#
2068DYEXT="none"
2069MAN_DEVICES=4
2070MAN_FILE_FORMATS=5
2071MAN_MISC_INFO=7
2072MAN_ADMIN_COMMANDS=8
2073case "$host_os" in
2074
2075aix*)
2076	dnl Workaround to enable certain features
2077	AC_DEFINE(_SUN,1,[define on AIX to get certain functions])
2078
2079	#
2080	# AIX makes it fun to build shared and static libraries,
2081	# because they're *both* ".a" archive libraries.  We
2082	# build the static library for the benefit of the traditional
2083	# scheme of building libpcap and tcpdump in subdirectories of
2084	# the same directory, with tcpdump statically linked with the
2085	# libpcap in question, but we also build a shared library as
2086	# "libpcap.shareda" and install *it*, rather than the static
2087	# library, as "libpcap.a".
2088	#
2089	DYEXT="shareda"
2090
2091	case "$V_PCAP" in
2092
2093	dlpi)
2094		#
2095		# If we're using DLPI, applications will need to
2096		# use /lib/pse.exp if present, as we use the
2097		# STREAMS routines.
2098		#
2099		pseexe="/lib/pse.exp"
2100		AC_MSG_CHECKING(for $pseexe)
2101		if test -f $pseexe ; then
2102			AC_MSG_RESULT(yes)
2103			LIBS="-I:$pseexe"
2104		fi
2105		;;
2106
2107	bpf)
2108		#
2109		# If we're using BPF, we need "-lodm" and "-lcfg", as
2110		# we use them to load the BPF module.
2111		#
2112		LIBS="-lodm -lcfg"
2113		;;
2114	esac
2115	;;
2116
2117darwin*)
2118	DYEXT="dylib"
2119	V_CCOPT="$V_CCOPT -fno-common"
2120	AC_ARG_ENABLE(universal,
2121	AS_HELP_STRING([--disable-universal],[don't build universal on macOS]))
2122	if test "$enable_universal" != "no"; then
2123		case "$host_os" in
2124
2125		darwin[[0-7]].*)
2126			#
2127			# Pre-Tiger.  Build only for 32-bit PowerPC; no
2128			# need for any special compiler or linker flags.
2129			#
2130			;;
2131
2132		darwin8.[[0123]]|darwin8.[[0123]].*)
2133			#
2134			# Tiger, prior to Intel support.  Build
2135			# libraries and executables for 32-bit PowerPC
2136			# and 64-bit PowerPC, with 32-bit PowerPC first.
2137			# (I'm guessing that's what Apple does.)
2138			#
2139			# (The double brackets are needed because
2140			# autotools/m4 use brackets as a quoting
2141			# character; the double brackets turn into
2142			# single brackets in the generated configure
2143			# file.)
2144			#
2145			V_LIB_CCOPT_FAT="-arch ppc -arch ppc64"
2146			V_LIB_LDFLAGS_FAT="-arch ppc -arch ppc64"
2147			V_PROG_CCOPT_FAT="-arch ppc -arch ppc64"
2148			V_PROG_LDFLAGS_FAT="-arch ppc -arch ppc64"
2149			;;
2150
2151		darwin8.[[456]]|darwin8.[[456]].*)
2152			#
2153			# Tiger, subsequent to Intel support but prior
2154			# to x86-64 support.  Build libraries and
2155			# executables for 32-bit PowerPC, 64-bit
2156			# PowerPC, and 32-bit x86, with 32-bit PowerPC
2157			# first.  (I'm guessing that's what Apple does.)
2158			#
2159			# (The double brackets are needed because
2160			# autotools/m4 use brackets as a quoting
2161			# character; the double brackets turn into
2162			# single brackets in the generated configure
2163			# file.)
2164			#
2165			V_LIB_CCOPT_FAT="-arch ppc -arch ppc64 -arch i386"
2166			V_LIB_LDFLAGS_FAT="-arch ppc -arch ppc64 -arch i386"
2167			V_PROG_CCOPT_FAT="-arch ppc -arch ppc64 -arch i386"
2168			V_PROG_LDFLAGS_FAT="-arch ppc -arch ppc64 -arch i386"
2169			;;
2170
2171		darwin8.*)
2172			#
2173			# All other Tiger, so subsequent to x86-64
2174			# support.  Build libraries and executables for
2175			# 32-bit PowerPC, 64-bit PowerPC, 32-bit x86,
2176			# and x86-64, with 32-bit PowerPC first.  (I'm
2177			# guessing that's what Apple does.)
2178			#
2179			V_LIB_CCOPT_FAT="-arch ppc -arch ppc64 -arch i386 -arch x86_64"
2180			V_LIB_LDFLAGS_FAT="-arch ppc -arch ppc64 -arch i386 -arch x86_64"
2181			V_PROG_CCOPT_FAT="-arch ppc -arch ppc64 -arch i386 -arch x86_64"
2182			V_PROG_LDFLAGS_FAT="-arch ppc -arch ppc64 -arch i386 -arch x86_64"
2183			;;
2184
2185		darwin9.*)
2186			#
2187			# Leopard.  Build libraries for 32-bit PowerPC,
2188			# 64-bit PowerPC, 32-bit x86, and x86-64, with
2189			# 32-bit PowerPC first, and build executables
2190			# for 32-bit x86 and 32-bit PowerPC, with 32-bit
2191			# x86 first.  (That's what Apple does.)
2192			#
2193			V_LIB_CCOPT_FAT="-arch ppc -arch ppc64 -arch i386 -arch x86_64"
2194			V_LIB_LDFLAGS_FAT="-arch ppc -arch ppc64 -arch i386 -arch x86_64"
2195			V_PROG_CCOPT_FAT="-arch i386 -arch ppc"
2196			V_PROG_LDFLAGS_FAT="-arch i386 -arch ppc"
2197			;;
2198
2199		darwin10.*)
2200			#
2201			# Snow Leopard.  Build libraries for x86-64,
2202			# 32-bit x86, and 32-bit PowerPC, with x86-64
2203			# first, and build executables for x86-64 and
2204			# 32-bit x86, with x86-64 first.  (That's what
2205			# Apple does, even though Snow Leopard doesn't
2206			# run on PPC, so PPC libpcap runs under Rosetta,
2207			# and Rosetta doesn't support BPF ioctls, so PPC
2208			# programs can't do live captures.)
2209			#
2210			V_LIB_CCOPT_FAT="-arch x86_64 -arch i386 -arch ppc"
2211			V_LIB_LDFLAGS_FAT="-arch x86_64 -arch i386 -arch ppc"
2212			V_PROG_CCOPT_FAT="-arch x86_64 -arch i386"
2213			V_PROG_LDFLAGS_FAT="-arch x86_64 -arch i386"
2214			;;
2215
2216		darwin1[[1-8]]*)
2217			#
2218			# Post-Snow Leopard, pre-Catalina.  Build
2219			# libraries for x86-64 and 32-bit x86, with
2220			# x86-64 first, and build executables only for
2221			# x86-64.  (That's what Apple does.)  This
2222			# requires no special flags for programs.
2223			#
2224			# We check whether we *can* build for i386 and,
2225			# if not, suggest that the user install the
2226			# /usr/include headers if they want to build
2227			# fat.
2228			#
2229			AC_MSG_CHECKING(whether building for 32-bit x86 is supported)
2230			AC_LBL_SAVE_CHECK_STATE
2231			CFLAGS="$CFLAGS -arch i386"
2232			AC_TRY_LINK(
2233			    [],
2234			    [return 0;],
2235			    [
2236				AC_MSG_RESULT(yes)
2237				V_LIB_CCOPT_FAT="-arch x86_64"
2238				V_LIB_LDFLAGS_FAT="-arch x86_64"
2239
2240				#
2241				# OpenSSL installation on macOS seems
2242				# to install only the libs for 64-bit
2243				# x86 - at least that's what Brew does:
2244				# only configure 32-bit builds if we
2245				# don't have OpenSSL.
2246				#
2247				if test "$HAVE_OPENSSL" != yes; then
2248					V_LIB_CCOPT_FAT="$V_LIB_CCOPT_FAT -arch i386"
2249					V_LIB_LDFLAGS_FAT="$V_LIB_LDFLAGS_FAT -arch i386"
2250				fi
2251			    ],
2252			    [
2253				AC_MSG_RESULT(no)
2254				V_LIB_CCOPT_FAT="-arch x86_64"
2255				V_LIB_LDFLAGS_FAT="-arch x86_64"
2256				case "$host_os" in
2257
2258				darwin18.*)
2259					#
2260					# Mojave; you need to install the
2261					# /usr/include headers to get
2262					# 32-bit x86 builds to work.
2263					#
2264					AC_MSG_WARN([Compiling for 32-bit x86 gives an error; try installing the command-line tools and, after that, installing the /usr/include headers from the /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg package])
2265					;;
2266
2267				*)
2268					#
2269					# Pre-Mojave; the command-line
2270					# tools should be sufficient to
2271					# enable 32-bit x86 builds.
2272					#
2273					AC_MSG_WARN([Compiling for 32-bit x86 gives an error; try installing the command-line tools])
2274					;;
2275				esac
2276			    ])
2277			AC_LBL_RESTORE_CHECK_STATE
2278			;;
2279
2280		darwin19*)
2281			#
2282			# Catalina.  Build libraries and executables
2283			# only for x86-64.  (That's what Apple does;
2284			# 32-bit x86 binaries are not supported on
2285			# Catalina.)
2286			#
2287			V_LIB_CCOPT_FAT="-arch x86_64"
2288			V_LIB_LDFLAGS_FAT="-arch x86_64"
2289			V_PROG_CCOPT_FAT="-arch x86_64"
2290			V_PROG_LDFLAGS_FAT="-arch x86_64"
2291			;;
2292
2293		darwin*)
2294			#
2295			# Post-Catalina.  Build libraries and
2296			# executables for x86-64 and ARM64.
2297			# (That's what Apple does, except they
2298			# build for arm64e, which may include
2299			# some of the pointer-checking extensions.)
2300			#
2301			# If we're building with libssl, make sure
2302			# we can build fat with it (i.e., that it
2303			# was built fat); if we can't, don't set
2304			# the target architectures, and just
2305			# build for the host we're on.
2306			#
2307			# Otherwise, just add both of them.
2308			#
2309			if test "$HAVE_OPENSSL" = yes; then
2310				AC_MSG_CHECKING(whether building fat with libssl is supported)
2311				AC_LBL_SAVE_CHECK_STATE
2312				CFLAGS="$CFLAGS -arch x86_64 -arch arm64"
2313				LDFLAGS="$LDFLAGS $OPENSSL_LIBS"
2314				AC_TRY_LINK(
2315				    [
2316					#include <openssl/ssl.h>
2317				    ],
2318				    [
2319					SSL_library_init();
2320					return 0;
2321				    ],
2322				    [
2323					AC_MSG_RESULT(yes)
2324					V_LIB_CCOPT_FAT="-arch x86_64 -arch arm64"
2325					V_LIB_LDFLAGS_FAT="-arch x86_64 -arch arm64"
2326					V_PROG_CCOPT_FAT="-arch x86_64 -arch arm64"
2327					V_PROG_LDFLAGS_FAT="-arch x86_64 -arch arm64"
2328				    ],
2329				    [AC_MSG_RESULT(no)]
2330				)
2331				AC_LBL_RESTORE_CHECK_STATE
2332			else
2333				V_LIB_CCOPT_FAT="-arch x86_64 -arch arm64"
2334				V_LIB_LDFLAGS_FAT="-arch x86_64 -arch arm64"
2335				V_PROG_CCOPT_FAT="-arch x86_64 -arch arm64"
2336				V_PROG_LDFLAGS_FAT="-arch x86_64 -arch arm64"
2337			fi
2338			;;
2339		esac
2340	fi
2341	;;
2342
2343hpux9*)
2344	AC_DEFINE(HAVE_HPUX9,1,[on HP-UX 9.x])
2345
2346	#
2347	# Use System V conventions for man pages.
2348	#
2349	MAN_ADMIN_COMMANDS=1m
2350	MAN_FILE_FORMATS=4
2351	MAN_MISC_INFO=5
2352	;;
2353
2354hpux10.0*)
2355
2356	#
2357	# Use System V conventions for man pages.
2358	#
2359	MAN_ADMIN_COMMANDS=1m
2360	MAN_FILE_FORMATS=4
2361	MAN_MISC_INFO=5
2362	;;
2363
2364hpux10.1*)
2365
2366	#
2367	# Use System V conventions for man pages.
2368	#
2369	MAN_ADMIN_COMMANDS=1m
2370	MAN_FILE_FORMATS=4
2371	MAN_MISC_INFO=5
2372	;;
2373
2374hpux*)
2375	dnl HPUX 10.20 and above is similar to HPUX 9, but
2376	dnl not the same....
2377	dnl
2378	dnl XXX - DYEXT should be set to "sl" if this is building
2379	dnl for 32-bit PA-RISC, but should be left as "so" for
2380	dnl 64-bit PA-RISC or, I suspect, IA-64.
2381	AC_DEFINE(HAVE_HPUX10_20_OR_LATER,1,[on HP-UX 10.20 or later])
2382	if test "`uname -m`" = "ia64"; then
2383		DYEXT="so"
2384	else
2385		DYEXT="sl"
2386	fi
2387
2388	#
2389	# "-b" builds a shared library; "+h" sets the soname.
2390	#
2391	SHLIB_OPT="-b"
2392	SONAME_OPT="+h"
2393
2394	#
2395	# Use System V conventions for man pages.
2396	#
2397	MAN_FILE_FORMATS=4
2398	MAN_MISC_INFO=5
2399	;;
2400
2401irix*)
2402	#
2403	# Use IRIX conventions for man pages; they're the same as the
2404	# System V conventions, except that they use section 8 for
2405	# administrative commands and daemons.
2406	#
2407	MAN_FILE_FORMATS=4
2408	MAN_MISC_INFO=5
2409	;;
2410
2411linux*|freebsd*|netbsd*|openbsd*|dragonfly*|kfreebsd*|gnu*|haiku*|midipix*)
2412	DYEXT="so"
2413	;;
2414
2415osf*)
2416	DYEXT="so"
2417
2418	#
2419	# DEC OSF/1, a/k/a Digital UNIX, a/k/a Tru64 UNIX.
2420	# Use Tru64 UNIX conventions for man pages; they're the same as
2421	# the System V conventions except that they use section 8 for
2422	# administrative commands and daemons.
2423	#
2424	MAN_FILE_FORMATS=4
2425	MAN_MISC_INFO=5
2426	MAN_DEVICES=7
2427	;;
2428
2429sinix*)
2430	AC_MSG_CHECKING(if SINIX compiler defines sinix)
2431	AC_CACHE_VAL(ac_cv_cc_sinix_defined,
2432		AC_TRY_COMPILE(
2433		    [],
2434		    [int i = sinix;],
2435		    ac_cv_cc_sinix_defined=yes,
2436		    ac_cv_cc_sinix_defined=no))
2437	    AC_MSG_RESULT($ac_cv_cc_sinix_defined)
2438	    if test $ac_cv_cc_sinix_defined = no ; then
2439		    AC_DEFINE(sinix,1,[on sinix])
2440	    fi
2441	;;
2442
2443solaris*)
2444	AC_DEFINE(HAVE_SOLARIS,1,[On solaris])
2445
2446	DYEXT="so"
2447
2448	#
2449	# Make sure errno is thread-safe, in case we're called in
2450	# a multithreaded program.  We don't guarantee that two
2451	# threads can use the *same* pcap_t safely, but the
2452	# current version does guarantee that you can use different
2453	# pcap_t's in different threads, and even that pcap_compile()
2454	# is thread-safe (it wasn't thread-safe in some older versions).
2455	#
2456	V_CCOPT="$V_CCOPT -D_TS_ERRNO"
2457
2458	case "`uname -r`" in
2459
2460	5.12)
2461		;;
2462
2463	*)
2464		#
2465		# Use System V conventions for man pages.
2466		#
2467		MAN_ADMIN_COMMANDS=1m
2468		MAN_FILE_FORMATS=4
2469		MAN_MISC_INFO=5
2470		MAN_DEVICES=7D
2471	esac
2472	;;
2473esac
2474AC_SUBST(V_LIB_CCOPT_FAT)
2475AC_SUBST(V_LIB_LDFLAGS_FAT)
2476AC_SUBST(V_PROG_CCOPT_FAT)
2477AC_SUBST(V_PROG_LDFLAGS_FAT)
2478AC_SUBST(DYEXT)
2479AC_SUBST(MAN_DEVICES)
2480AC_SUBST(MAN_FILE_FORMATS)
2481AC_SUBST(MAN_MISC_INFO)
2482AC_SUBST(MAN_ADMIN_COMMANDS)
2483
2484AC_ARG_ENABLE(shared,
2485AS_HELP_STRING([--enable-shared],[build shared libraries @<:@default=yes, if support available@:>@]))
2486test "x$enable_shared" = "xno" && DYEXT="none"
2487
2488AC_PROG_RANLIB
2489AC_CHECK_TOOL([AR], [ar])
2490
2491AC_PROG_LN_S
2492AC_SUBST(LN_S)
2493
2494AC_LBL_DEVEL(V_CCOPT)
2495
2496#
2497# Check to see if the sockaddr struct has the 4.4 BSD sa_len member.
2498#
2499AC_CHECK_MEMBERS([struct sockaddr.sa_len],,,
2500    [
2501	#include <sys/types.h>
2502	#include <sys/socket.h>
2503    ])
2504
2505#
2506# Check to see if there's a sockaddr_storage structure.
2507#
2508AC_CHECK_TYPES(struct sockaddr_storage,,,
2509    [
2510	#include <sys/types.h>
2511	#include <sys/socket.h>
2512    ])
2513
2514#
2515# Check to see if the dl_hp_ppa_info_t struct has the HP-UX 11.00
2516# dl_module_id_1 member.
2517#
2518# NOTE: any failure means we conclude that it doesn't have that member,
2519# so if we don't have DLPI, don't have a <sys/dlpi_ext.h> header, or
2520# have one that doesn't declare a dl_hp_ppa_info_t type, we conclude
2521# it doesn't have that member (which is OK, as either we won't be
2522# using code that would use that member, or we wouldn't compile in
2523# any case).
2524#
2525AC_CHECK_MEMBERS([dl_hp_ppa_info_t.dl_module_id_1],,,
2526    [
2527	#include <sys/types.h>
2528	#include <sys/dlpi.h>
2529	#include <sys/dlpi_ext.h>
2530    ])
2531
2532#
2533# Various Linux-specific mechanisms.
2534#
2535AC_ARG_ENABLE([usb],
2536[AS_HELP_STRING([--enable-usb],[enable Linux usbmon USB capture support @<:@default=yes, if support available@:>@])],
2537    [],
2538    [enable_usb=yes])
2539
2540#
2541# If somebody requested an XXX-only pcap, that doesn't include
2542# additional mechanisms.
2543#
2544if test "xxx_only" != yes; then
2545  case "$host_os" in
2546  linux*)
2547    dnl check for USB sniffing support
2548    AC_MSG_CHECKING(for Linux usbmon USB sniffing support)
2549    if test "x$enable_usb" != "xno" ; then
2550      AC_DEFINE(PCAP_SUPPORT_LINUX_USBMON, 1, [target host supports Linux usbmon for USB sniffing])
2551      MODULE_C_SRC="$MODULE_C_SRC pcap-usb-linux.c"
2552      AC_MSG_RESULT(yes)
2553      #
2554      # Note: if the directory for special files is *EVER* somewhere
2555      # other than the UN*X standard of /dev (which will break any
2556      # software that looks for /dev/null or /dev/tty, for example,
2557      # so doing that is *REALLY* not a good idea), please provide
2558      # some mechanism to determine that directory at *run time*,
2559      # rather than *configure time*, so that it works when doinga
2560      # a cross-build, and that works with *multiple* distributions,
2561      # with our without udev, and with multiple versions of udev,
2562      # with udevinfo or udevadm or any other mechanism to get the
2563      # special files directory.
2564      #
2565      # Do we have a version of <linux/compiler.h> available?
2566      # If so, we might need it for <linux/usbdevice_fs.h>.
2567      #
2568      AC_CHECK_HEADERS(linux/compiler.h)
2569      if test "$ac_cv_header_linux_compiler_h" = yes; then
2570        #
2571        # Yes - include it when testing for <linux/usbdevice_fs.h>.
2572        #
2573        AC_CHECK_HEADERS(linux/usbdevice_fs.h,,,[#include <linux/compiler.h>])
2574      else
2575        AC_CHECK_HEADERS(linux/usbdevice_fs.h)
2576      fi
2577      if test "$ac_cv_header_linux_usbdevice_fs_h" = yes; then
2578        #
2579        # OK, does it define bRequestType?  Older versions of the kernel
2580        # define fields with names like "requesttype, "request", and
2581        # "value", rather than "bRequestType", "bRequest", and
2582        # "wValue".
2583        #
2584        AC_CHECK_MEMBERS([struct usbdevfs_ctrltransfer.bRequestType],,,
2585          [
2586            AC_INCLUDES_DEFAULT
2587            #ifdef HAVE_LINUX_COMPILER_H
2588            #include <linux/compiler.h>
2589            #endif
2590            #include <linux/usbdevice_fs.h>
2591          ])
2592      fi
2593    else
2594      AC_MSG_RESULT(no)
2595    fi
2596
2597    #
2598    # Life's too short to deal with trying to get this to compile
2599    # if you don't get the right types defined with
2600    # __KERNEL_STRICT_NAMES getting defined by some other include.
2601    #
2602    # Check whether the includes Just Work.  If not, don't turn on
2603    # netfilter support.
2604    #
2605    AC_MSG_CHECKING(whether we can compile the netfilter support)
2606    AC_CACHE_VAL(ac_cv_netfilter_can_compile,
2607      AC_TRY_COMPILE([
2608AC_INCLUDES_DEFAULT
2609#include <sys/socket.h>
2610#include <netinet/in.h>
2611#include <linux/types.h>
2612
2613#include <linux/netlink.h>
2614#include <linux/netfilter.h>
2615#include <linux/netfilter/nfnetlink.h>
2616#include <linux/netfilter/nfnetlink_log.h>
2617#include <linux/netfilter/nfnetlink_queue.h>],
2618        [],
2619        ac_cv_netfilter_can_compile=yes,
2620        ac_cv_netfilter_can_compile=no))
2621    AC_MSG_RESULT($ac_cv_netfilter_can_compile)
2622    if test $ac_cv_netfilter_can_compile = yes ; then
2623      AC_DEFINE(PCAP_SUPPORT_NETFILTER, 1,
2624        [target host supports netfilter sniffing])
2625      MODULE_C_SRC="$MODULE_C_SRC pcap-netfilter-linux.c"
2626    fi
2627    ;;
2628  esac
2629fi
2630AC_SUBST(PCAP_SUPPORT_LINUX_USBMON)
2631AC_SUBST(PCAP_SUPPORT_NETFILTER)
2632
2633AC_ARG_ENABLE([netmap],
2634[AS_HELP_STRING([--enable-netmap],[enable netmap support @<:@default=yes, if support available@:>@])],
2635    [],
2636    [enable_netmap=yes])
2637
2638if test "x$enable_netmap" != "xno" ; then
2639	#
2640	# Check whether net/netmap_user.h is usable if NETMAP_WITH_LIBS is
2641	# defined; it's not usable on DragonFly BSD 4.6 if NETMAP_WITH_LIBS
2642	# is defined, for example, as it includes a non-existent malloc.h
2643	# header.
2644	#
2645	AC_MSG_CHECKING(whether we can compile the netmap support)
2646	AC_CACHE_VAL(ac_cv_net_netmap_user_can_compile,
2647	  AC_TRY_COMPILE([
2648AC_INCLUDES_DEFAULT
2649#define NETMAP_WITH_LIBS
2650#include <net/netmap_user.h>],
2651	    [],
2652	    ac_cv_net_netmap_user_can_compile=yes,
2653	    ac_cv_net_netmap_user_can_compile=no))
2654	AC_MSG_RESULT($ac_cv_net_netmap_user_can_compile)
2655	if test $ac_cv_net_netmap_user_can_compile = yes ; then
2656	  AC_DEFINE(PCAP_SUPPORT_NETMAP, 1,
2657	    [target host supports netmap])
2658	    MODULE_C_SRC="$MODULE_C_SRC pcap-netmap.c"
2659	fi
2660	AC_SUBST(PCAP_SUPPORT_NETMAP)
2661fi
2662
2663# Check for DPDK support.
2664AC_ARG_WITH([dpdk],
2665AS_HELP_STRING([--with-dpdk@<:@=DIR@:>@],[include DPDK support (located in directory DIR, if supplied).  @<:@default=yes, if present@:>@]),
2666[
2667	if test "$withval" = no
2668	then
2669		# User doesn't want DPDK support.
2670		want_dpdk=no
2671	elif test "$withval" = yes
2672	then
2673		# User wants DPDK support but hasn't specified a directory.
2674		want_dpdk=yes
2675	else
2676		# User wants DPDK support and has specified a directory,
2677		# so use the provided value.
2678		want_dpdk=yes
2679		dpdk_dir=$withval
2680	fi
2681],[
2682	if test "$V_PCAP" = dpdk; then
2683		# User requested DPDK-only libpcap, so we'd better have
2684		# the DPDK API.
2685		want_dpdk=yes
2686	elif test "xxx_only" = yes; then
2687		# User requested something-else-only pcap, so they don't
2688		# want DPDK support.
2689		want_dpdk=no
2690	else
2691		#
2692		# Use DPDK API if present, otherwise don't
2693		#
2694		want_dpdk=ifpresent
2695	fi
2696])
2697
2698if test "$want_dpdk" != no; then
2699	#
2700	# The user didn't explicitly say they don't want DPDK,
2701	# so see if we have it.
2702	#
2703	# We only try to find it using pkg-config; DPDK is *SO*
2704	# complicated - DPDK 19.02, for example, has about 117(!)
2705	# libraries, and the precise set of libraries required has
2706	# changed over time - so attempting to guess which libraries
2707	# you need, and hardcoding that in an attempt to find the
2708	# libraries without DPDK, rather than relying on DPDK to
2709	# tell you, with a .pc file, what libraries are needed,
2710	# is *EXTREMELY* fragile and has caused some bug reports,
2711	# so we're just not going to do it.
2712	#
2713	# If that causes a problem, the only thing we will do is
2714	# accept an alternative way of finding the appropriate
2715	# library set for the installed version of DPDK that is
2716	# as robust as pkg-config (i.e., it had better work as well
2717	# as pkg-config with *ALL* versions of DPDK that provide a
2718	# libdpdk.pc file).
2719	#
2720	# If --with-dpdk={path} was specified, add {path}/pkgconfig
2721	# to PKG_CONFIG_PATH, so we look for the .pc file there,
2722	# first.
2723	#
2724	save_PKG_CONFIG_PATH="$PKG_CONFIG_PATH"
2725	if test -n "$dpdk_dir"; then
2726		PKG_CONFIG_PATH="$dpdk_dir:$PKG_CONFIG_PATH"
2727	fi
2728	PKG_CHECK_MODULES(DPDK, libdpdk,
2729	    [
2730		found_dpdk=yes
2731	    ])
2732	PKG_CONFIG_PATH="$save_PKG_CONFIG_PATH"
2733
2734	#
2735	# Did we find DPDK?
2736	#
2737	if test "$found_dpdk" = yes; then
2738		#
2739		# Found it.
2740		#
2741		# We call rte_eth_dev_count_avail(), and older versions
2742		# of DPDK didn't have it, so check for it.
2743		#
2744		AC_LBL_SAVE_CHECK_STATE
2745		CFLAGS="$CFLAGS $DPDK_CFLAGS"
2746		LIBS="$LIBS $DPDK_LIBS"
2747		AC_CHECK_FUNC(rte_eth_dev_count_avail)
2748		AC_LBL_RESTORE_CHECK_STATE
2749	fi
2750
2751	if test "$ac_cv_func_rte_eth_dev_count_avail" = yes; then
2752		#
2753		# We found a usable DPDK.
2754		#
2755		# Check whether the rte_ether.h file defines
2756		# struct ether_addr or struct rte_ether_addr.
2757		#
2758		# ("API compatibility?  That's for losers!")
2759		#
2760		AC_LBL_SAVE_CHECK_STATE
2761		CFLAGS="$CFLAGS $DPDK_CFLAGS"
2762		LIBS="$LIBS $DPDK_LIBS"
2763		AC_CHECK_TYPES(struct rte_ether_addr,,,
2764		    [
2765			#include <rte_ether.h>
2766		    ])
2767		AC_LBL_RESTORE_CHECK_STATE
2768
2769		#
2770		# We can build with DPDK.
2771		#
2772		V_INCLS="$V_INCLS $DPDK_CFLAGS"
2773		ADDITIONAL_LIBS="$ADDITIONAL_LIBS $DPDK_LIBS"
2774		ADDITIONAL_LIBS_STATIC="$ADDITIONAL_LIBS_STATIC $DPDK_LIBS_STATIC"
2775		REQUIRES_PRIVATE="$REQUIRES_PRIVATE libdpdk"
2776		AC_DEFINE(PCAP_SUPPORT_DPDK, 1, [target host supports DPDK])
2777		if test $V_PCAP != dpdk ; then
2778			MODULE_C_SRC="$MODULE_C_SRC pcap-dpdk.c"
2779		fi
2780	else
2781		#
2782		# We didn't find a usable DPDK.
2783		# If we required it (with --with-dpdk or --with-pcap=dpdk),
2784		# fail with an appropriate message telling the user what
2785		# the problem was, otherwise note the problem with a
2786		# warning.
2787		#
2788		if test "$found_dpdk" != yes; then
2789			#
2790			# Not found with pkg-config.  Note that we
2791			# require that DPDK must be findable with
2792			# pkg-config.
2793			#
2794			if test "$V_PCAP" = dpdk; then
2795				#
2796				# User requested DPDK-only capture support.
2797				#
2798				AC_MSG_ERROR(
2799[DPDK support requested with --with-pcap=dpdk, but
2800we couldn't find DPDK with pkg-config.  Make sure that pkg-config is
2801installed, that DPDK 18.02.2 or later is installed, and that DPDK
2802provides a .pc file.])
2803			fi
2804
2805			if test "$want_dpdk" = yes; then
2806				#
2807				# User requested that libpcap include
2808				# DPDK capture support.
2809				#
2810				AC_MSG_ERROR(
2811[DPDK support requested with --with-dpdk, but we
2812couldn't find DPDK with pkg-config.  Make sure that pkg-config
2813is installed, that DPDK 18.02.2 or later is installed, and that
2814DPDK provides .pc file.])
2815			fi
2816
2817			#
2818			# User didn't indicate whether they wanted DPDK
2819			# or not; just warn why we didn't find it.
2820			#
2821			AC_MSG_WARN(
2822[We couldn't find DPDK with pkg-config.  If
2823you want DPDK support, make sure that pkg-config is installed,
2824that DPDK 18.02.2 or later is installed, and that DPDK provides a
2825.pc file.])
2826		elif test "$ac_cv_func_rte_eth_dev_count_avail" != yes; then
2827			#
2828			# Found with pkg-config, but we couldn't compile
2829			# a program that calls rte_eth_dev_count(); we
2830			# probably have the developer package installed,
2831			# but don't have a sufficiently recent version
2832			# of DPDK.  Note that we need a sufficiently
2833			# recent version of DPDK.
2834			#
2835			if test "$V_PCAP" = dpdk; then
2836				#
2837				# User requested DPDK-only capture support.
2838				#
2839				AC_MSG_ERROR(
2840[DPDK support requested with --with-pcap=dpdk, but we
2841can't compile libpcap with DPDK.  Make sure that DPDK 18.02.2 or later
2842is installed.])
2843			fi
2844
2845			if test "$want_dpdk" = yes; then
2846				#
2847				# User requested that libpcap include
2848				# DPDK capture support.
2849				#
2850				AC_MSG_ERROR(
2851[DPDK support requested with --with-dpdk, but
2852we can't compile libpcap with DPDK.  Make sure that DPDK 18.02.2
2853or later is DPDK is installed.])
2854			fi
2855
2856			#
2857			# User didn't indicate whether they wanted DPDK
2858			# or not; just warn why we didn't find it.
2859			#
2860			AC_MSG_WARN(
2861[DPDK was found, but we can't compile libpcap with it.
2862Make sure that DPDK 18.02.2 or later is installed.])
2863		fi
2864	fi
2865fi
2866AC_SUBST(PCAP_SUPPORT_DPDK)
2867
2868AC_ARG_ENABLE([bluetooth],
2869[AS_HELP_STRING([--enable-bluetooth],[enable Bluetooth support @<:@default=yes, if support available@:>@])],
2870    [],
2871    [enable_bluetooth=ifsupportavailable])
2872
2873if test "xxx_only" = yes; then
2874	# User requested something-else-only pcap, so they don't
2875	# want Bluetooth support.
2876	enable_bluetooth=no
2877fi
2878
2879if test "x$enable_bluetooth" != "xno" ; then
2880	dnl check for Bluetooth sniffing support
2881	case "$host_os" in
2882	linux*)
2883		AC_CHECK_HEADER(bluetooth/bluetooth.h,
2884		    [
2885			#
2886			# We have bluetooth.h, so we support Bluetooth
2887			# sniffing.
2888			#
2889			AC_DEFINE(PCAP_SUPPORT_BT, 1, [target host supports Bluetooth sniffing])
2890			MODULE_C_SRC="$MODULE_C_SRC pcap-bt-linux.c"
2891			AC_MSG_NOTICE(Bluetooth sniffing is supported)
2892			ac_lbl_bluetooth_available=yes
2893
2894			#
2895			# OK, does struct sockaddr_hci have an hci_channel
2896			# member?
2897			#
2898			AC_CHECK_MEMBERS([struct sockaddr_hci.hci_channel],
2899			    [
2900				#
2901				# Yes; is HCI_CHANNEL_MONITOR defined?
2902				#
2903				AC_MSG_CHECKING(if HCI_CHANNEL_MONITOR is defined)
2904				AC_CACHE_VAL(ac_cv_lbl_hci_channel_monitor_is_defined,
2905				    AC_TRY_COMPILE(
2906					[
2907					    #include <bluetooth/bluetooth.h>
2908					    #include <bluetooth/hci.h>
2909					],
2910					[
2911					    u_int i = HCI_CHANNEL_MONITOR;
2912					],
2913					[
2914					    AC_MSG_RESULT(yes)
2915					    AC_DEFINE(PCAP_SUPPORT_BT_MONITOR,,
2916					      [target host supports Bluetooth Monitor])
2917					    MODULE_C_SRC="$MODULE_C_SRC pcap-bt-monitor-linux.c"
2918					],
2919					[
2920					    AC_MSG_RESULT(no)
2921					]))
2922			    ],,
2923			    [
2924				#include <bluetooth/bluetooth.h>
2925				#include <bluetooth/hci.h>
2926			    ])
2927		    ],
2928		    [
2929			#
2930			# We don't have bluetooth.h, so we don't support
2931			# Bluetooth sniffing.
2932			#
2933			if test "x$enable_bluetooth" = "xyes" ; then
2934				AC_MSG_ERROR(Bluetooth sniffing is not supported; install bluez-lib devel to enable it)
2935			else
2936				AC_MSG_NOTICE(Bluetooth sniffing is not supported; install bluez-lib devel to enable it)
2937			fi
2938		    ])
2939		;;
2940	*)
2941		if test "x$enable_bluetooth" = "xyes" ; then
2942			AC_MSG_ERROR(no Bluetooth sniffing support implemented for $host_os)
2943		else
2944			AC_MSG_NOTICE(no Bluetooth sniffing support implemented for $host_os)
2945		fi
2946		;;
2947	esac
2948	AC_SUBST(PCAP_SUPPORT_BT)
2949fi
2950
2951AC_ARG_ENABLE([dbus],
2952[AS_HELP_STRING([--enable-dbus],[enable D-Bus capture support @<:@default=yes, if support available@:>@])],
2953    [],
2954    [enable_dbus=ifavailable])
2955
2956if test "xxx_only" = yes; then
2957	# User requested something-else-only pcap, so they don't
2958	# want D-Bus support.
2959	enable_dbus=no
2960fi
2961
2962if test "x$enable_dbus" != "xno"; then
2963	if test "x$enable_dbus" = "xyes"; then
2964		case "$host_os" in
2965
2966		darwin*)
2967			#
2968			# We don't support D-Bus sniffing on macOS; see
2969			#
2970			# https://bugs.freedesktop.org/show_bug.cgi?id=74029
2971			#
2972			# The user requested it, so fail.
2973			#
2974			AC_MSG_ERROR([Due to freedesktop.org bug 74029, D-Bus capture support is not available on macOS])
2975		esac
2976	else
2977		case "$host_os" in
2978
2979		darwin*)
2980			#
2981			# We don't support D-Bus sniffing on macOS; see
2982			#
2983			# https://bugs.freedesktop.org/show_bug.cgi?id=74029
2984			#
2985			# The user dind't explicitly request it, so just
2986			# silently refuse to enable it.
2987			#
2988			enable_dbus="no"
2989			;;
2990		esac
2991	fi
2992fi
2993
2994if test "x$enable_dbus" != "xno"; then
2995	PKG_CHECK_MODULES(DBUS, dbus-1,
2996	    [
2997		AC_LBL_SAVE_CHECK_STATE
2998		CFLAGS="$CFLAGS $DBUS_CFLAGS"
2999		LIBS="$LIBS $DBUS_LIBS"
3000		AC_MSG_CHECKING(whether the D-Bus library defines dbus_connection_read_write)
3001		AC_TRY_LINK(
3002		    [#include <string.h>
3003
3004		     #include <time.h>
3005		     #include <sys/time.h>
3006
3007		     #include <dbus/dbus.h>],
3008		    [return dbus_connection_read_write(NULL, 0);],
3009		    [
3010			AC_MSG_RESULT([yes])
3011			AC_DEFINE(PCAP_SUPPORT_DBUS, 1, [support D-Bus sniffing])
3012			MODULE_C_SRC="$MODULE_C_SRC pcap-dbus.c"
3013			V_INCLS="$V_INCLS $DBUS_CFLAGS"
3014			ADDITIONAL_LIBS="$ADDITIONAL_LIBS $DBUS_LIBS"
3015			ADDITIONAL_LIBS_STATIC="$ADDITIONAL_LIBS_STATIC $DBUS_LIBS_STATIC"
3016			REQUIRES_PRIVATE="$REQUIRES_PRIVATE dbus-1"
3017		    ],
3018		    [
3019			AC_MSG_RESULT([no])
3020			if test "x$enable_dbus" = "xyes"; then
3021			    AC_MSG_ERROR([--enable-dbus was given, but the D-Bus library doesn't define dbus_connection_read_write()])
3022			fi
3023		     ])
3024		AC_LBL_RESTORE_CHECK_STATE
3025	    ],
3026	    [
3027		if test "x$enable_dbus" = "xyes"; then
3028			AC_MSG_ERROR([--enable-dbus was given, but the dbus-1 package is not installed])
3029		fi
3030	    ])
3031	AC_SUBST(PCAP_SUPPORT_DBUS)
3032fi
3033
3034AC_ARG_ENABLE([rdma],
3035[AS_HELP_STRING([--enable-rdma],[enable RDMA capture support @<:@default=yes, if support available@:>@])],
3036    [],
3037    [enable_rdma=ifavailable])
3038
3039if test "xxx_only" = yes; then
3040	# User requested something-else-only pcap, so they don't
3041	# want RDMA support.
3042	enable_rdma=no
3043fi
3044
3045if test "x$enable_rdma" != "xno"; then
3046	PKG_CHECK_MODULES(LIBIBVERBS, libibverbs,
3047	    [
3048		found_libibverbs=yes
3049		LIBIBVERBS_REQUIRES_PRIVATE="libibverbs"
3050	    ])
3051
3052	if test "x$found_libibverbs" != "xyes"; then
3053		AC_CHECK_LIB(ibverbs, ibv_get_device_list,
3054		    [
3055			found_libibverbs=yes
3056			LIBIBVERBS_CFLAGS=""
3057			LIBIBVERBS_LIBS="-libverbs"
3058			# XXX - at least on Ubuntu 20.04, there are many more
3059			# libraries needed; is there any platform where
3060			# libibverbs is available but where pkg-config isn't
3061			# available or libibverbs doesn't use it?  If not,
3062			# we should only use pkg-config for it.
3063			LIBIBVERBS_LIBS_STATIC="-libverbs"
3064			LIBIBVERBS_LIBS_PRIVATE="-libverbs"
3065		    ]
3066		)
3067	fi
3068
3069	if test "x$found_libibverbs" = "xyes"; then
3070		AC_LBL_SAVE_CHECK_STATE
3071		CFLAGS="$CFLAGS $LIBIBVERBS_CFLAGS"
3072		LIBS="$LIBS $LIBIBVERBS_LIBS"
3073		AC_CHECK_HEADER(infiniband/verbs.h, [
3074			#
3075			# ibv_create_flow may be defined as a static inline
3076			# function in infiniband/verbs.h, so we can't
3077			# use AC_CHECK_LIB.
3078			#
3079			# Too bad autoconf has no AC_SYMBOL_EXISTS()
3080			# macro that works like CMake's check_symbol_exists()
3081			# function, to check do a compile check like
3082			# this (they do a clever trick to avoid having
3083			# to know the function's signature).
3084			#
3085			AC_MSG_CHECKING(whether libibverbs defines ibv_create_flow)
3086			AC_TRY_LINK(
3087				[
3088					#include <infiniband/verbs.h>
3089				],
3090				[
3091					(void) ibv_create_flow((struct ibv_qp *) NULL,
3092							       (struct ibv_flow_attr *) NULL);
3093				],
3094				[
3095					AC_MSG_RESULT([yes])
3096					found_usable_libibverbs=yes
3097				],
3098				[
3099					AC_MSG_RESULT([no])
3100				]
3101			)
3102		])
3103		AC_LBL_RESTORE_CHECK_STATE
3104	fi
3105
3106	if test "x$found_usable_libibverbs" = "xyes"
3107	then
3108		AC_DEFINE(PCAP_SUPPORT_RDMASNIFF, , [target host supports RDMA sniffing])
3109		MODULE_C_SRC="$MODULE_C_SRC pcap-rdmasniff.c"
3110		CFLAGS="$LIBIBVERBS_CFLAGS $CFLAGS"
3111		ADDITIONAL_LIBS="$LIBIBVERBS_LIBS $ADDITIONAL_LIBS"
3112		ADDITIONAL_LIBS_STATIC="$LIBIBVERBS_LIBS_STATIC $ADDITIONAL_LIBS_STATIC"
3113		LIBS_PRIVATE="$LIBIBVERBS_LIBS_PRIVATE $LIBS_PRIVATE"
3114		REQUIRES_PRIVATE="$REQUIRES_PRIVATE $LIBIBVERBS_REQUIRES_PRIVATE"
3115	fi
3116	AC_SUBST(PCAP_SUPPORT_RDMASNIFF)
3117fi
3118
3119#
3120# If this is a platform where we need to have the .pc file and
3121# pcap-config script supply an rpath option to specify the directory
3122# in which the libpcap shared library is installed, and the install
3123# prefix /usr (meaning we're not installing a system library), provide
3124# the rpath option.
3125#
3126# (We must check $prefix, as $libdir isn't necessarily /usr/lib in this
3127# case - for example, Linux distributions for 64-bit platforms that
3128# also provide support for binaries for a 32-bit version of the
3129# platform may put the 64-bit libraries, the 32-bit libraries, or both
3130# in directories other than /usr/lib.)
3131#
3132# In AIX, do we have to do this?
3133#
3134# In Darwin-based OSes, the full paths of the shared libraries with
3135# which the program was linked are stored in the executable, so we don't
3136# need to provide an rpath option.
3137#
3138# With the HP-UX linker, directories specified with -L are, by default,
3139# added to the run-time search path, so we don't need to supply them.
3140#
3141# For Tru64 UNIX, "-rpath" works with DEC's^WCompaq's^WHP's C compiler
3142# for Alpha, but isn't documented as working with GCC, and no GCC-
3143# compatible option is documented as working with the DEC compiler.
3144# If anybody needs this on Tru64/Alpha, they're welcome to figure out a
3145# way to make it work.
3146#
3147# This must *not* depend on the compiler, as, on platforms where there's
3148# a GCC-compatible compiler and a vendor compiler, we need to work with
3149# both.
3150#
3151if test "$prefix" != "/usr"; then
3152	case "$host_os" in
3153
3154	freebsd*|netbsd*|openbsd*|dragonfly*|linux*|haiku*|midipix*|gnu*)
3155		#
3156		# Platforms where the "native" C compiler is GCC or
3157		# accepts compatible command-line arguments, and the
3158		# "native" linker is the GNU linker or accepts
3159		# compatible command-line arguments.
3160		#
3161		RPATH="-Wl,-rpath,\${libdir}"
3162		;;
3163
3164	solaris*)
3165		#
3166		# Sun/Oracle's linker, the GNU linker, and
3167		# GNU-compatible linkers all support -R.
3168		#
3169		RPATH="-Wl,-R,\${libdir}"
3170		;;
3171	esac
3172fi
3173
3174AC_PROG_INSTALL
3175
3176AC_CONFIG_HEADER(config.h)
3177
3178AC_SUBST(V_SHLIB_CCOPT)
3179AC_SUBST(V_SHLIB_CMD)
3180AC_SUBST(V_SHLIB_OPT)
3181AC_SUBST(V_SONAME_OPT)
3182AC_SUBST(RPATH)
3183AC_SUBST(ADDLOBJS)
3184AC_SUBST(ADDLARCHIVEOBJS)
3185AC_SUBST(PLATFORM_C_SRC)
3186AC_SUBST(PLATFORM_CXX_SRC)
3187AC_SUBST(MODULE_C_SRC)
3188AC_SUBST(REMOTE_C_SRC)
3189AC_SUBST(PTHREAD_LIBS)
3190AC_SUBST(BUILD_RPCAPD)
3191AC_SUBST(INSTALL_RPCAPD)
3192AC_SUBST(RPCAPD_LIBS)
3193
3194#
3195# We're done with configuration operations; add ADDITIONAL_LIBS and
3196# ADDITIONAL_LIBS_STATIC to LIBS and LIBS_STATIC, respectively.
3197#
3198LIBS="$ADDITIONAL_LIBS $LIBS"
3199LIBS_STATIC="$ADDITIONAL_LIBS_STATIC $LIBS_STATIC"
3200
3201AC_OUTPUT_COMMANDS([if test -f .devel; then
3202	echo timestamp > stamp-h
3203	cat $srcdir/Makefile-devel-adds >> Makefile
3204	make depend || exit 1
3205fi])
3206AC_OUTPUT(Makefile grammar.y pcap-filter.manmisc pcap-linktype.manmisc
3207	pcap-tstamp.manmisc pcap-savefile.manfile pcap.3pcap
3208	pcap_compile.3pcap pcap_datalink.3pcap pcap_dump_open.3pcap
3209	pcap_get_tstamp_precision.3pcap pcap_list_datalinks.3pcap
3210	pcap_list_tstamp_types.3pcap pcap_open_dead.3pcap
3211	pcap_open_offline.3pcap pcap_set_immediate_mode.3pcap
3212	pcap_set_tstamp_precision.3pcap pcap_set_tstamp_type.3pcap
3213	rpcapd/Makefile rpcapd/rpcapd.manadmin rpcapd/rpcapd-config.manfile
3214	testprogs/Makefile)
3215exit 0
3216