]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/tcpdump/configure.ac
Merge llvm-project release/16.x llvmorg-16.0.4-0-gae42196bc493
[FreeBSD/FreeBSD.git] / contrib / tcpdump / configure.ac
1 dnl Copyright (c) 1994, 1995, 1996, 1997
2 dnl     The Regents of the University of California.  All rights reserved.
3 dnl
4 dnl Process this file with autoconf to produce a configure script.
5 dnl
6
7 #
8 # See
9 #
10 #       https://ftp.gnu.org/gnu/config/README
11 #
12 # for the URLs to use to fetch new versions of config.guess and
13 # config.sub.
14 #
15
16 AC_PREREQ(2.69)
17 AC_INIT(tcpdump, m4_esyscmd_s([cat VERSION]))
18 AC_CONFIG_SRCDIR(tcpdump.c)
19
20 AC_CANONICAL_HOST
21
22 AC_LBL_C_INIT_BEFORE_CC(V_INCLS)
23 #
24 # Try to enable as many C99 features as we can.
25 # At minimum, we want C++/C99-style // comments.
26 #
27 AC_PROG_CC_C99
28 if test "$ac_cv_prog_cc_c99" = "no"; then
29         AC_MSG_WARN([The C compiler does not support C99; there may be compiler errors])
30 fi
31 AC_LBL_C_INIT(V_CCOPT, V_INCLS)
32 AC_LBL_C_INLINE
33
34 AC_CHECK_HEADERS(fcntl.h rpc/rpc.h rpc/rpcent.h net/if.h)
35
36 case "$host_os" in
37
38 darwin*)
39         AC_ARG_ENABLE(universal,
40         AS_HELP_STRING([--disable-universal],[don't build universal on macOS]))
41         if test "$enable_universal" != "no"; then
42                 case "$host_os" in
43
44                 darwin9.*)
45                         #
46                         # Leopard.  Build for x86 and 32-bit PowerPC, with
47                         # x86 first.  (That's what Apple does.)
48                         #
49                         V_CCOPT="$V_CCOPT -arch i386 -arch ppc"
50                         LDFLAGS="$LDFLAGS -arch i386 -arch ppc"
51                         ;;
52
53                 darwin10.*)
54                         #
55                         # Snow Leopard.  Build for x86-64 and x86, with
56                         # x86-64 first.  (That's what Apple does.)
57                         #
58                         V_CCOPT="$V_CCOPT -arch x86_64 -arch i386"
59                         LDFLAGS="$LDFLAGS -arch x86_64 -arch i386"
60                         ;;
61                 esac
62         fi
63         ;;
64 esac
65
66
67 AC_ARG_WITH([smi],
68    [AS_HELP_STRING([--with-smi],
69      [link with libsmi (allows to load MIBs on the fly to decode SNMP packets) [default=yes, if available]])],
70    [],
71    [with_smi=yes])
72
73 if test "x$with_smi" != "xno" ; then
74         AC_CHECK_HEADER(smi.h,
75         [
76                 #
77                 # OK, we found smi.h.  Do we have libsmi with smiInit?
78                 #
79                 AC_CHECK_LIB(smi, smiInit,
80                 [
81                         #
82                         # OK, we have libsmi with smiInit.  Can we use it?
83                         #
84                         AC_MSG_CHECKING([whether to enable libsmi])
85                         savedlibs="$LIBS"
86                         LIBS="-lsmi $LIBS"
87                         AC_TRY_RUN(
88                                 [
89 /* libsmi available check */
90 #include <stdio.h>
91 #include <stdlib.h>
92 #include <string.h>
93 #include <smi.h>
94 int main()
95 {
96   int current, revision, age, n;
97   const int required = 2;
98   if (smiInit(""))
99     exit(1);
100   if (strcmp(SMI_LIBRARY_VERSION, smi_library_version))
101     exit(2);
102   n = sscanf(smi_library_version, "%d:%d:%d", &current, &revision, &age);
103   if (n != 3)
104     exit(3);
105   if (required < current - age || required > current)
106     exit(4);
107   exit(0);
108 }
109                                 ],
110                                 [
111                                         AC_MSG_RESULT(yes)
112                                         AC_DEFINE(USE_LIBSMI, 1,
113                                             [Define if you enable support for libsmi])
114                                 ],
115                                 [
116                                         dnl autoconf documentation says that
117                                         dnl $? contains the exit value.
118                                         dnl reality is that it does not.
119                                         dnl We leave this in just in case
120                                         dnl autoconf ever comes back to
121                                         dnl match the documentation.
122                                         case $? in
123                                           1) AC_MSG_RESULT(no - smiInit failed) ;;
124                                           2) AC_MSG_RESULT(no - header/library version mismatch) ;;
125                                           3) AC_MSG_RESULT(no - can't determine library version) ;;
126                                           4) AC_MSG_RESULT(no - too old) ;;
127                                           *) AC_MSG_RESULT(no) ;;
128                                         esac
129                                         LIBS="$savedlibs"
130                                 ],
131                                 [
132                                         AC_MSG_RESULT(not when cross-compiling)
133                                         LIBS="$savedlibs"
134                                 ]
135                         )
136                 ])
137         ])
138 fi
139
140 AC_MSG_CHECKING([whether to enable the possibly-buggy SMB printer])
141 AC_ARG_ENABLE([smb],
142    [AS_HELP_STRING([--enable-smb],
143      [enable possibly-buggy SMB printer [default=no]])],
144    [],
145    [enableval=no])
146 case "$enableval" in
147 yes)    AC_MSG_RESULT(yes)
148         AC_DEFINE(ENABLE_SMB, 1,
149             [define if you want to build the possibly-buggy SMB printer])
150         LOCALSRC="print-smb.c smbutil.c $LOCALSRC"
151         ;;
152 *)      AC_MSG_RESULT(no)
153         ;;
154 esac
155
156 AC_ARG_WITH(user, [  --with-user=USERNAME    drop privileges by default to USERNAME])
157 AC_MSG_CHECKING([whether to drop root privileges by default])
158 if test ! -z "$with_user" ; then
159        AC_DEFINE_UNQUOTED(WITH_USER, "$withval",
160            [define if should drop privileges by default])
161        AC_MSG_RESULT(to \"$withval\")
162 else
163        AC_MSG_RESULT(no)
164 fi
165
166 AC_ARG_WITH(chroot, [  --with-chroot=DIRECTORY when dropping privileges, chroot to DIRECTORY])
167 AC_MSG_CHECKING([whether to chroot])
168 if test ! -z "$with_chroot" && test "$with_chroot" != "no" ; then
169        AC_DEFINE_UNQUOTED(WITH_CHROOT, "$withval",
170            [define if should chroot when dropping privileges])
171        AC_MSG_RESULT(to \"$withval\")
172 else
173        AC_MSG_RESULT(no)
174 fi
175
176 AC_ARG_WITH(sandbox-capsicum,
177         AS_HELP_STRING([--with-sandbox-capsicum],
178                        [use Capsicum security functions @<:@default=yes, if available@:>@]))
179 #
180 # Check whether various functions are available.  If any are, set
181 # ac_lbl_capsicum_function_seen to yes; if any are not, set
182 # ac_lbl_capsicum_function_not_seen to yes.
183 #
184 # We don't check cap_rights_init(), as it's a macro, wrapping another
185 # function, in at least some versions of FreeBSD, and AC_CHECK_FUNCS()
186 # doesn't handle that.
187 #
188 # All of the ones we check for must be available in order to enable
189 # capsicum sandboxing.
190 #
191 # XXX - do we need to check for all of them, or are there some that, if
192 # present, imply others are present?
193 #
194 if test -z "$with_sandbox_capsicum" || test "$with_sandbox_capsicum" != "no" ; then
195         #
196         # First, make sure we have the required header.
197         #
198         AC_CHECK_HEADER(sys/capsicum.h,
199         [
200                 #
201                 # We do; now make sure we have the required functions.
202                 #
203                 AC_CHECK_FUNCS(cap_enter cap_rights_limit cap_ioctls_limit openat,
204                     ac_lbl_capsicum_function_seen=yes,
205                     ac_lbl_capsicum_function_not_seen=yes)
206         ])
207         AC_CHECK_LIB(casper, cap_init, LIBS="$LIBS -lcasper")
208         AC_CHECK_LIB(cap_dns, cap_gethostbyaddr, LIBS="$LIBS -lcap_dns")
209 fi
210 AC_MSG_CHECKING([whether to sandbox using capsicum])
211 if test "x$ac_lbl_capsicum_function_seen" = "xyes" -a "x$ac_lbl_capsicum_function_not_seen" != "xyes"; then
212         AC_DEFINE(HAVE_CAPSICUM, 1, [capsicum support available])
213         AC_MSG_RESULT(yes)
214 else
215         AC_MSG_RESULT(no)
216 fi
217 AC_MSG_CHECKING([whether to sandbox using Casper library])
218 if test "x$ac_cv_lib_casper_cap_init" = "xyes" -a "x$ac_cv_lib_cap_dns_cap_gethostbyaddr" = "xyes"; then
219         AC_DEFINE(HAVE_CASPER, 1, [Casper support available])
220         AC_MSG_RESULT(yes)
221 else
222         AC_MSG_RESULT(no)
223 fi
224
225 #
226 # We must check this before checking whether to check the OS's IPv6,
227 # support because, on some platforms (such as SunOS 5.x), the test
228 # program requires the extra networking libraries.
229 #
230 AC_LBL_LIBRARY_NET
231
232 #
233 # Check whether AF_INET6 and struct in6_addr are defined.
234 # If they aren't both defined, we don't have sufficient OS
235 # support for IPv6, so we don't look for IPv6 support libraries,
236 # and we define AF_INET6 and struct in6_addr ourselves.
237 #
238 AC_MSG_CHECKING([whether the operating system supports IPv6])
239 AC_COMPILE_IFELSE(
240     [
241       AC_LANG_SOURCE(
242         [[
243 #include <string.h>
244 /* AF_INET6 available check */
245 #include <sys/types.h>
246 #ifdef _WIN32
247 #include <ws2tcpip.h>
248 #else
249 #include <sys/socket.h>
250 #include <netinet/in.h>
251 #endif
252 #ifdef AF_INET6
253 void
254 foo(struct in6_addr *addr)
255 {
256  memset(addr, 0, sizeof (struct in6_addr));
257 }
258 #else
259 #error "AF_INET6 not defined"
260 #endif
261         ]])
262     ],
263     [
264         AC_MSG_RESULT(yes)
265         AC_DEFINE(HAVE_OS_IPV6_SUPPORT, 1,
266             [define if the OS provides AF_INET6 and struct in6_addr])
267         ipv6=yes
268     ],
269     [
270         AC_MSG_RESULT(no)
271         ipv6=no
272     ]
273 )
274
275 ipv6type=unknown
276 ipv6lib=none
277 ipv6trylibc=no
278
279 if test "$ipv6" = "yes"; then
280         AC_MSG_CHECKING([ipv6 stack type])
281         for i in inria kame linux-glibc linux-libinet6 toshiba v6d zeta; do
282                 case $i in
283                 inria)
284                         dnl http://www.kame.net/
285                         AC_EGREP_CPP(yes,
286 [#include <netinet/in.h>
287 #ifdef IPV6_INRIA_VERSION
288 yes
289 #endif],
290                                 [ipv6type=$i])
291                         ;;
292                 kame)
293                         dnl http://www.kame.net/
294                         AC_EGREP_CPP(yes,
295 [#include <netinet/in.h>
296 #ifdef __KAME__
297 yes
298 #endif],
299                                 [ipv6type=$i;
300                                 ipv6lib=inet6;
301                                 ipv6libdir=/usr/local/v6/lib;
302                                 ipv6trylibc=yes])
303                         ;;
304                 linux-glibc)
305                         dnl http://www.v6.linux.or.jp/
306                         AC_EGREP_CPP(yes,
307 [#include <features.h>
308 #if defined(__GLIBC__) && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1
309 yes
310 #endif],
311                                 [ipv6type=$i])
312                         ;;
313                 linux-libinet6)
314                         dnl http://www.v6.linux.or.jp/
315                         dnl
316                         dnl This also matches Solaris 8 and Tru64 UNIX 5.1,
317                         dnl and possibly other versions of those OSes
318                         dnl
319                         if test -d /usr/inet6 -o -f /usr/include/netinet/ip6.h; then
320                                 ipv6type=$i
321                                 ipv6lib=inet6
322                                 ipv6libdir=/usr/inet6/lib
323                                 ipv6trylibc=yes;
324                                 CFLAGS="-I/usr/inet6/include $CFLAGS"
325                         fi
326                         ;;
327                 toshiba)
328                         AC_EGREP_CPP(yes,
329 [#include <sys/param.h>
330 #ifdef _TOSHIBA_INET6
331 yes
332 #endif],
333                                 [ipv6type=$i;
334                                 ipv6lib=inet6;
335                                 ipv6libdir=/usr/local/v6/lib])
336                         ;;
337                 v6d)
338                         AC_EGREP_CPP(yes,
339 [#include </usr/local/v6/include/sys/v6config.h>
340 #ifdef __V6D__
341 yes
342 #endif],
343                                 [ipv6type=$i;
344                                 ipv6lib=v6;
345                                 ipv6libdir=/usr/local/v6/lib;
346                                 CFLAGS="-I/usr/local/v6/include $CFLAGS"])
347                         ;;
348                 zeta)
349                         AC_EGREP_CPP(yes,
350 [#include <sys/param.h>
351 #ifdef _ZETA_MINAMI_INET6
352 yes
353 #endif],
354                                 [ipv6type=$i;
355                                 ipv6lib=inet6;
356                                 ipv6libdir=/usr/local/v6/lib])
357                         ;;
358                 esac
359                 if test "$ipv6type" != "unknown"; then
360                         break
361                 fi
362         done
363         AC_MSG_RESULT($ipv6type)
364 fi
365
366 if test "$ipv6" = "yes" -a "$ipv6lib" != "none"; then
367         if test -d $ipv6libdir -a -f $ipv6libdir/lib$ipv6lib.a; then
368                 LIBS="-L$ipv6libdir -l$ipv6lib $LIBS"
369                 echo "You have $ipv6lib library, using it"
370         else
371                 if test "$ipv6trylibc" = "yes"; then
372                         echo "You do not have $ipv6lib library, using libc"
373                 else
374                         echo 'Fatal: no $ipv6lib library found.  cannot continue.'
375                         echo "You need to fetch lib$ipv6lib.a from appropriate"
376                         echo 'ipv6 kit and compile beforehand.'
377                         exit 1
378                 fi
379         fi
380 fi
381
382 AC_REPLACE_FUNCS(strlcat strlcpy strdup strsep getservent getopt_long)
383 AC_CHECK_FUNCS(fork vfork)
384 AC_CHECK_FUNCS(setlinebuf)
385
386 #
387 # Make sure we have vsnprintf() and snprintf(); we require them.
388 #
389 AC_CHECK_FUNC(vsnprintf,,
390     AC_MSG_ERROR([vsnprintf() is required but wasn't found]))
391 AC_CHECK_FUNC(snprintf,,
392     AC_MSG_ERROR([snprintf() is required but wasn't found]))
393
394 #
395 # Define HAVE_NO_PRINTF_Z to make it possible to disable test cases that
396 # depend on %zu.
397 #
398 AC_MSG_CHECKING([whether printf(3) supports the z length modifier])
399 AC_RUN_IFELSE(
400     [
401         AC_LANG_SOURCE([[
402 #include <stdio.h>
403 #include <string.h>
404
405 int main()
406 {
407   char buf[100];
408   snprintf(buf, sizeof(buf), "%zu", sizeof(buf));
409   return strncmp(buf, "100", sizeof(buf)) ? 1 : 0;
410 }
411         ]])
412     ],
413     [
414         AC_MSG_RESULT(yes)
415     ],
416     [
417         AC_MSG_RESULT(no)
418         AC_DEFINE(HAVE_NO_PRINTF_Z, 1,
419             [Define to 1 if printf(3) does not support the z length modifier.])
420     ],
421     [
422         AC_MSG_RESULT(not while cross-compiling)
423     ]
424 )
425
426 AC_CHECK_LIB(rpc, main)         dnl It's unclear why we might need -lrpc
427
428 dnl Some platforms may need -lnsl for getrpcbynumber.
429 AC_SEARCH_LIBS(getrpcbynumber, nsl,
430     AC_DEFINE(HAVE_GETRPCBYNUMBER, 1, [define if you have getrpcbynumber()]))
431
432 AC_LBL_LIBPCAP(V_PCAPDEP, V_INCLS)
433
434 #
435 # Check for these after AC_LBL_LIBPCAP, so we link with the appropriate
436 # libraries (e.g., "-lsocket -lnsl" on Solaris).
437 #
438 # You are in a twisty little maze of UN*Xes, all different.
439 # Some might not have ether_ntohost().
440 # Some might have it and declare it in <net/ethernet.h>.
441 # Some might have it and declare it in <netinet/ether.h>
442 # Some might have it and declare it in <sys/ethernet.h>.
443 # Some might have it and declare it in <arpa/inet.h>.
444 # Some might have it and declare it in <netinet/if_ether.h>.
445 # Some might have it and not declare it in any header file.
446 #
447 # Before you is a C compiler.
448 #
449 AC_CHECK_FUNCS(ether_ntohost, [
450     AC_CACHE_CHECK(for buggy ether_ntohost, ac_cv_buggy_ether_ntohost, [
451         AC_TRY_RUN([
452                 #include <netdb.h>
453                 #include <netinet/ether.h>
454                 #include <stdlib.h>
455                 #include <sys/types.h>
456                 #include <sys/param.h>
457                 #include <sys/socket.h>
458
459                 int
460                 main(int argc, char **argv)
461                 {
462                         u_char ea[6] = { 0xff, 0xff, 0xff, 0xff, 0xff };
463                         char name[MAXHOSTNAMELEN];
464
465                         ether_ntohost(name, (struct ether_addr *)ea);
466                         exit(0);
467                 }
468         ], [ac_cv_buggy_ether_ntohost=no],
469            [ac_cv_buggy_ether_ntohost=yes],
470            [ac_cv_buggy_ether_ntohost="not while cross-compiling"])])
471     if test "$ac_cv_buggy_ether_ntohost" = "no"; then
472         AC_DEFINE(USE_ETHER_NTOHOST, 1,
473             [define if you have ether_ntohost() and it works])
474     fi
475 ])
476 if test "$ac_cv_func_ether_ntohost" = yes -a \
477     "$ac_cv_buggy_ether_ntohost" = "no"; then
478         #
479         # OK, we have ether_ntohost().  Is it declared in <net/ethernet.h>?
480         #
481         # This test fails if we don't have <net/ethernet.h> or if we do
482         # but it doesn't declare ether_ntohost().
483         #
484         AC_CHECK_DECL(ether_ntohost,
485             [
486                 AC_DEFINE(NET_ETHERNET_H_DECLARES_ETHER_NTOHOST,,
487                     [Define to 1 if net/ethernet.h declares `ether_ntohost'])
488             ],,
489             [
490 #include <net/ethernet.h>
491             ])
492         #
493         # Did that succeed?
494         #
495         if test "$ac_cv_have_decl_ether_ntohost" != yes; then
496                 #
497                 # No, how about <netinet/ether.h>, as on Linux?
498                 #
499                 # This test fails if we don't have <netinet/ether.h>
500                 # or if we do but it doesn't declare ether_ntohost().
501                 #
502                 # Unset ac_cv_have_decl_ether_ntohost so we don't
503                 # treat the previous failure as a cached value and
504                 # suppress the next test.
505                 #
506                 unset ac_cv_have_decl_ether_ntohost
507                 AC_CHECK_DECL(ether_ntohost,
508                     [
509                         AC_DEFINE(NETINET_ETHER_H_DECLARES_ETHER_NTOHOST,,
510                             [Define to 1 if netinet/ether.h declares `ether_ntohost'])
511                     ],,
512                     [
513 #include <netinet/ether.h>
514                     ])
515         fi
516         #
517         # Did that succeed?
518         #
519         if test "$ac_cv_have_decl_ether_ntohost" != yes; then
520                 #
521                 # No, how about <sys/ethernet.h>, as on Solaris 10
522                 # and later?
523                 #
524                 # This test fails if we don't have <sys/ethernet.h>
525                 # or if we do but it doesn't declare ether_ntohost().
526                 #
527                 # Unset ac_cv_have_decl_ether_ntohost so we don't
528                 # treat the previous failure as a cached value and
529                 # suppress the next test.
530                 #
531                 unset ac_cv_have_decl_ether_ntohost
532                 AC_CHECK_DECL(ether_ntohost,
533                     [
534                         AC_DEFINE(SYS_ETHERNET_H_DECLARES_ETHER_NTOHOST,,
535                             [Define to 1 if sys/ethernet.h declares `ether_ntohost'])
536                     ],,
537                     [
538 #include <sys/ethernet.h>
539                     ])
540         fi
541         #
542         # Did that succeed?
543         #
544         if test "$ac_cv_have_decl_ether_ntohost" != yes; then
545                 #
546                 # No, how about <arpa/inet.h>, as in AIX?
547                 #
548                 # This test fails if we don't have <arpa/inet.h>
549                 # (if we have ether_ntohost(), we should have
550                 # networking, and if we have networking, we should
551                 # have <arpa/inet.h>) or if we do but it doesn't
552                 # declare ether_ntohost().
553                 #
554                 # Unset ac_cv_have_decl_ether_ntohost so we don't
555                 # treat the previous failure as a cached value and
556                 # suppress the next test.
557                 #
558                 unset ac_cv_have_decl_ether_ntohost
559                 AC_CHECK_DECL(ether_ntohost,
560                     [
561                         AC_DEFINE(ARPA_INET_H_DECLARES_ETHER_NTOHOST,,
562                             [Define to 1 if arpa/inet.h declares `ether_ntohost'])
563                     ],,
564                     [
565 #include <arpa/inet.h>
566                     ])
567         fi
568         #
569         # Did that succeed?
570         #
571         if test "$ac_cv_have_decl_ether_ntohost" != yes; then
572                 #
573                 # No, how about <netinet/if_ether.h>?
574                 # On some platforms, it requires <net/if.h> and
575                 # <netinet/in.h>, and we always include it with
576                 # both of them, so test it with both of them.
577                 #
578                 # This test fails if we don't have <netinet/if_ether.h>
579                 # and the headers we include before it, or if we do but
580                 # <netinet/if_ether.h> doesn't declare ether_hostton().
581                 #
582                 # Unset ac_cv_have_decl_ether_ntohost so we don't
583                 # treat the previous failure as a cached value and
584                 # suppress the next test.
585                 #
586                 unset ac_cv_have_decl_ether_ntohost
587                 AC_CHECK_DECL(ether_ntohost,
588                     [
589                         AC_DEFINE(NETINET_IF_ETHER_H_DECLARES_ETHER_NTOHOST,,
590                             [Define to 1 if netinet/if_ether.h declares `ether_ntohost'])
591                     ],,
592                     [
593 #include <sys/types.h>
594 #include <sys/socket.h>
595 #include <net/if.h>
596 #include <netinet/in.h>
597 #include <netinet/if_ether.h>
598                     ])
599         fi
600         #
601         # After all that, is ether_ntohost() declared?
602         #
603         if test "$ac_cv_have_decl_ether_ntohost" = yes; then
604                 #
605                 # Yes.
606                 #
607                 AC_DEFINE(HAVE_DECL_ETHER_NTOHOST, 1,
608                     [Define to 1 if you have the declaration of `ether_ntohost'])
609         else
610                 #
611                 # No, we'll have to declare it ourselves.
612                 # Do we have "struct ether_addr" if we include
613                 # <netinet/if_ether.h>?
614                 #
615                 AC_CHECK_TYPES(struct ether_addr,,,
616                     [
617                         #include <sys/types.h>
618                         #include <sys/socket.h>
619                         #include <net/if.h>
620                         #include <netinet/in.h>
621                         #include <netinet/if_ether.h>
622                     ])
623         fi
624 fi
625
626 dnl
627 dnl Check for "pcap_list_datalinks()" and use a substitute version if
628 dnl it's not present.  If it is present, check for "pcap_free_datalinks()";
629 dnl if it's not present, we don't replace it for now.  (We could do so
630 dnl on UN*X, but not on Windows, where hilarity ensues if a program
631 dnl built with one version of the MSVC support library tries to free
632 dnl something allocated by a library built with another version of
633 dnl the MSVC support library.)
634 dnl
635 AC_CHECK_FUNC(pcap_list_datalinks,
636         [
637             AC_DEFINE(HAVE_PCAP_LIST_DATALINKS, 1,
638                 [define if libpcap has pcap_list_datalinks()])
639             AC_CHECK_FUNCS(pcap_free_datalinks)
640         ],
641         [
642             AC_LIBOBJ(datalinks)
643         ])
644
645 dnl
646 dnl Check for "pcap_datalink_name_to_val()", and use a substitute
647 dnl version if it's not present.  If it is present, check for
648 dnl "pcap_datalink_val_to_description()", and if we don't have it,
649 dnl use a substitute version.
650 dnl
651 AC_CHECK_FUNC(pcap_datalink_name_to_val,
652         [
653             AC_DEFINE(HAVE_PCAP_DATALINK_NAME_TO_VAL, 1,
654                 [define if libpcap has pcap_datalink_name_to_val()])
655             AC_CHECK_FUNC(pcap_datalink_val_to_description,
656                 AC_DEFINE(HAVE_PCAP_DATALINK_VAL_TO_DESCRIPTION, 1,
657                     [define if libpcap has pcap_datalink_val_to_description()]),
658                 [
659                     AC_LIBOBJ(dlnames)
660                 ])
661         ],
662         [
663             AC_LIBOBJ(dlnames)
664         ])
665
666 dnl
667 dnl Check for "pcap_set_datalink()"; you can't substitute for it if
668 dnl it's absent (it has hooks into libpcap), so just define the
669 dnl HAVE_ value if it's there.
670 dnl
671 AC_CHECK_FUNCS(pcap_set_datalink)
672
673 dnl
674 dnl Check for "pcap_breakloop()"; you can't substitute for it if
675 dnl it's absent (it has hooks into the live capture routines),
676 dnl so just define the HAVE_ value if it's there.
677 dnl
678 AC_CHECK_FUNCS(pcap_breakloop)
679
680 #
681 # Do we have the new open API?  Check for pcap_create, and assume that,
682 # if we do, we also have pcap_activate() and the other new routines
683 # introduced in libpcap 1.0.0.
684 #
685 AC_CHECK_FUNCS(pcap_create)
686 if test $ac_cv_func_pcap_create = "yes" ; then
687         #
688         # OK, do we have pcap_set_tstamp_type?  If so, assume we have
689         # pcap_list_tstamp_types and pcap_free_tstamp_types as well.
690         #
691         AC_CHECK_FUNCS(pcap_set_tstamp_type)
692         #
693         # And do we have pcap_set_tstamp_precision?  If so, we assume
694         # we also have pcap_open_offline_with_tstamp_precision.
695         #
696         AC_CHECK_FUNCS(pcap_set_tstamp_precision)
697 fi
698
699 #
700 # Check for a miscellaneous collection of functions which we use
701 # if we have them.
702 #
703 AC_CHECK_FUNCS(pcap_findalldevs)
704 if test $ac_cv_func_pcap_findalldevs = "yes" ; then
705 dnl Check for libpcap having pcap_findalldevs() but the pcap.h header
706 dnl not having pcap_if_t; some versions of Mac OS X shipped with pcap.h
707 dnl from 0.6 and libpcap 0.8, so that libpcap had pcap_findalldevs but
708 dnl pcap.h didn't have pcap_if_t.
709     savedcppflags="$CPPFLAGS"
710     CPPFLAGS="$CPPFLAGS $V_INCLS"
711     AC_CHECK_TYPES(pcap_if_t, , , [#include <pcap.h>])
712     CPPFLAGS="$savedcppflags"
713 fi
714 AC_CHECK_FUNCS(pcap_dump_flush pcap_lib_version)
715 if test $ac_cv_func_pcap_lib_version = "no" ; then
716     AC_MSG_CHECKING(whether pcap_version is defined by libpcap)
717     AC_TRY_LINK([],
718        [
719         extern char pcap_version[];
720
721         return (int)pcap_version;
722        ],
723        ac_lbl_cv_pcap_version_defined=yes,
724        ac_lbl_cv_pcap_version_defined=no)
725     if test "$ac_lbl_cv_pcap_version_defined" = yes ; then
726         AC_MSG_RESULT(yes)
727         AC_DEFINE(HAVE_PCAP_VERSION, 1, [define if libpcap has pcap_version])
728     else
729         AC_MSG_RESULT(no)
730     fi
731 fi
732 AC_CHECK_FUNCS(pcap_setdirection pcap_set_immediate_mode pcap_dump_ftell64)
733 AC_CHECK_FUNCS(pcap_open pcap_findalldevs_ex)
734 AC_REPLACE_FUNCS(pcap_dump_ftell)
735
736 #
737 # Check for special debugging functions
738 #
739 AC_CHECK_FUNCS(pcap_set_parser_debug)
740 if test "$ac_cv_func_pcap_set_parser_debug" = "no" ; then
741         #
742         # OK, we don't have pcap_set_parser_debug() to set the libpcap
743         # filter expression parser debug flag; can we directly set the
744         # flag?
745         AC_MSG_CHECKING(whether pcap_debug is defined by libpcap)
746         AC_TRY_LINK([],
747            [
748                 extern int pcap_debug;
749
750                 return pcap_debug;
751            ],
752            ac_lbl_cv_pcap_debug_defined=yes,
753            ac_lbl_cv_pcap_debug_defined=no)
754         if test "$ac_lbl_cv_pcap_debug_defined" = yes ; then
755                 AC_MSG_RESULT(yes)
756                 AC_DEFINE(HAVE_PCAP_DEBUG, 1, [define if libpcap has pcap_debug])
757         else
758                 AC_MSG_RESULT(no)
759                 #
760                 # OK, what about "yydebug"?
761                 #
762                 AC_MSG_CHECKING(whether yydebug is defined by libpcap)
763                 AC_TRY_LINK([],
764                    [
765                         extern int yydebug;
766
767                         return yydebug;
768                    ],
769                    ac_lbl_cv_yydebug_defined=yes,
770                    ac_lbl_cv_yydebug_defined=no)
771                 if test "$ac_lbl_cv_yydebug_defined" = yes ; then
772                         AC_MSG_RESULT(yes)
773                         AC_DEFINE(HAVE_YYDEBUG, 1, [define if libpcap has yydebug])
774                 else
775                         AC_MSG_RESULT(no)
776                 fi
777         fi
778 fi
779 AC_CHECK_FUNCS(pcap_set_optimizer_debug)
780 AC_REPLACE_FUNCS(bpf_dump)      dnl moved to libpcap in 0.6
781
782 V_GROUP=0
783 if test -f /etc/group -a ! -z "`grep '^wheel:' /etc/group`" ; then
784         V_GROUP=wheel
785 fi
786 #
787 # Assume V7/BSD convention for man pages (file formats in section 5,
788 # miscellaneous info in section 7).
789 #
790 MAN_FILE_FORMATS=5
791 MAN_MISC_INFO=7
792 case "$host_os" in
793
794 aix*)
795         dnl Workaround to enable certain features
796         AC_DEFINE(_SUN,1,[define on AIX to get certain functions])
797         ;;
798
799 hpux*)
800         #
801         # Use System V conventions for man pages.
802         #
803         MAN_FILE_FORMATS=4
804         MAN_MISC_INFO=5
805         ;;
806
807 irix*)
808         V_GROUP=sys
809
810         #
811         # Use System V conventions for man pages.
812         #
813         MAN_FILE_FORMATS=4
814         MAN_MISC_INFO=5
815         ;;
816
817 osf*)
818         V_GROUP=system
819
820         #
821         # Use System V conventions for man pages.
822         #
823         MAN_FILE_FORMATS=4
824         MAN_MISC_INFO=5
825         ;;
826
827 solaris*)
828         V_GROUP=sys
829
830         #
831         # Use System V conventions for man pages.
832         #
833         MAN_FILE_FORMATS=4
834         MAN_MISC_INFO=5
835         ;;
836 esac
837
838 if test -f /dev/bpf0 ; then
839         V_GROUP=bpf
840 fi
841
842 #
843 # Make sure we have a definition for C99's uintptr_t (regardless of
844 # whether the environment is a C99 environment or not).
845 #
846 AC_TYPE_UINTPTR_T
847
848 #
849 # Check whether we have pcap/pcap-inttypes.h.
850 # If we do, we use that to get the C99 types defined.
851 #
852 savedcppflags="$CPPFLAGS"
853 CPPFLAGS="$CPPFLAGS $V_INCLS"
854 AC_CHECK_HEADERS(pcap/pcap-inttypes.h)
855 CPPFLAGS="$savedcppflags"
856
857 #
858 # Define the old BSD specified-width types in terms of the C99 types;
859 # we may need them with libpcap include files.
860 #
861 AC_CHECK_TYPE([u_int8_t], ,
862         [AC_DEFINE([u_int8_t], [uint8_t],
863         [Define to `uint8_t' if u_int8_t not defined.])],
864         [AC_INCLUDES_DEFAULT
865 #include <sys/types.h>
866 ])
867 AC_CHECK_TYPE([u_int16_t], ,
868         [AC_DEFINE([u_int16_t], [uint16_t],
869         [Define to `uint16_t' if u_int16_t not defined.])],
870         [AC_INCLUDES_DEFAULT
871 #include <sys/types.h>
872 ])
873 AC_CHECK_TYPE([u_int32_t], ,
874         [AC_DEFINE([u_int32_t], [uint32_t],
875         [Define to `uint32_t' if u_int32_t not defined.])],
876         [AC_INCLUDES_DEFAULT
877 #include <sys/types.h>
878 ])
879 AC_CHECK_TYPE([u_int64_t], ,
880         [AC_DEFINE([u_int64_t], [uint64_t],
881         [Define to `uint64_t' if u_int64_t not defined.])],
882         [AC_INCLUDES_DEFAULT
883 #include <sys/types.h>
884 ])
885
886 AC_PROG_RANLIB
887 AC_CHECK_TOOL([AR], [ar])
888
889 AC_LBL_DEVEL(V_CCOPT)
890
891 # Check for OpenSSL/libressl libcrypto
892 AC_MSG_CHECKING(whether to use OpenSSL/libressl libcrypto)
893 # Specify location for both includes and libraries.
894 want_libcrypto=ifavailable
895 AC_ARG_WITH(crypto,
896     AS_HELP_STRING([--with-crypto]@<:@=DIR@:>@,
897                    [use OpenSSL/libressl libcrypto (located in directory DIR, if specified) @<:@default=yes, if available@:>@]),
898 [
899         if test $withval = no
900         then
901                 # User doesn't want to link with libcrypto.
902                 want_libcrypto=no
903                 AC_MSG_RESULT(no)
904         elif test $withval = yes
905         then
906                 # User wants to link with libcrypto but hasn't specified
907                 # a directory.
908                 want_libcrypto=yes
909                 AC_MSG_RESULT(yes)
910         else
911                 # User wants to link with libcrypto and has specified
912                 # a directory, so use the provided value.
913                 want_libcrypto=yes
914                 libcrypto_root=$withval
915                 AC_MSG_RESULT([yes, using the version installed in $withval])
916
917                 #
918                 # Put the subdirectories of the libcrypto root directory
919                 # at the front of the header and library search path.
920                 #
921                 CFLAGS="-I$withval/include $CFLAGS"
922                 LIBS="-L$withval/lib $LIBS"
923         fi
924 ],[
925         #
926         # Use libcrypto if it's present, otherwise don't; no directory
927         # was specified.
928         #
929         want_libcrypto=ifavailable
930         AC_MSG_RESULT([yes, if available])
931 ])
932 if test "$want_libcrypto" != "no"; then
933         #
934         # Don't check for libcrypto unless we have its headers;
935         # Apple, bless their pointy little heads, apparently ship
936         # libcrypto as a library, but not the header files, in
937         # El Capitan, probably because they don't want you writing
938         # nasty portable code that could run on other UN*Xes, they
939         # want you writing code that uses their Shiny New Crypto
940         # Library and that only runs on macOS.
941         #
942         AC_CHECK_HEADER(openssl/crypto.h,
943         [
944                 AC_CHECK_LIB(crypto, DES_cbc_encrypt)
945                 if test "$ac_cv_lib_crypto_DES_cbc_encrypt" = "yes"; then
946                         AC_CHECK_HEADERS(openssl/evp.h)
947                         #
948                         # OK, then:
949                         #
950                         # 1) do we have EVP_CIPHER_CTX_new?
951                         # If so, we use it to allocate an
952                         # EVP_CIPHER_CTX, as EVP_CIPHER_CTX may be
953                         # opaque; otherwise, we allocate it ourselves.
954                         #
955                         # 2) do we have EVP_DecryptInit_ex()?
956                         # If so, we use it, because we need to be
957                         # able to make two "initialize the cipher"
958                         # calls, one with the cipher and key, and
959                         # one with the IV, and, as of OpenSSL 1.1,
960                         # You Can't Do That with EVP_DecryptInit(),
961                         # because a call to EVP_DecryptInit() will
962                         # unconditionally clear the context, and
963                         # if you don't supply a cipher, it'll
964                         # clear the cipher, rendering the context
965                         # unusable and causing a crash.
966                         #
967                         AC_CHECK_FUNCS(EVP_CIPHER_CTX_new EVP_DecryptInit_ex)
968                 fi
969         ])
970 fi
971
972 # Check for libcap-ng
973 AC_MSG_CHECKING(whether to use libcap-ng)
974 # Specify location for both includes and libraries.
975 want_libcap_ng=ifavailable
976 AC_ARG_WITH(cap_ng,
977     AS_HELP_STRING([--with-cap-ng],
978                    [use libcap-ng @<:@default=yes, if available@:>@]),
979 [
980         if test $withval = no
981         then
982                 want_libcap_ng=no
983                 AC_MSG_RESULT(no)
984         elif test $withval = yes
985         then
986                 want_libcap_ng=yes
987                 AC_MSG_RESULT(yes)
988         fi
989 ],[
990         #
991         # Use libcap-ng if it's present, otherwise don't.
992         #
993         want_libcap_ng=ifavailable
994         AC_MSG_RESULT([yes, if available])
995 ])
996 if test "$want_libcap_ng" != "no"; then
997         AC_CHECK_LIB(cap-ng, capng_change_id)
998         AC_CHECK_HEADERS(cap-ng.h)
999 fi
1000
1001 dnl
1002 dnl set additional include path if necessary
1003 if test "$missing_includes" = "yes"; then
1004         CPPFLAGS="$CPPFLAGS -I$srcdir/missing"
1005         V_INCLS="$V_INCLS -I$srcdir/missing"
1006 fi
1007
1008 AC_SUBST(V_CCOPT)
1009 AC_SUBST(V_DEFS)
1010 AC_SUBST(V_GROUP)
1011 AC_SUBST(V_INCLS)
1012 AC_SUBST(V_PCAPDEP)
1013 AC_SUBST(LOCALSRC)
1014 AC_SUBST(MAN_FILE_FORMATS)
1015 AC_SUBST(MAN_MISC_INFO)
1016
1017 AC_PROG_INSTALL
1018
1019 AC_CONFIG_HEADER(config.h)
1020
1021 AC_OUTPUT_COMMANDS([if test -f .devel; then
1022         echo timestamp > stamp-h
1023         cat $srcdir/Makefile-devel-adds >> Makefile
1024         make depend || exit 1
1025 fi])
1026 AC_OUTPUT(Makefile tcpdump.1)
1027 exit 0