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