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