From 3fc4a6fc95c7449f11b96b4b077220a7a5cd16bd Mon Sep 17 00:00:00 2001 From: dmiller Date: Wed, 18 Jul 2018 13:41:35 +0000 Subject: [PATCH] Upgrade libpcap to 1.8.1 (Nmap-specific patches not yet applied) --- libpcap/CHANGES | 50 + libpcap/CMakeLists.txt | 520 ++ libpcap/GenVersion.bat | 23 + libpcap/INSTALL.txt | 59 +- libpcap/Makefile-devel-adds | 4 +- libpcap/Makefile.in | 176 +- ...01-Don-t-autogenerate-Lex-Yacc-files.patch | 126 - .../0002-Disable-unnecessary-features.patch | 96 - ...V3-in-included-libpcap.-Still-broken.patch | 27 - ...indows-to-avoid-a-hang-when-accessin.patch | 278 - libpcap/NMAP_MODIFICATIONS/HOWTO-UPGRADE | 4 +- libpcap/README.sita | 2 +- libpcap/VERSION | 2 +- libpcap/Win32/Include/Gnuc.h | 36 - libpcap/Win32/Include/addrinfo.h | 144 - libpcap/Win32/Include/arpa/nameser.h | 349 -- libpcap/Win32/Include/bittypes.h | 89 - libpcap/Win32/Include/cdecl_ext.h | 37 - libpcap/Win32/Include/inetprivate.h | 67 - libpcap/Win32/Include/ip6_misc.h | 161 - libpcap/Win32/Include/net/netdb.h | 166 - libpcap/Win32/Include/net/paths.h | 105 - libpcap/Win32/Include/sockstorage.h | 38 - libpcap/Win32/Prj/libpcap.dsp | 168 - libpcap/Win32/Prj/libpcap.dsw | 29 - libpcap/Win32/Prj/wpcap.sln | 28 + libpcap/Win32/Prj/wpcap.vcxproj | 234 + libpcap/Win32/Prj/wpcap.vcxproj.filters | 107 + libpcap/Win32/Src/gai_strerror.c | 83 - libpcap/Win32/Src/getaddrinfo.c | 1124 ---- libpcap/Win32/Src/getnetbynm.c | 44 - libpcap/Win32/Src/getnetent.c | 119 - libpcap/Win32/Src/getservent.c | 125 - libpcap/Win32/Src/inet_aton.c | 54 - libpcap/Win32/Src/inet_net.c | 101 - libpcap/Win32/Src/inet_pton.c | 64 - libpcap/aclocal.m4 | 114 +- libpcap/bpf/net/bpf_filter.c | 23 +- libpcap/bpf_dump.c | 5 +- libpcap/bpf_image.c | 12 +- libpcap/cmake/preconfigure.cmake | 55 + libpcap/cmakeconfig.h.in | 345 ++ libpcap/config.h.in | 34 +- libpcap/config/have_siocglifconf.c | 6 + libpcap/configure | 1419 ++++-- libpcap/{configure.in => configure.ac} | 695 +-- libpcap/dlpisubs.c | 31 +- libpcap/etherent.c | 6 +- libpcap/ethertype.h | 3 + libpcap/extract.h | 221 + libpcap/fad-getad.c | 76 +- libpcap/fad-gifc.c | 37 +- libpcap/fad-glifc.c | 60 +- libpcap/fad-helpers.c | 884 ++++ libpcap/fad-sita.c | 59 - libpcap/fad-win32.c | 283 -- libpcap/gen_version_c.sh | 11 + libpcap/gen_version_header.sh | 19 + libpcap/gencode.c | 4509 +++++++++-------- libpcap/gencode.h | 140 +- libpcap/grammar.c | 1177 +++-- libpcap/grammar.y | 243 +- libpcap/inet.c | 938 +--- libpcap/lbl/os-aix7.h | 23 + libpcap/lbl/os-osf4.h | 4 +- libpcap/lbl/os-osf5.h | 6 +- libpcap/lbl/os-solaris2.h | 2 +- libpcap/lbl/os-sunos4.h | 4 +- libpcap/lbl/os-ultrix4.h | 1 - libpcap/{Win32/Src => missing}/getopt.c | 15 +- libpcap/missing/getopt.h | 7 + libpcap/missing/snprintf.c | 20 +- libpcap/missing/strtok_r.c | 87 + libpcap/missing/win_snprintf.c | 31 + libpcap/msdos/bin2c.c | 86 +- libpcap/msdos/common.dj | 17 +- libpcap/msdos/makefile | 368 +- libpcap/msdos/makefile.dj | 126 +- libpcap/msdos/makefile.wc | 265 +- libpcap/msdos/ndis2.c | 1720 +++---- libpcap/msdos/ndis2.h | 1118 ++-- libpcap/msdos/ndis_0.asm | 376 +- libpcap/msdos/pkt_rx0.asm | 394 +- libpcap/msdos/pkt_rx1.s | 310 +- libpcap/msdos/pktdrvr.c | 2872 +++++------ libpcap/msdos/pktdrvr.h | 306 +- libpcap/msdos/readme.dos | 60 +- libpcap/nametoaddr.c | 73 +- libpcap/{fad-null.c => nametoaddr.h} | 34 +- libpcap/optimize.c | 807 +-- libpcap/pcap-bpf.c | 596 ++- libpcap/pcap-bt-linux.c | 56 +- libpcap/pcap-bt-monitor-linux.c | 48 +- libpcap/pcap-can-linux.c | 319 -- libpcap/pcap-can-linux.h | 36 - libpcap/pcap-canusb-linux.c | 474 -- libpcap/pcap-common.c | 101 +- libpcap/pcap-config.1 | 2 +- libpcap/pcap-dag.c | 211 +- libpcap/pcap-dag.h | 94 - libpcap/pcap-dbus.c | 26 +- libpcap/pcap-dlpi.c | 464 +- libpcap/pcap-dos.c | 122 +- libpcap/pcap-filter.manmisc.in | 13 +- libpcap/pcap-int.h | 122 +- libpcap/pcap-libdlpi.c | 39 +- libpcap/pcap-linktype.manmisc.in | 2 +- libpcap/pcap-linux.c | 908 ++-- libpcap/pcap-netfilter-linux.c | 65 +- libpcap/pcap-new.c | 1265 +++++ libpcap/pcap-nit.c | 41 +- libpcap/pcap-null.c | 6 +- libpcap/pcap-pf.c | 57 +- libpcap/pcap-rpcap.c | 2127 ++++++++ libpcap/pcap-rpcap.h | 465 ++ libpcap/pcap-savefile.manfile.in | 2 +- libpcap/pcap-septel.c | 32 +- libpcap/pcap-sita.c | 82 +- libpcap/pcap-snf.c | 71 +- libpcap/pcap-snit.c | 51 +- libpcap/pcap-snoop.c | 89 +- libpcap/pcap-stdinc.h | 105 +- libpcap/pcap-tc.c | 1284 +++++ libpcap/{pcap-canusb-linux.h => pcap-tc.h} | 35 +- libpcap/pcap-tstamp.manmisc.in | 2 +- libpcap/pcap-usb-linux.c | 112 +- libpcap/pcap-win32.c | 904 +++- libpcap/pcap.3pcap.in | 2 +- libpcap/pcap.c | 976 ++-- libpcap/pcap/bluetooth.h | 4 +- libpcap/pcap/bpf.h | 1250 +---- .../{Win32/Src/ffs.c => pcap/can_socketcan.h} | 40 +- libpcap/pcap/dlt.h | 1340 +++++ libpcap/pcap/export-defs.h | 108 + libpcap/pcap/namedb.h | 32 +- libpcap/pcap/nflog.h | 4 +- libpcap/pcap/pcap.h | 293 +- libpcap/pcap/sll.h | 2 + libpcap/pcap/usb.h | 4 +- libpcap/pcap_activate.3pcap | 87 +- libpcap/pcap_breakloop.3pcap | 2 +- libpcap/pcap_can_set_rfmon.3pcap | 34 +- libpcap/pcap_close.3pcap | 2 +- libpcap/pcap_compile.3pcap.in | 2 +- libpcap/pcap_create.3pcap | 2 +- libpcap/pcap_datalink.3pcap.in | 2 +- libpcap/pcap_datalink_name_to_val.3pcap | 5 +- libpcap/pcap_datalink_val_to_name.3pcap | 16 +- libpcap/pcap_dump.3pcap | 2 +- libpcap/pcap_dump_close.3pcap | 2 +- libpcap/pcap_dump_file.3pcap | 2 +- libpcap/pcap_dump_flush.3pcap | 2 +- libpcap/pcap_dump_ftell.3pcap | 2 +- libpcap/pcap_dump_open.3pcap.in | 2 +- libpcap/pcap_file.3pcap | 2 +- libpcap/pcap_fileno.3pcap | 2 +- libpcap/pcap_findalldevs.3pcap | 2 +- libpcap/pcap_freecode.3pcap | 2 +- libpcap/pcap_get_selectable_fd.3pcap | 2 +- libpcap/pcap_get_tstamp_precision.3pcap.in | 2 +- libpcap/pcap_geterr.3pcap | 4 +- libpcap/pcap_inject.3pcap | 2 +- libpcap/pcap_is_swapped.3pcap | 2 +- libpcap/pcap_lib_version.3pcap | 2 +- libpcap/pcap_list_datalinks.3pcap.in | 2 +- libpcap/pcap_list_tstamp_types.3pcap.in | 2 +- libpcap/pcap_lookupdev.3pcap | 2 +- libpcap/pcap_lookupnet.3pcap | 2 +- libpcap/pcap_loop.3pcap | 2 +- libpcap/pcap_major_version.3pcap | 2 +- libpcap/pcap_next_ex.3pcap | 2 +- libpcap/pcap_offline_filter.3pcap | 2 +- libpcap/pcap_open_dead.3pcap.in | 2 +- libpcap/pcap_open_live.3pcap | 2 +- libpcap/pcap_open_offline.3pcap.in | 2 +- libpcap/pcap_set_buffer_size.3pcap | 2 +- libpcap/pcap_set_datalink.3pcap | 2 +- libpcap/pcap_set_immediate_mode.3pcap | 2 +- libpcap/pcap_set_promisc.3pcap | 2 +- libpcap/pcap_set_rfmon.3pcap | 2 +- libpcap/pcap_set_snaplen.3pcap | 2 +- libpcap/pcap_set_timeout.3pcap | 9 +- libpcap/pcap_set_tstamp_precision.3pcap.in | 2 +- libpcap/pcap_set_tstamp_type.3pcap.in | 2 +- libpcap/pcap_setdirection.3pcap | 2 +- libpcap/pcap_setfilter.3pcap | 2 +- libpcap/pcap_setnonblock.3pcap | 2 +- libpcap/pcap_snapshot.3pcap | 2 +- libpcap/pcap_stats.3pcap | 2 +- libpcap/pcap_statustostr.3pcap | 2 +- libpcap/pcap_strerror.3pcap | 2 +- libpcap/pcap_tstamp_type_name_to_val.3pcap | 2 +- libpcap/pcap_tstamp_type_val_to_name.3pcap | 2 +- libpcap/pcap_version.h.in | 13 + libpcap/portability.h | 216 + libpcap/remote-ext.h | 467 ++ libpcap/runlex.sh | 233 - libpcap/savefile.c | 170 +- libpcap/scanner.c | 1619 +++--- libpcap/scanner.c.top | 3 - libpcap/scanner.h | 363 +- libpcap/scanner.l | 245 +- libpcap/sf-pcap-ng.c | 382 +- libpcap/sf-pcap.c | 202 +- libpcap/sockutils.c | 1230 +++++ libpcap/sockutils.h | 241 + libpcap/tests/CMakeLists.txt | 42 + libpcap/tests/can_set_rfmon_test.c | 92 + libpcap/tests/capturetest.c | 67 +- libpcap/tests/filtertest.c | 79 +- libpcap/tests/findalldevstest.c | 29 +- libpcap/tests/opentest.c | 77 +- libpcap/tests/reactivatetest.c | 2 +- libpcap/tests/selpolltest.c | 73 +- libpcap/tests/valgrindtest.c | 88 +- libpcap/tokdefs.h | 322 -- 216 files changed, 27408 insertions(+), 18957 deletions(-) create mode 100644 libpcap/CMakeLists.txt create mode 100644 libpcap/GenVersion.bat delete mode 100644 libpcap/NMAP_MODIFICATIONS/0001-Don-t-autogenerate-Lex-Yacc-files.patch delete mode 100644 libpcap/NMAP_MODIFICATIONS/0002-Disable-unnecessary-features.patch delete mode 100644 libpcap/NMAP_MODIFICATIONS/0003-Disable-TPACKET_V3-in-included-libpcap.-Still-broken.patch delete mode 100644 libpcap/NMAP_MODIFICATIONS/0004-Use-a-mutex-on-Windows-to-avoid-a-hang-when-accessin.patch delete mode 100644 libpcap/Win32/Include/addrinfo.h delete mode 100644 libpcap/Win32/Include/arpa/nameser.h delete mode 100644 libpcap/Win32/Include/bittypes.h delete mode 100644 libpcap/Win32/Include/cdecl_ext.h delete mode 100644 libpcap/Win32/Include/inetprivate.h delete mode 100644 libpcap/Win32/Include/ip6_misc.h delete mode 100644 libpcap/Win32/Include/net/netdb.h delete mode 100644 libpcap/Win32/Include/net/paths.h delete mode 100644 libpcap/Win32/Include/sockstorage.h delete mode 100644 libpcap/Win32/Prj/libpcap.dsp delete mode 100644 libpcap/Win32/Prj/libpcap.dsw create mode 100644 libpcap/Win32/Prj/wpcap.sln create mode 100644 libpcap/Win32/Prj/wpcap.vcxproj create mode 100644 libpcap/Win32/Prj/wpcap.vcxproj.filters delete mode 100644 libpcap/Win32/Src/gai_strerror.c delete mode 100644 libpcap/Win32/Src/getaddrinfo.c delete mode 100644 libpcap/Win32/Src/getnetbynm.c delete mode 100644 libpcap/Win32/Src/getnetent.c delete mode 100644 libpcap/Win32/Src/getservent.c delete mode 100644 libpcap/Win32/Src/inet_aton.c delete mode 100644 libpcap/Win32/Src/inet_net.c delete mode 100644 libpcap/Win32/Src/inet_pton.c create mode 100644 libpcap/cmake/preconfigure.cmake create mode 100644 libpcap/cmakeconfig.h.in create mode 100644 libpcap/config/have_siocglifconf.c rename libpcap/{configure.in => configure.ac} (75%) create mode 100644 libpcap/extract.h create mode 100644 libpcap/fad-helpers.c delete mode 100644 libpcap/fad-sita.c delete mode 100644 libpcap/fad-win32.c create mode 100755 libpcap/gen_version_c.sh create mode 100755 libpcap/gen_version_header.sh create mode 100644 libpcap/lbl/os-aix7.h rename libpcap/{Win32/Src => missing}/getopt.c (95%) create mode 100644 libpcap/missing/getopt.h create mode 100644 libpcap/missing/strtok_r.c create mode 100644 libpcap/missing/win_snprintf.c rename libpcap/{fad-null.c => nametoaddr.h} (70%) delete mode 100644 libpcap/pcap-can-linux.c delete mode 100644 libpcap/pcap-can-linux.h delete mode 100644 libpcap/pcap-canusb-linux.c create mode 100644 libpcap/pcap-new.c create mode 100644 libpcap/pcap-rpcap.c create mode 100644 libpcap/pcap-rpcap.h create mode 100644 libpcap/pcap-tc.c rename libpcap/{pcap-canusb-linux.h => pcap-tc.h} (68%) rename libpcap/{Win32/Src/ffs.c => pcap/can_socketcan.h} (70%) create mode 100644 libpcap/pcap/dlt.h create mode 100644 libpcap/pcap/export-defs.h create mode 100644 libpcap/pcap_version.h.in create mode 100644 libpcap/portability.h create mode 100644 libpcap/remote-ext.h delete mode 100755 libpcap/runlex.sh delete mode 100644 libpcap/scanner.c.top create mode 100644 libpcap/sockutils.c create mode 100644 libpcap/sockutils.h create mode 100644 libpcap/tests/CMakeLists.txt create mode 100644 libpcap/tests/can_set_rfmon_test.c delete mode 100644 libpcap/tokdefs.h diff --git a/libpcap/CHANGES b/libpcap/CHANGES index f0fd50ea5..178409659 100644 --- a/libpcap/CHANGES +++ b/libpcap/CHANGES @@ -1,3 +1,53 @@ +Tuesday, Oct. 25, 2016 mcr@sandelman.ca + Summary for 1.8.1 libpcap release + Add a target in Makefile.in for Exuberant Ctags use: 'extags'. + Rename configure.in to configure.ac: autoconf 2.59 + Clean up the name-to-DLT mapping table. + Add some newer DLT_ values: IPMI_HPM_2,ZWAVE_R1_R2,ZWAVE_R3,WATTSTOPPER_DLM,ISO_14443,RDS + Clarify what the return values are for both success and failure. + Many changes to build on windows + Check for the "break the loop" condition in the inner loop for TPACKET_V3. + Fix handling of packet count in the TPACKET_V3 inner loop: GitHub issue #493. + Filter out duplicate looped back CAN frames. + Fix the handling of loopback filters for IPv6 packets. + Add a link-layer header type for RDS (IEC 62106) groups. + Use different intermediate folders for x86 and x64 builds on Windows. + On Linux, handle all CAN captures with pcap-linux.c, in cooked mode. + Removes the need for the "host-endian" link-layer header type. + Compile with '-Wused-but-marked-unused' in devel mode if supported + Have separate DLTs for big-endian and host-endian SocketCAN headers. + Reflect version.h being renamed to pcap_version.h. + Require that version.h be generated: all build procedures we support generate version.h (autoconf, CMake, MSVC)! + Properly check for sock_recv() errors. + Re-impose some of Winsock's limitations on sock_recv(). + Replace sprintf() with pcap_snprintf(). + Fix signature of pcap_stats_ex_remote(). + Initial cmake support for remote packet capture. + Have rpcap_remoteact_getsock() return a SOCKET and supply an "is active" flag. + Clean up {DAG, Septel, Myricom SNF}-only builds. + Do UTF-16-to-ASCII conversion into the right place. + pcap_create_interface() needs the interface name on Linux. + Clean up hardware time stamp support: the "any" device does not support any time stamp types. + Add support for capturing on FreeBSD usbusN interfaces. + Add a LINKTYPE/DLT_ value for FreeBSD USB. + Go back to using PCAP_API on Windows. + CMake support + Add TurboCap support from WinPcap. + Recognize 802.1ad nested VLAN tag in vlan filter. + +Thursday Sep. 3, 2015 guy@alum.mit.edu + Summary for 1.7.5 libpcap release + Man page cleanups. + Add some allocation failure checks. + Fix a number of Linux/ucLinux configure/build issues. + Fix some memory leaks. + Recognize 802.1ad nested VLAN tag in vlan filter. + Fix building Bluetooth Linux Monitor support with BlueZ 5.1+ + +Saturday Jun. 27, 2015 mcr@sandelman.ca + Summary for 1.7.4 libpcap release + Include fix for GitHub issue #424 -- out of tree builds. + Friday Apr. 10, 2015 guy@alum.mit.edu Summary for 1.7.3 libpcap release Work around a Linux bonding driver bug. diff --git a/libpcap/CMakeLists.txt b/libpcap/CMakeLists.txt new file mode 100644 index 000000000..0ed8b6129 --- /dev/null +++ b/libpcap/CMakeLists.txt @@ -0,0 +1,520 @@ +cmake_minimum_required( VERSION 2.8.8 ) + +project( pcap ) +# +# Call the library "wpcap" on Windows, for backwards compatibility. +# +if( WIN32 ) + set( LIBRARY_NAME wpcap ) +else() + set( LIBRARY_NAME pcap ) +endif() + +################################################################### +# Parameters +################################################################### + +option (INET6 "Enable IPv6" ON) +if( MSVC ) + option (USE_STATIC_RT "Use static Runtime" ON) +endif( MSVC ) +option (BUILD_SHARED_LIBS "Build shared libraries" ON) +if( WIN32 ) + set(PACKET_DLL_DIR "" CACHE PATH "Path to directory with include and lib subdirectories for packet.dll") +endif( WIN32 ) + +# +# XXX - this should be an option, defaulting to "yes" for Windows and to +# "no", for now, on UN*X. +# +if( WIN32 ) + set( HAVE_REMOTE 1 ) +endif( WIN32 ) + +###################################### +# Project settings +###################################### + +add_definitions( -DHAVE_CONFIG_H ) + +include_directories( + ${CMAKE_CURRENT_BINARY_DIR} + ${pcap_SOURCE_DIR} +) + +if( WIN32 ) + if( NOT "${PACKET_DLL_DIR}" STREQUAL "" ) + include_directories("${PACKET_DLL_DIR}/Include") + if( CMAKE_CL_64 ) + link_directories("${PACKET_DLL_DIR}/Lib/x64") + else( CMAKE_CL_64 ) + link_directories("${PACKET_DLL_DIR}/Lib") + endif( CMAKE_CL_64 ) + endif() + include_directories( + ../Common/ + Win32/Include + ) +endif( WIN32) + +add_definitions( -DBUILDING_PCAP ) + +if( MSVC ) + add_definitions( -D__STDC__ ) + add_definitions( -D_CRT_SECURE_NO_WARNINGS ) + add_definitions( "-D_U_=" ) +elseif( CMAKE_COMPILER_IS_GNUCXX ) + add_definitions( "-D_U_=__attribute__((unused))" ) +else(MSVC) + add_definitions( "-D_U_=" ) +endif( MSVC ) + +if( MSVC ) + if (USE_STATIC_RT) + MESSAGE( STATUS "Use STATIC runtime" ) + set(NAME_RT MT) + set (CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} /MT") + set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /MT") + set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT") + set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd") + + set (CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} /MT") + set (CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} /MT") + set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MT") + set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /MTd") + else (USE_STATIC_RT) + MESSAGE( STATUS "Use DYNAMIC runtime" ) + set(NAME_RT MD) + set (CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} /MD") + set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /MD") + set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD") + set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd") + + set (CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} /MD") + set (CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} /MD") + set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MD") + set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /MDd") + endif (USE_STATIC_RT) +endif( MSVC ) + +################################################################### +# Detect available platform features +################################################################### + +include(CheckIncludeFile) +include(CheckFunctionExists) +include(CheckStructHasMember) +include(CheckTypeSize) + +# +# Header files. +# +check_include_file( inttypes.h HAVE_INTTYPES_H ) +check_include_file( stdint.h HAVE_STDINT_H ) +check_include_file( unistd.h HAVE_UNISTD_H ) +if( NOT HAVE_UNISTD_H ) + add_definitions( -DYY_NO_UNISTD_H ) +endif( NOT HAVE_UNISTD_H ) +check_include_file( bitypes.h HAVE_SYS_BITYPES_H ) +check_include_file( limits.h HAVE_LIMITS_H ) + +# +# Functions. +# +check_function_exists( strerror HAVE_STRERROR ) +check_function_exists( strlcpy HAVE_STRLCPY ) +check_function_exists( snprintf HAVE_SNPRINTF ) +check_function_exists( vsnprintf HAVE_VSNPRINTF ) +check_function_exists( strtok_r HAVE_STRTOK_R ) + +if (WIN32) + # + # Check for Windows-only functions, such as packet.dll functions. + # + check_function_exists( PacketIsLoopbackAdapter HAVE_PACKET_IS_LOOPBACK_ADAPTER ) +endif() + +# +# Data types. +# +# XXX - there's no check_struct() macro that's like check_struct_has_member() +# except that it only checks for the existence of the structure type, +# so we use check_struct_has_member() and look for ss_family. +# +check_struct_has_member("struct sockaddr_storage" ss_family sys/socket.h HAVE_SOCKADDR_STORAGE) +set(CMAKE_EXTRA_INCLUDE_FILES unistd.h sys/socket.h) +check_type_size("socklen_t" SOCKLEN_T) +set(CMAKE_EXTRA_INCLUDE_FILES unistd.h) + +# +# Structure fields. +# +check_struct_has_member("struct sockaddr" sa_len sys/socket.h HAVE_SOCKADDR_SA_LEN ) + +if( INET6 ) + MESSAGE( STATUS "Use IPv6" ) +endif( INET6 ) + +if( WIN32 ) + add_definitions( -DHAVE_ADDRINFO ) +endif( WIN32 ) + +###################################### +# External dependencies +###################################### + +###################################### +# Input files +###################################### + +set(PROJECT_SOURCE_LIST_C + bpf_dump.c + bpf_image.c + etherent.c + fad-helpers.c + gencode.c + inet.c + nametoaddr.c + optimize.c + pcap-common.c + pcap.c + savefile.c + sf-pcap-ng.c + sf-pcap.c + bpf/net/bpf_filter.c +) + +if( WIN32 ) + set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} missing/win_snprintf.c ) +else() + if( NOT HAVE_SNPRINTF ) + set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} missing/snprintf.c ) + endif( NOT HAVE_SNPRINTF ) + if( NOT HAVE_STRTOK_R ) + set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} missing/strtok_r.c ) + endif( NOT HAVE_STRTOK_R ) +endif( WIN32 ) + +if( HAVE_REMOTE ) + set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} + pcap-new.c pcap-rpcap.c sockutils.c) +endif( HAVE_REMOTE ) + +# +# Determine the main pcap-XXX.c file to use. +# +if( WIN32 ) + # + # WinPcap. + # + set( PCAP_TYPE win32 ) +else() + # + # UN*X - figure out what type of packet capture mechanism we + # have. + # + if( EXISTS /dev/bpf ) + # + # Cloning BPF device. + # + set( PCAP_TYPE bpf ) + AC_DEFINE(HAVE_CLONING_BPF,1,[define if you have a cloning BPF device]) + elseif( EXISTS /dev/bpf0 ) + set( PCAP_TYPE bpf ) + + # + # XXX - many more BPF checks. + # + elseif( EXISTS /usr/include/net/pfilt.h ) + # + # DEC OSF/1, Digital UNIX, Tru64 UNIX + # + set( PCAP_TYPE pf ) + elseif( EXISTS /dev/enet ) + set( PCAP_TYPE enet ) + elseif( EXISTS /dev/nit ) + set( PCAP_TYPE snit ) + elseif( EXISTS /usr/include/sys/net/nit.h ) + set( PCAP_TYPE nit ) + elseif( EXISTS /usr/include/linux/socket.h ) + set( PCAP_TYPE linux ) + + # + # Do we have the wireless extensions? + # + check_include_file( linux/wireless.h HAVE_LINUX_WIRELESS_H ) + + # + # XXX - many more Linux checks. + # + elseif( EXISTS /usr/include/net/raw.h ) + set( PCAP_TYPE snoop ) + elseif( EXISTS /usr/include/odmi.h ) + # + # On AIX, the BPF devices might not yet be present - they're + # created the first time libpcap runs after booting. + # We check for odmi.h instead. + # + set( PCAP_TYPE bpf ) + elseif( /usr/include/sys/dlpi.h ) + set( PCAP_TYPE dlpi ) + + # + # XXX - many more DLPI checks. + # + else() + set( PCAP_TYPE null ) + endif() +endif( WIN32 ) +message(STATUS "Packet capture mechanism type: ${PCAP_TYPE}") +set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} pcap-${PCAP_TYPE}.c) + +# +# Now figure out how we get a list of interfaces and addresses, +# if we support capturing. Don't bother if we don't support +# capturing. +# +if( NOT WIN32 ) + # + # UN*X - figure out what type of interface list mechanism we + # have. + # + if( ${PCAP_TYPE} STREQUAL "null" ) + # + # We can't capture, so we can't open any capture + # devices, so we won't return any interfaces. + # + set( FINDALLDEVS_TYPE null ) + else() + check_function_exists( getifaddrs HAVE_GETIFADDRS ) + if( ${HAVE_GETIFADDRS} ) + # + # We have "getifaddrs()"; make sure we have + # as well, just in case some platform is really weird. + # + check_include_file( ifaddrs.h HAVE_IFADDRS_H ) + if( ${HAVE_IFADDRS_H} ) + # + # We have the header, so we use "getifaddrs()" to + # get the list of interfaces. + # + set( FINDALLDEVS_TYPE getad ) + else() + # + # We don't have the header - give up. + # XXX - we could also fall back on some other + # mechanism, but, for now, this'll catch this + # problem so that we can at least try to figure + # out something to do on systems with "getifaddrs()" + # but without "ifaddrs.h", if there is something + # we can do on those systems. + # + message(FATAL_ERROR "Your system has getifaddrs() but doesn't have a usable ." ) + endif() + else() + # + # Well, we don't have "getifaddrs()", so we have to use + # some other mechanism; determine what that mechanism is. + # + # The first thing we use is the type of capture mechanism, + # which is somewhat of a proxy for the OS we're using. + # + if( ${PCAP_TYPE} STREQUAL "dlpi" OR ${PCAP_TYPE} STREQUAL "libdlpi" ) + # + # This might be Solaris 8 or later, with + # SIOCGLIFCONF, or it might be some other OS + # or some older version of Solaris, with + # just SIOCGIFCONF. + # + try_compile( HAVE_SIOCGLIFCONF ${CMAKE_CURRENT_BINARY_DIR} "${pcap_SOURCE_DIR}/config/have_siocglifconf.c" ) + message( STATUS "HAVE_SIOCGLIFCONF = ${HAVE_SIOCGLIFCONF}" ) + if( HAVE_SIOCGLIFCONF ) + set( FINDALLDEVS_TYPE glifc ) + else() + set( FINDALLDEVS_TYPE gifc ) + endif() + else() + # + # Assume we just have SIOCGIFCONF. + # (XXX - on at least later Linux kernels, there's + # another mechanism, and we should be using that + # instead.) + # + set( FINDALLDEVS_TYPE gifc ) + endif() + endif() + endif() + message(STATUS "Find-interfaces mechanism type: ${FINDALLDEVS_TYPE}") + set( PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} fad-${FINDALLDEVS_TYPE}.c ) +endif() + +file(GLOB PROJECT_SOURCE_LIST_CORE_H + *.h + pcap/*.h +) +set( PROJECT_SOURCE_LIST_H ${PROJECT_SOURCE_LIST_H} ${PROJECT_SOURCE_LIST_CORE_H} ) + +if( WIN32 ) + file(GLOB PROJECT_SOURCE_LIST_WIN32_H + Win32/Include/*.h + ) + set( PROJECT_SOURCE_LIST_H ${PROJECT_SOURCE_LIST_H} ${PROJECT_SOURCE_LIST_WIN32_H} ) +endif( WIN32 ) + +# +# {Flex} and YACC/Berkeley YACC/Bison. +# From a mail message to the CMake mailing list by Andy Cedilnik of +# Kitware. +# + +# +# Try to find Flex, a Windows version of Flex, or Lex. +# +find_program(LEX_EXECUTABLE NAMES flex win_flex lex) +if( ${LEX_EXECUTABLE} STREQUAL "LEX_EXECUTABLE-NOTFOUND" ) + message(FATAL_ERROR "Neither flex nor win_flex nor lex was found." ) +endif() +message(STATUS "Lexical analyzer generator: ${LEX_EXECUTABLE}") + +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/scanner.c ${CMAKE_CURRENT_BINARY_DIR}/scanner.h + SOURCE ${pcap_SOURCE_DIR}/scanner.l + COMMAND ${LEX_EXECUTABLE} -P pcap_ --header-file=scanner.h --nounput -o${CMAKE_CURRENT_BINARY_DIR}/scanner.c ${pcap_SOURCE_DIR}/scanner.l + DEPENDS ${pcap_SOURCE_DIR}/scanner.l +) + +# +# Since scanner.c does not exist yet when cmake is run, mark +# it as generated. +# +# Since scanner.c includes grammar.h, mark that as a dependency. +# +set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/scanner.c PROPERTIES + GENERATED TRUE + OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/scanner.h +) + +# +# Add scanner.c to the list of sources. +# +#set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} ${CMAKE_CURRENT_BINARY_DIR}/scanner.c) + +# +# Try to find YACC or Bison. +# +find_program(YACC_EXECUTABLE NAMES bison win_bison byacc yacc) +if( ${YACC_EXECUTABLE} STREQUAL "YACC_EXECUTABLE-NOTFOUND" ) + message(FATAL_ERROR "Neither bison nor win_bison nor byacc nor yacc was found." ) +endif() +message(STATUS "Parser generator: ${YACC_EXECUTABLE}") + +# +# Create custom command for the scanner. +# Find out whether it's Bison or notby looking at the last component +# of the path (without a .exe extension, if this is Windows). +# +get_filename_component(YACC_NAME ${YACC_EXECUTABLE} NAME_WE) +if( "${YACC_NAME}" STREQUAL "bison" OR "${YACC_NAME}" STREQUAL "win_bison" ) + set( YACC_COMPATIBILITY_FLAG "-y" ) +endif() +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/grammar.c ${CMAKE_CURRENT_BINARY_DIR}/grammar.h + SOURCE ${pcap_SOURCE_DIR}/grammar.y + COMMAND ${YACC_EXECUTABLE} ${YACC_COMPATIBILITY_FLAG} -p pcap_ -o ${CMAKE_CURRENT_BINARY_DIR}/grammar.c -d ${pcap_SOURCE_DIR}/grammar.y + DEPENDS ${pcap_SOURCE_DIR}/grammar.y +) + +# +# Since grammar.c does not exists yet when cmake is run, mark +# it as generated. +# +set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/grammar.c PROPERTIES + GENERATED TRUE +) + +# +# Add grammar.c to the list of sources. +# +#set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} ${CMAKE_CURRENT_BINARY_DIR}/grammar.c) + +if( WIN32 ) + # + # CMake does not love Windows. + # + file(TO_NATIVE_PATH "${pcap_SOURCE_DIR}/GenVersion.bat" GenVersion_path) + file(TO_NATIVE_PATH "${pcap_SOURCE_DIR}/VERSION" VERSION_path) + file(TO_NATIVE_PATH "${pcap_SOURCE_DIR}/pcap_version.h.in" version_h_in_path) + file(TO_NATIVE_PATH "${CMAKE_CURRENT_BINARY_DIR}/pcap_version.h" version_h_path) + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/pcap_version.h + SOURCE ${pcap_SOURCE_DIR}/VERSION ${pcap_SOURCE_DIR}/pcap_version.h.in + COMMAND ${GenVersion_path} ${VERSION_path} ${version_h_in_path} ${version_h_path} + DEPENDS ${pcap_SOURCE_DIR}/VERSION ${pcap_SOURCE_DIR}/pcap_version.h.in + ) +else( WIN32 ) + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/version.c + SOURCE ${pcap_SOURCE_DIR}/VERSION + COMMAND ${pcap_SOURCE_DIR}/gen_version_c.sh ${pcap_SOURCE_DIR}/VERSION ${CMAKE_CURRENT_BINARY_DIR}/version.c + DEPENDS ${pcap_SOURCE_DIR}/VERSION + ) + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/pcap_version.h + SOURCE ${pcap_SOURCE_DIR}/VERSION + COMMAND ${pcap_SOURCE_DIR}/gen_version_header.sh ${pcap_SOURCE_DIR}/VERSION ${pcap_SOURCE_DIR}/pcap_version.h.in ${CMAKE_CURRENT_BINARY_DIR}/pcap_version.h + DEPENDS ${pcap_SOURCE_DIR}/VERSION + ) + + # + # Since version.c does not exists yet when cmake is run, mark + # it as generated. + # + set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/version.c PROPERTIES + GENERATED TRUE + ) + + # + # Add version.c to the list of sources. + # + set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} ${CMAKE_CURRENT_BINARY_DIR}/version.c) +endif( WIN32 ) + +# +# Since pcap_version.h does not exists yet when cmake is run, mark +# it as generated. +# +set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/pcap_version.h PROPERTIES + GENERATED TRUE +) + +# +# Add pcap_version.h to the list of headers. +# +set(PROJECT_SOURCE_LIST_H ${PROJECT_SOURCE_LIST_H} ${CMAKE_CURRENT_BINARY_DIR}/pcap_version.h) + +source_group("Source Files" FILES ${PROJECT_SOURCE_LIST_C}) +source_group("Header Files" FILES ${PROJECT_SOURCE_LIST_H}) + +###################################### +# Register targets +###################################### + +add_library(${LIBRARY_NAME} + ${PROJECT_SOURCE_LIST_C} + ${CMAKE_CURRENT_BINARY_DIR}/grammar.c + ${CMAKE_CURRENT_BINARY_DIR}/scanner.c + ${PROJECT_SOURCE_LIST_H} +) + +if( WIN32 ) + target_link_libraries ( ${LIBRARY_NAME} + packet + ws2_32 + ) +endif( WIN32 ) + +###################################### +# Write out the config.h file +###################################### + +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmakeconfig.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h) diff --git a/libpcap/GenVersion.bat b/libpcap/GenVersion.bat new file mode 100644 index 000000000..babf3737e --- /dev/null +++ b/libpcap/GenVersion.bat @@ -0,0 +1,23 @@ +REM +REM Automatically generate pcap_version.h based on pcap_version.h.in +REM for Windows +REM The version string comes from VERSION +REM @echo off +REM + +setlocal enableextensions disabledelayedexpansion + +set "search=%%%%LIBPCAP_VERSION%%%%" +set /p replace=<%1 + +if exist %3 del %3 2>nul + +for /f "delims=" %%i in ('type %2' ) do ( + set "line=%%i" + setlocal enabledelayedexpansion + set "line=!line:%search%=%replace%!" + >>%3 echo(!line! + endlocal +) + +echo pcap_version.h generated diff --git a/libpcap/INSTALL.txt b/libpcap/INSTALL.txt index 18b489aa8..f305aa2b7 100644 --- a/libpcap/INSTALL.txt +++ b/libpcap/INSTALL.txt @@ -16,7 +16,7 @@ does support packet capture but libpcap does not support that particular type. (If you have HP-UX, see below.) If your system uses a packet capture not supported by libpcap, please send us patches; don't forget to include an autoconf fragment suitable for use in -configure.in. +configure.ac. It is possible to override the default packet capture type, although the circumstance where this works are limited. For example if you have @@ -31,40 +31,22 @@ You will need an ANSI C compiler to build libpcap. The configure script will abort if your compiler is not ANSI compliant. If this happens, use the generally available GNU C compiler (GCC). -If you use flex, you must use version 2.4.6 or higher. The configure -script automatically detects the version of flex and will not use it -unless it is new enough. You can use "flex -V" to see what version you -have (unless it's really old). The current version of flex is available -at flex.sourceforge.net and often comes packaged by means of the OS. -As of this writing, the current version is 2.5.37. +You will need either Flex 2.5.31 or later, or a version of Lex +compatible with it (if any exist), to build libpcap. The configure +script will abort if there isn't any such program. If you have an older +version of Flex, or don't have a compatible version of Lex, the current +version of flex is available at flex.sourceforge.net. -If you use bison, you must use flex (and visa versa). The configure -script automatically falls back to lex and yacc if both flex and bison -are not found. +You will need either Bison, Berkeley YACC, or a version of YACC +compatible with them (if any exist), to build libpcap. The configure +script will abort if there isn't any such program. If you don't have +any such program, the current version of Bison can be found at +http://ftp.gnu.org/gnu/bison/ and the current version of Berkeley YACC +can be found at http://invisible-island.net/byacc/. -Sometimes the stock C compiler does not interact well with flex and -bison. The list of problems includes undefined references for alloca. -You can get around this by installing gcc or manually disabling flex -and bison with: - - ./configure --without-flex --without-bison - -If your system only has AT&T lex, this is okay unless your libpcap -program uses other lex/yacc generated code. (Although it's possible to -map the yy* identifiers with a script, we use flex and bison so we -don't feel this is necessary.) - -Some systems support the Berkeley Packet Filter natively; for example -out of the box OSF and BSD/OS have bpf. If your system does not support -bpf, you will need to pick up: - - ftp://ftp.ee.lbl.gov/bpf-*.tar.Z - -Note well: you MUST have kernel source for your operating system in -order to install bpf. An exception is SunOS 4; the bpf distribution -includes replacement kernel objects for some of the standard SunOS 4 -network device drivers. See the bpf INSTALL document for more -information. +Sometimes the stock C compiler does not interact well with Flex and +Bison. The list of problems includes undefined references for alloca. +You can get around this by installing GCC. If you use Solaris, there is a bug with bufmod(7) that is fixed in Solaris 2.3.2 (aka SunOS 5.3.2). Setting a snapshot length with the @@ -239,11 +221,11 @@ the libpcap 0.6.2 source release, so this release of libpcap might also build without changes on UnixWare 7. If linking tcpdump fails with "Undefined: _alloca" when using bison on -a Sun4, your version of bison is broken. In any case version 1.16 or +a Sun4, your version of Bison is broken. In any case version 1.16 or higher is recommended (1.14 is known to cause problems 1.16 is known to work). Either pick up a current version from: - ftp://ftp.gnu.org/pub/gnu/bison + http://ftp.gnu.org/gnu/bison/ or hack around it by inserting the lines: @@ -289,6 +271,7 @@ FILES CHANGES - description of differences between releases ChmodBPF/* - Mac OS X startup item to set ownership and permissions on /dev/bpf* +CMakeLists.txt - CMake file CREDITS - people that have helped libpcap along INSTALL.txt - this file LICENSE - the license under which tcpdump is distributed @@ -317,7 +300,7 @@ config.guess - autoconf support config.h.in - autoconf input config.sub - autoconf support configure - configure script (run this first) -configure.in - configure script source +configure.ac - configure script source dlpisubs.c - DLPI-related functions for pcap-dlpi.c and pcap-libdlpi.c dlpisubs.h - DLPI-related function declarations etherent.c - /etc/ethers support routines @@ -325,9 +308,6 @@ ethertype.h - Ethernet protocol types and names definitions fad-getad.c - pcap_findalldevs() for systems with getifaddrs() fad-gifc.c - pcap_findalldevs() for systems with only SIOCGIFLIST fad-glifc.c - pcap_findalldevs() for systems with SIOCGLIFCONF -fad-null.c - pcap_findalldevs() for systems without capture support -fad-sita.c - pcap_findalldevs() for systems with SITA support -fad-win32.c - pcap_findalldevs() for WinPcap filtertest.c - test program for BPF compiler findalldevstest.c - test program for pcap_findalldevs() gencode.c - BPF code generation routines @@ -388,7 +368,6 @@ pcap_*.3pcap - manual entries for library functions pcap-filter.4 - manual entry for filter syntax pcap-linktype.4 - manual entry for link-layer header types ppp.h - Point to Point Protocol definitions -runlex.sh - wrapper for Lex/Flex savefile.c - offline support scanner.l - filter string scanner sunatmpos.h - definitions for SunATM capturing diff --git a/libpcap/Makefile-devel-adds b/libpcap/Makefile-devel-adds index 7bf6420c1..fea63bbce 100644 --- a/libpcap/Makefile-devel-adds +++ b/libpcap/Makefile-devel-adds @@ -2,12 +2,12 @@ # Auto-regenerate configure script or Makefile when things change. # From autoconf.info . Works best with GNU Make. # -${srcdir}/configure: configure.in aclocal.m4 +${srcdir}/configure: configure.ac aclocal.m4 cd ${srcdir} && autoconf # autoheader might not change config.h.in, so touch a stamp file. ${srcdir}/config.h.in: ${srcdir}/stamp-h.in -${srcdir}/stamp-h.in: configure.in aclocal.m4 +${srcdir}/stamp-h.in: configure.ac aclocal.m4 cd ${srcdir} && autoheader echo timestamp > ${srcdir}/stamp-h.in diff --git a/libpcap/Makefile.in b/libpcap/Makefile.in index 73fe0eea3..e71d973ca 100644 --- a/libpcap/Makefile.in +++ b/libpcap/Makefile.in @@ -49,7 +49,7 @@ LN_S = @LN_S@ MKDEP = @MKDEP@ CCOPT = @V_CCOPT@ INCLS = -I. @V_INCLS@ -DEFS = @DEFS@ @V_DEFS@ +DEFS = -DBUILDING_PCAP @DEFS@ @V_DEFS@ ADDLOBJS = @ADDLOBJS@ ADDLARCHIVEOBJS = @ADDLARCHIVEOBJS@ LIBS = @LIBS@ @@ -69,6 +69,9 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ RANLIB = @RANLIB@ +LEX = @LEX@ +YACC = @YACC@ + # Explicitly define compilation rule since SunOS 4's make doesn't like gcc. # Also, gcc does not remove the .o before forking 'as', which can be a # problem if you don't own the file but can write to the directory. @@ -76,11 +79,11 @@ RANLIB = @RANLIB@ @rm -f $@ $(CC) $(FULL_CFLAGS) -c $(srcdir)/$*.c -PSRC = pcap-@V_PCAP@.c @USB_SRC@ @BT_SRC@ @BT_MONITOR_SRC@ @CAN_SRC@ @NETFILTER_SRC@ @CANUSB_SRC@ @DBUS_SRC@ -FSRC = fad-@V_FINDALLDEVS@.c +PSRC = pcap-@V_PCAP@.c @USB_SRC@ @BT_SRC@ @BT_MONITOR_SRC@ @NETFILTER_SRC@ @DBUS_SRC@ +FSRC = @V_FINDALLDEVS@ SSRC = @SSRC@ -CSRC = pcap.c inet.c gencode.c optimize.c nametoaddr.c etherent.c \ - savefile.c sf-pcap.c sf-pcap-ng.c pcap-common.c \ +CSRC = pcap.c inet.c fad-helpers.c gencode.c optimize.c nametoaddr.c \ + etherent.c savefile.c sf-pcap.c sf-pcap-ng.c pcap-common.c \ bpf_image.c bpf_dump.c GENSRC = scanner.c grammar.c bpf_filter.c version.c LIBOBJS = @LIBOBJS@ @@ -96,6 +99,9 @@ PUBHDR = \ pcap-namedb.h \ pcap/bpf.h \ pcap/bluetooth.h \ + pcap/can_socketcan.h \ + pcap/dlt.h \ + pcap/export-defs.h \ pcap/ipnet.h \ pcap/namedb.h \ pcap/nflog.h \ @@ -108,43 +114,49 @@ HDR = $(PUBHDR) \ arcnet.h \ atmuni31.h \ ethertype.h \ + extract.h \ gencode.h \ ieee80211.h \ llc.h \ + nametoaddr.h \ nlpid.h \ pcap-common.h \ pcap-int.h \ pcap-stdinc.h \ + portability.h \ ppp.h \ sf-pcap.h \ sf-pcap-ng.h \ sunatmpos.h TESTS = \ + @VALGRINDTEST@ \ capturetest \ + can_set_rfmon_test \ filtertest \ findalldevstest \ opentest \ - selpolltest \ - valgrindtest + reactivatetest \ + selpolltest TESTS_SRC = \ + tests/valgrindtest.c \ tests/capturetest.c \ + tests/can_set_rfmon_test.c \ tests/filtertest.c \ tests/findalldevstest.c \ tests/opentest.c \ tests/reactivatetest.c \ - tests/selpolltest.c \ - tests/valgrindtest.c + tests/selpolltest.c GENHDR = \ - scanner.h tokdefs.h version.h + scanner.h grammar.h pcap_version.h TAGFILES = \ $(SRC) $(HDR) CLEANFILES = $(OBJ) libpcap.* $(TESTS) \ - $(PROG)-`cat $(srcdir)/VERSION`.tar.gz \ + $(PROG)-`cat $(srcdir)/VERSION`.tar.gz $(GENSRC) $(GENHDR) \ lex.yy.c pcap-config MAN1 = pcap-config.1 @@ -224,6 +236,8 @@ EXTRA_DIST = \ ChmodBPF/ChmodBPF \ ChmodBPF/StartupParameters.plist \ CREDITS \ + CMakeLists.txt \ + GenVersion.bat \ INSTALL.txt \ LICENSE \ Makefile.in \ @@ -246,29 +260,37 @@ EXTRA_DIST = \ aclocal.m4 \ bpf/net/bpf_filter.c \ chmod_bpf \ + cmakeconfig.h.in \ + cmake/preconfigure.cmake \ + config/have_siocglifconf.c \ config.guess \ config.h.in \ config.sub \ configure \ - configure.in \ + configure.ac \ dlpisubs.c \ dlpisubs.h \ fad-getad.c \ fad-gifc.c \ fad-glifc.c \ - fad-null.c \ - fad-sita.c \ - fad-win32.c \ + fad-helpers.c \ + gen_version_c.sh \ + gen_version_header.sh \ grammar.y \ install-sh \ lbl/os-aix4.h \ + lbl/os-aix7.h \ lbl/os-hpux11.h \ lbl/os-osf4.h \ lbl/os-osf5.h \ lbl/os-solaris2.h \ lbl/os-sunos4.h \ lbl/os-ultrix4.h \ + missing/getopt.c \ + missing/getopt.h \ missing/snprintf.c \ + missing/strtok_r.c \ + missing/win_snprintf.c \ mkdep \ msdos/bin2c.c \ msdos/common.dj \ @@ -289,10 +311,6 @@ EXTRA_DIST = \ pcap-bt-linux.h \ pcap-bt-monitor-linux.c \ pcap-bt-monitor-linux.h \ - pcap-can-linux.c \ - pcap-can-linux.h \ - pcap-canusb-linux.c \ - pcap-canusb-linux.h \ pcap-config.in \ pcap-dag.c \ pcap-dag.h \ @@ -306,11 +324,14 @@ EXTRA_DIST = \ pcap-libdlpi.c \ pcap-linux.c \ pcap-namedb.h \ + pcap-new.c \ pcap-netfilter-linux.c \ pcap-netfilter-linux.h \ pcap-nit.c \ pcap-null.c \ pcap-pf.c \ + pcap-rpcap.c \ + pcap-rpcap.h \ pcap-septel.c \ pcap-septel.h \ pcap-sita.h \ @@ -320,47 +341,25 @@ EXTRA_DIST = \ pcap-snf.h \ pcap-snit.c \ pcap-snoop.c \ + pcap-tc.c \ + pcap-tc.h \ pcap-usb-linux.c \ pcap-usb-linux.h \ pcap-win32.c \ - runlex.sh \ - scanner.c.top \ + remote-ext.h \ + sockutils.c \ + sockutils.h \ scanner.l \ + tests/CMakeLists.txt \ + pcap_version.h.in \ Win32/Include/Gnuc.h \ - Win32/Include/addrinfo.h \ - Win32/Include/bittypes.h \ - Win32/Include/cdecl_ext.h \ - Win32/Include/inetprivate.h \ - Win32/Include/ip6_misc.h \ - Win32/Include/sockstorage.h \ - Win32/Include/arpa/nameser.h \ Win32/Include/net/if.h \ - Win32/Include/net/netdb.h \ - Win32/Include/net/paths.h \ - Win32/Prj/libpcap.dsp \ - Win32/Prj/libpcap.dsw \ - Win32/Src/ffs.c \ - Win32/Src/gai_strerror.c \ - Win32/Src/getaddrinfo.c \ - Win32/Src/getnetbynm.c \ - Win32/Src/getnetent.c \ - Win32/Src/getopt.c \ - Win32/Src/getservent.c \ - Win32/Src/inet_aton.c \ - Win32/Src/inet_net.c \ - Win32/Src/inet_pton.c + Win32/Prj/wpcap.sln \ + Win32/Prj/wpcap.vcxproj \ + Win32/Prj/wpcap.vcxproj.filters all: libpcap.a shared pcap-config -# Inhibit implicit rule Make seems to have for using yacc/lex to -# recompile new scanner.c/grammar.c -- we ship ones which we want to -# use instead. -grammar.c: - echo "Not rebuilding grammar.c" - -scanner.c: - echo "Not rebuilding scanner.c" - libpcap.a: $(OBJ) @rm -f $@ $(AR) rc $@ $(OBJ) $(ADDLARCHIVEOBJS) @@ -444,14 +443,34 @@ libpcap.shareda: $(OBJ) # libpcap.none: -scanner.o: scanner.c tokdefs.h +scanner.c: $(srcdir)/scanner.l + $(LEX) -P pcap_ --header-file=scanner.h --nounput -o scanner.c $< +scanner.h: scanner.c +## Recover from the removal of $@ + @if test -f $@; then :; else \ + rm -f scanner.c; \ + $(MAKE) $(MAKEFLAGS) scanner.c; \ + fi + +scanner.o: scanner.c grammar.h $(CC) $(FULL_CFLAGS) -c scanner.c -pcap.o: version.h +pcap.o: pcap_version.h + +grammar.c: $(srcdir)/grammar.y + $(YACC) -p pcap_ -o grammar.c -d $< +grammar.h: grammar.c +## Recover from the removal of $@ + @if test -f $@; then :; else \ + rm -f grammar.c; \ + $(MAKE) $(MAKEFLAGS) grammar.c; \ + fi grammar.o: grammar.c - @rm -f $@ - $(CC) $(FULL_CFLAGS) -Dyylval=pcap_lval -c grammar.c + $(CC) $(FULL_CFLAGS) -c grammar.c + +gencode.o: $(srcdir)/gencode.c grammar.h scanner.h + $(CC) $(FULL_CFLAGS) -c $(srcdir)/gencode.c version.o: version.c $(CC) $(FULL_CFLAGS) -c version.c @@ -459,32 +478,21 @@ version.o: version.c snprintf.o: $(srcdir)/missing/snprintf.c $(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/snprintf.c -version.c: $(srcdir)/VERSION - @rm -f $@ - if grep GIT ${srcdir}/VERSION >/dev/null; then \ - read ver <${srcdir}/VERSION; \ - echo $$ver | tr -d '\012'; \ - date +_%Y_%m_%d; \ - else \ - cat ${srcdir}/VERSION; \ - fi | sed -e 's/.*/char pcap_version[] = "&";/' > $@ +strtok_r.o: $(srcdir)/missing/strtok_r.c + $(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/strtok_r.c -# -# NOTE: this really is supposed to be static; importing a string -# from a shared library does not work very well on many -# versions of UNIX (Solaris, Linux, and the BSDs, for example), -# so we make the version string static and return it from -# a function, which does work. -# -version.h: $(srcdir)/VERSION +version.c: $(srcdir)/VERSION $(srcdir)/gen_version_c.sh + # + # Older programs import this if they want to show the + # libpcap version number, rather than calling + # pcap_lib_version(), so we need to export it. + # @rm -f $@ - if grep GIT ${srcdir}/VERSION >/dev/null; then \ - read ver <${srcdir}/VERSION; \ - echo $$ver | tr -d '\012'; \ - date +_%Y_%m_%d; \ - else \ - cat ${srcdir}/VERSION; \ - fi | sed -e 's/.*/static const char pcap_version_string[] = "libpcap version &";/' > $@ + $(srcdir)/gen_version_c.sh $(srcdir)/VERSION $@ + +pcap_version.h: $(srcdir)/VERSION $(srcdir)/pcap_version.h.in $(srcdir)/gen_version_header.sh + @rm -f $@ + $(srcdir)/gen_version_header.sh $(srcdir)/VERSION $(srcdir)/pcap_version.h.in $@ bpf_filter.c: $(srcdir)/bpf/net/bpf_filter.c rm -f bpf_filter.c @@ -521,6 +529,9 @@ tests: $(TESTS) capturetest: tests/capturetest.c libpcap.a $(CC) $(FULL_CFLAGS) -I. -L. -o capturetest $(srcdir)/tests/capturetest.c libpcap.a $(LIBS) +can_set_rfmon_test: tests/can_set_rfmon_test.c libpcap.a + $(CC) $(FULL_CFLAGS) -I. -L. -o can_set_rfmon_test $(srcdir)/tests/can_set_rfmon_test.c libpcap.a $(LIBS) + filtertest: tests/filtertest.c libpcap.a $(CC) $(FULL_CFLAGS) -I. -L. -o filtertest $(srcdir)/tests/filtertest.c libpcap.a $(LIBS) @@ -530,6 +541,9 @@ findalldevstest: tests/findalldevstest.c libpcap.a opentest: tests/opentest.c libpcap.a $(CC) $(FULL_CFLAGS) -I. -L. -o opentest $(srcdir)/tests/opentest.c libpcap.a $(LIBS) +reactivatetest: tests/reactivatetest.c libpcap.a + $(CC) $(FULL_CFLAGS) -I. -L. -o reactivatetest $(srcdir)/tests/reactivatetest.c libpcap.a $(LIBS) + selpolltest: tests/selpolltest.c libpcap.a $(CC) $(FULL_CFLAGS) -I. -L. -o selpolltest $(srcdir)/tests/selpolltest.c libpcap.a $(LIBS) @@ -716,10 +730,12 @@ distclean: clean rm -f Makefile config.cache config.log config.status \ config.h gnuc.h net os-proto.h bpf_filter.c pcap-config \ stamp-h stamp-h.in - rm -f version.h version.c rm -f $(MAN3PCAP_EXPAND:.in=) $(MANFILE:.in=) $(MANMISC:.in=) rm -rf autom4te.cache +extags: $(TAGFILES) + ctags $(TAGFILES) + tags: $(TAGFILES) ctags -wtd $(TAGFILES) diff --git a/libpcap/NMAP_MODIFICATIONS/0001-Don-t-autogenerate-Lex-Yacc-files.patch b/libpcap/NMAP_MODIFICATIONS/0001-Don-t-autogenerate-Lex-Yacc-files.patch deleted file mode 100644 index 07eafe321..000000000 --- a/libpcap/NMAP_MODIFICATIONS/0001-Don-t-autogenerate-Lex-Yacc-files.patch +++ /dev/null @@ -1,126 +0,0 @@ -From f38b1fc263d65a53746108e2c9afacf1dc6a058a Mon Sep 17 00:00:00 2001 -From: Daniel Miller -Date: Fri, 1 May 2015 14:44:28 +0000 -Subject: [PATCH 1/2] Don't autogenerate Lex/Yacc files. - ---- - libpcap/Makefile.in | 33 ++++++++++----------------------- - libpcap/configure.in | 20 -------------------- - 2 files changed, 10 insertions(+), 43 deletions(-) - -diff --git a/libpcap/Makefile.in b/libpcap/Makefile.in -index f317973..577b848 100644 ---- a/libpcap/Makefile.in -+++ b/libpcap/Makefile.in -@@ -69,14 +69,6 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ - INSTALL_DATA = @INSTALL_DATA@ - RANLIB = @RANLIB@ - --# --# Flex and bison allow you to specify the prefixes of the global symbols --# used by the generated parser. This allows programs to use lex/yacc --# and link against libpcap. If you don't have flex or bison, get them. --# --LEX = @V_LEX@ --YACC = @V_YACC@ -- - # Explicitly define compilation rule since SunOS 4's make doesn't like gcc. - # Also, gcc does not remove the .o before forking 'as', which can be a - # problem if you don't own the file but can write to the directory. -@@ -152,7 +144,7 @@ TAGFILES = \ - $(SRC) $(HDR) - - CLEANFILES = $(OBJ) libpcap.* $(TESTS) \ -- $(PROG)-`cat $(srcdir)/VERSION`.tar.gz $(GENSRC) $(GENHDR) \ -+ $(PROG)-`cat $(srcdir)/VERSION`.tar.gz \ - lex.yy.c pcap-config - - MAN1 = pcap-config.1 -@@ -360,6 +352,15 @@ EXTRA_DIST = \ - - all: libpcap.a shared pcap-config - -+# Inhibit implicit rule Make seems to have for using yacc/lex to -+# recompile new scanner.c/grammar.c -- we ship ones which we want to -+# use instead. -+grammar.c: -+ echo "Not rebuilding grammar.c" -+ -+scanner.c: -+ echo "Not rebuilding scanner.c" -+ - libpcap.a: $(OBJ) - @rm -f $@ - $(AR) rc $@ $(OBJ) $(ADDLARCHIVEOBJS) -@@ -443,25 +444,11 @@ libpcap.shareda: $(OBJ) - # - libpcap.none: - --scanner.c: $(srcdir)/scanner.l -- @rm -f $@ $@.bottom -- $(srcdir)/runlex.sh $(LEX) -o$@ $< -- mv $@ $@.bottom -- cat $@.top $@.bottom > $@ -- @rm $@.bottom -- - scanner.o: scanner.c tokdefs.h - $(CC) $(FULL_CFLAGS) -c scanner.c - - pcap.o: version.h - --tokdefs.h: grammar.c --grammar.c: $(srcdir)/grammar.y -- @rm -f grammar.c tokdefs.h -- $(YACC) -d $< -- mv y.tab.c grammar.c -- mv y.tab.h tokdefs.h -- - grammar.o: grammar.c - @rm -f $@ - $(CC) $(FULL_CFLAGS) -Dyylval=pcap_lval -c grammar.c -diff --git a/libpcap/configure.in b/libpcap/configure.in -index be4b29e..ec87283 100644 ---- a/libpcap/configure.in -+++ b/libpcap/configure.in -@@ -1051,24 +1051,6 @@ if test "$V_PCAP" = snf -a "$ac_cv_lbl_snf_api" = no; then - AC_MSG_ERROR(Specifying the capture type as 'snf' requires the Myricom Sniffer API to be present; use --with-snf=DIR) - fi - --AC_LBL_LEX_AND_YACC(V_LEX, V_YACC, pcap_) --if test "$V_LEX" = lex ; then --# Some versions of lex can't handle the definitions section of scanner.l . --# Try lexing it and complain if it can't deal. -- AC_CACHE_CHECK([for capable lex], tcpdump_cv_capable_lex, -- if lex -t scanner.l > /dev/null 2>&1; then -- tcpdump_cv_capable_lex=yes -- else -- tcpdump_cv_capable_lex=insufficient -- fi) -- if test $tcpdump_cv_capable_lex = insufficient ; then -- AC_MSG_ERROR([Your operating system's lex is insufficient to compile -- libpcap. flex is a lex replacement that has many advantages, including -- being able to compile libpcap. For more information, see -- http://www.gnu.org/software/flex/flex.html .]) -- fi --fi -- - # - # Assume, by default, no support for shared libraries and V7/BSD convention - # for man pages (file formats in section 5, miscellaneous info in section 7). -@@ -1351,13 +1333,11 @@ AC_SUBST(V_CCOPT) - AC_SUBST(V_DEFS) - AC_SUBST(V_FINDALLDEVS) - AC_SUBST(V_INCLS) --AC_SUBST(V_LEX) - AC_SUBST(V_PCAP) - AC_SUBST(V_SHLIB_CMD) - AC_SUBST(V_SHLIB_OPT) - AC_SUBST(V_SONAME_OPT) - AC_SUBST(V_RPATH_OPT) --AC_SUBST(V_YACC) - AC_SUBST(ADDLOBJS) - AC_SUBST(ADDLARCHIVEOBJS) - AC_SUBST(SSRC) --- -1.9.1 - diff --git a/libpcap/NMAP_MODIFICATIONS/0002-Disable-unnecessary-features.patch b/libpcap/NMAP_MODIFICATIONS/0002-Disable-unnecessary-features.patch deleted file mode 100644 index 7561ec03d..000000000 --- a/libpcap/NMAP_MODIFICATIONS/0002-Disable-unnecessary-features.patch +++ /dev/null @@ -1,96 +0,0 @@ -From 7a42932439162be1f263986cdc7bbef78840a71a Mon Sep 17 00:00:00 2001 -From: Daniel Miller -Date: Fri, 1 May 2015 14:53:42 +0000 -Subject: [PATCH 2/2] Disable unnecessary features - -The following features are disabled: - -* monitor-mode sniffing of wireless interfaces on Linux, via libnl -* building shared libraries -* Bluetooth support -* canusb support -* CAN support -* dbus capture support ---- - libpcap/configure.in | 24 ++++++++++++------------ - 1 file changed, 12 insertions(+), 12 deletions(-) - -diff --git a/libpcap/configure.in b/libpcap/configure.in -index ec87283..ad2e437 100644 ---- a/libpcap/configure.in -+++ b/libpcap/configure.in -@@ -450,10 +450,10 @@ linux) - # Do we have libnl? - # - AC_ARG_WITH(libnl, -- AC_HELP_STRING([--without-libnl],[disable libnl support @<:@default=yes, on Linux, if present@:>@]), -+ AC_HELP_STRING([--without-libnl],[disable libnl support @<:@default=disabled@:>@]), - with_libnl=$withval,,) - -- if test x$with_libnl != xno ; then -+ if test x$with_libnl = xyes ; then - have_any_nl="no" - - incdir=-I/usr/include/libnl3 -@@ -1301,8 +1301,8 @@ solaris*) - esac - - AC_ARG_ENABLE(shared, --AC_HELP_STRING([--enable-shared],[build shared libraries @<:@default=yes, if support available@:>@])) --test "x$enable_shared" = "xno" && DYEXT="none" -+AC_HELP_STRING([--enable-shared],[build shared libraries @<:@default=no@:>@])) -+test "x$enable_shared" != "xyes" && DYEXT="none" - - AC_PROG_RANLIB - AC_CHECK_TOOL([AR], [ar]) -@@ -1457,9 +1457,9 @@ AC_SUBST(PCAP_SUPPORT_NETFILTER) - AC_SUBST(NETFILTER_SRC) - - AC_ARG_ENABLE([bluetooth], --[AC_HELP_STRING([--enable-bluetooth],[enable Bluetooth support @<:@default=yes, if support available@:>@])], -+[AC_HELP_STRING([--enable-bluetooth],[enable Bluetooth support @<:@default=no@:>@])], - [], -- [enable_bluetooth=ifsupportavailable]) -+ [enable_bluetooth=no]) - - if test "x$enable_bluetooth" != "xno" ; then - dnl check for Bluetooth sniffing support -@@ -1536,9 +1536,9 @@ if test "x$enable_bluetooth" != "xno" ; then - fi - - AC_ARG_ENABLE([canusb], --[AC_HELP_STRING([--enable-canusb],[enable canusb support @<:@default=yes, if support available@:>@])], -+[AC_HELP_STRING([--enable-canusb],[enable canusb support @<:@default=no@:>@])], - [], -- [enable_canusb=ifsupportavailable]) -+ [enable_canusb=no]) - - if test "x$enable_canusb" != "xno" ; then - dnl check for canusb support -@@ -1582,9 +1582,9 @@ if test "x$enable_canusb" != "xno" ; then - fi - - AC_ARG_ENABLE([can], --[AC_HELP_STRING([--enable-can],[enable CAN support @<:@default=yes, if support available@:>@])], -+[AC_HELP_STRING([--enable-can],[enable CAN support @<:@default=no@:>@])], - [], -- [enable_can=ifsupportavailable]) -+ [enable_can=no]) - - if test "x$enable_can" != "xno" ; then - dnl check for CAN sniffing support -@@ -1619,9 +1619,9 @@ if test "x$enable_can" != "xno" ; then - fi - - AC_ARG_ENABLE([dbus], --[AC_HELP_STRING([--enable-dbus],[enable D-Bus capture support @<:@default=yes, if support available@:>@])], -+[AC_HELP_STRING([--enable-dbus],[enable D-Bus capture support @<:@default=no@:>@])], - [], -- [enable_dbus=ifavailable]) -+ [enable_dbus=no]) - - if test "x$enable_dbus" != "xno"; then - if test "x$enable_dbus" = "xyes"; then --- -1.9.1 - diff --git a/libpcap/NMAP_MODIFICATIONS/0003-Disable-TPACKET_V3-in-included-libpcap.-Still-broken.patch b/libpcap/NMAP_MODIFICATIONS/0003-Disable-TPACKET_V3-in-included-libpcap.-Still-broken.patch deleted file mode 100644 index c4f7050e3..000000000 --- a/libpcap/NMAP_MODIFICATIONS/0003-Disable-TPACKET_V3-in-included-libpcap.-Still-broken.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 4523e52bb5c54f4d65cd3672e8f875c137b44f77 Mon Sep 17 00:00:00 2001 -From: Daniel Miller -Date: Tue, 15 Sep 2015 13:16:39 +0000 -Subject: [PATCH] Disable TPACKET_V3 in included libpcap. Still broken, see #34 - ---- - libpcap/pcap-linux.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/libpcap/pcap-linux.c b/libpcap/pcap-linux.c -index a226da1..a17c250 100644 ---- a/libpcap/pcap-linux.c -+++ b/libpcap/pcap-linux.c -@@ -188,6 +188,10 @@ - # endif /* PACKET_HOST */ - - -+ /* TPACKET_V3 is broken. Temporarily disabling support here until upstream -+ * libpcap addresses the issue. */ -+#undef TPACKET3_HDRLEN -+ - /* check for memory mapped access avaibility. We assume every needed - * struct is defined if the macro TPACKET_HDRLEN is defined, because it - * uses many ring related structs and macros */ --- -1.9.1 - diff --git a/libpcap/NMAP_MODIFICATIONS/0004-Use-a-mutex-on-Windows-to-avoid-a-hang-when-accessin.patch b/libpcap/NMAP_MODIFICATIONS/0004-Use-a-mutex-on-Windows-to-avoid-a-hang-when-accessin.patch deleted file mode 100644 index b1fa0c363..000000000 --- a/libpcap/NMAP_MODIFICATIONS/0004-Use-a-mutex-on-Windows-to-avoid-a-hang-when-accessin.patch +++ /dev/null @@ -1,278 +0,0 @@ -From b91a93895633da9b8184691effc487d8b0c8e82c Mon Sep 17 00:00:00 2001 -From: Daniel Miller -Date: Sun, 20 Sep 2015 18:45:22 +0000 -Subject: [PATCH] Use a mutex on Windows to avoid a hang when accessing WinPCAP - driver - -Reported by multiple users on Windows 8.1 and Windows Server 2012 R2. -Seems to hang when the WinPCAP driver is accessed via OpenServiceA by -multiple processes at once. Users report that this change, which uses a -mutex to avoid concurrent access, fixes the hang. ---- - libpcap/fad-win32.c | 35 ++++++++++++++++++++++++++++++++++ - libpcap/inet.c | 40 +++++++++++++++++++++++++++++++++++++++ - libpcap/pcap-win32.c | 25 ++++++++++++++++++++++++ - 3 files changed, 100 insertions(+) - -diff --git a/libpcap/fad-win32.c b/libpcap/fad-win32.c -index 0c856b1..f849d40 100644 ---- a/libpcap/fad-win32.c -+++ b/libpcap/fad-win32.c -@@ -49,6 +49,8 @@ pcap_add_if_win32(pcap_if_t **devlist, char *name, const char *desc, - npf_if_addr if_addrs[MAX_NETWORK_ADDRESSES]; - LONG if_addr_size; - int res = 0; -+ HANDLE pcapMutex; -+ DWORD wait; - - if_addr_size = MAX_NETWORK_ADDRESSES; - -@@ -65,6 +67,8 @@ pcap_add_if_win32(pcap_if_t **devlist, char *name, const char *desc, - /* - * Get the list of addresses for the interface. - */ -+ pcapMutex = CreateMutex(NULL, 0, "Global\\DnetPcapHangAvoidanceMutex"); -+ wait = WaitForSingleObject(pcapMutex, INFINITE); - if (!PacketGetNetInfoEx((void *)name, if_addrs, &if_addr_size)) { - /* - * Failure. -@@ -75,8 +79,16 @@ pcap_add_if_win32(pcap_if_t **devlist, char *name, const char *desc, - * - * We return an entry with an empty address list. - */ -+ if (wait == WAIT_ABANDONED || wait == WAIT_OBJECT_0) { -+ ReleaseMutex(pcapMutex); -+ } -+ CloseHandle(pcapMutex); - return (0); - } -+ if (wait == WAIT_ABANDONED || wait == WAIT_OBJECT_0) { -+ ReleaseMutex(pcapMutex); -+ } -+ CloseHandle(pcapMutex); - - /* - * Now add the addresses. -@@ -127,6 +139,11 @@ pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) - char *AdaptersName; - ULONG NameLength; - char *name; -+ HANDLE pcapMutex; -+ DWORD wait; -+ -+ pcapMutex = CreateMutex(NULL, 0, "Global\\DnetPcapHangAvoidanceMutex"); -+ wait = WaitForSingleObject(pcapMutex, INFINITE); - - /* - * Find out how big a buffer we need. -@@ -149,6 +166,10 @@ pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) - if (!PacketGetAdapterNames(NULL, &NameLength)) - { - DWORD last_error = GetLastError(); -+ if (wait == WAIT_ABANDONED || wait == WAIT_OBJECT_0) { -+ ReleaseMutex(pcapMutex); -+ } -+ CloseHandle(pcapMutex); - - if (last_error != ERROR_INSUFFICIENT_BUFFER) - { -@@ -158,6 +179,10 @@ pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) - return (-1); - } - } -+ if (wait == WAIT_ABANDONED || wait == WAIT_OBJECT_0) { -+ ReleaseMutex(pcapMutex); -+ } -+ CloseHandle(pcapMutex); - - if (NameLength > 0) - AdaptersName = (char*) malloc(NameLength); -@@ -172,13 +197,23 @@ pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) - return (-1); - } - -+ pcapMutex = CreateMutex(NULL, 0, "Global\\DnetPcapHangAvoidanceMutex"); -+ wait = WaitForSingleObject(pcapMutex, INFINITE); - if (!PacketGetAdapterNames(AdaptersName, &NameLength)) { - snprintf(errbuf, PCAP_ERRBUF_SIZE, - "PacketGetAdapterNames: %s", - pcap_win32strerror()); - free(AdaptersName); -+ if (wait == WAIT_ABANDONED || wait == WAIT_OBJECT_0) { -+ ReleaseMutex(pcapMutex); -+ } -+ CloseHandle(pcapMutex); - return (-1); - } -+ if (wait == WAIT_ABANDONED || wait == WAIT_OBJECT_0) { -+ ReleaseMutex(pcapMutex); -+ } -+ CloseHandle(pcapMutex); - - /* - * "PacketGetAdapterNames()" returned a list of -diff --git a/libpcap/inet.c b/libpcap/inet.c -index e7d2104..359557f 100644 ---- a/libpcap/inet.c -+++ b/libpcap/inet.c -@@ -983,8 +983,12 @@ pcap_lookupdev(errbuf) - { - DWORD dwVersion; - DWORD dwWindowsMajorVersion; -+ HANDLE pcapMutex; -+ DWORD wait; - dwVersion = GetVersion(); /* get the OS version */ - dwWindowsMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion))); -+ pcapMutex = CreateMutex(NULL, 0, "Global\\DnetPcapHangAvoidanceMutex"); -+ wait = WaitForSingleObject(pcapMutex, INFINITE); - - if (dwVersion >= 0x80000000 && dwWindowsMajorVersion >= 4) { - /* -@@ -994,9 +998,21 @@ pcap_lookupdev(errbuf) - static char AdaptersName[8192]; - - if (PacketGetAdapterNames(AdaptersName,&NameLength) ) -+ { -+ if (wait == WAIT_ABANDONED || wait == WAIT_OBJECT_0) { -+ ReleaseMutex(pcapMutex); -+ } -+ CloseHandle(pcapMutex); - return (AdaptersName); -+ } - else -+ { -+ if (wait == WAIT_ABANDONED || wait == WAIT_OBJECT_0) { -+ ReleaseMutex(pcapMutex); -+ } -+ CloseHandle(pcapMutex); - return NULL; -+ } - } else { - /* - * Windows NT (NT 4.0, W2K, WXP). Convert the names to UNICODE for backward compatibility -@@ -1016,12 +1032,20 @@ pcap_lookupdev(errbuf) - - if ( !PacketGetAdapterNames((PTSTR)TAdaptersName,&NameLength) ) - { -+ if (wait == WAIT_ABANDONED || wait == WAIT_OBJECT_0) { -+ ReleaseMutex(pcapMutex); -+ } -+ CloseHandle(pcapMutex); - (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, - "PacketGetAdapterNames: %s", - pcap_win32strerror()); - free(TAdaptersName); - return NULL; - } -+ if (wait == WAIT_ABANDONED || wait == WAIT_OBJECT_0) { -+ ReleaseMutex(pcapMutex); -+ } -+ CloseHandle(pcapMutex); - - - tAstr = (char*)TAdaptersName; -@@ -1056,6 +1080,10 @@ pcap_lookupdev(errbuf) - free(TAdaptersName); - return (char *)(AdaptersName); - } -+ if (wait == WAIT_ABANDONED || wait == WAIT_OBJECT_0) { -+ ReleaseMutex(pcapMutex); -+ } -+ CloseHandle(pcapMutex); - } - - -@@ -1073,11 +1101,23 @@ pcap_lookupnet(device, netp, maskp, errbuf) - LONG if_addr_size = 1; - struct sockaddr_in *t_addr; - unsigned int i; -+ HANDLE pcapMutex; -+ DWORD wait; - -+ pcapMutex = CreateMutex(NULL, 0, "Global\\DnetPcapHangAvoidanceMutex"); -+ wait = WaitForSingleObject(pcapMutex, INFINITE); - if (!PacketGetNetInfoEx((void *)device, if_addrs, &if_addr_size)) { -+ if (wait == WAIT_ABANDONED || wait == WAIT_OBJECT_0) { -+ ReleaseMutex(pcapMutex); -+ } -+ CloseHandle(pcapMutex); - *netp = *maskp = 0; - return (0); - } -+ if (wait == WAIT_ABANDONED || wait == WAIT_OBJECT_0) { -+ ReleaseMutex(pcapMutex); -+ } -+ CloseHandle(pcapMutex); - - for(i=0; iadapter != NULL) { -+ pcapMutex = CreateMutex(NULL, 0, "Global\\DnetPcapHangAvoidanceMutex"); -+ wait = WaitForSingleObject(pcapMutex, INFINITE); - PacketCloseAdapter(p->adapter); -+ if (wait == WAIT_ABANDONED || wait == WAIT_OBJECT_0) { -+ ReleaseMutex(pcapMutex); -+ } -+ CloseHandle(pcapMutex); - p->adapter = NULL; - } - if (p->Packet) { -@@ -508,6 +516,8 @@ pcap_activate_win32(pcap_t *p) - { - struct pcap_win *pw = p->priv; - NetType type; -+ HANDLE pcapMutex; -+ DWORD wait; - - if (p->opt.rfmon) { - /* -@@ -521,11 +531,18 @@ pcap_activate_win32(pcap_t *p) - /* Init WinSock */ - wsockinit(); - -+ pcapMutex = CreateMutex(NULL, 0, "Global\\DnetPcapHangAvoidanceMutex"); -+ wait = WaitForSingleObject(pcapMutex, INFINITE); -+ - p->adapter = PacketOpenAdapter(p->opt.source); - - if (p->adapter == NULL) - { - /* Adapter detected but we are not able to open it. Return failure. */ -+ if (wait == WAIT_ABANDONED || wait == WAIT_OBJECT_0) { -+ ReleaseMutex(pcapMutex); -+ } -+ CloseHandle(pcapMutex); - snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "Error opening adapter: %s", pcap_win32strerror()); - return PCAP_ERROR; - } -@@ -533,9 +550,17 @@ pcap_activate_win32(pcap_t *p) - /*get network type*/ - if(PacketGetNetType (p->adapter,&type) == FALSE) - { -+ if (wait == WAIT_ABANDONED || wait == WAIT_OBJECT_0) { -+ ReleaseMutex(pcapMutex); -+ } -+ CloseHandle(pcapMutex); - snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "Cannot determine the network type: %s", pcap_win32strerror()); - goto bad; - } -+ if (wait == WAIT_ABANDONED || wait == WAIT_OBJECT_0) { -+ ReleaseMutex(pcapMutex); -+ } -+ CloseHandle(pcapMutex); - - /*Set the linktype*/ - switch (type.LinkType) --- -1.9.1 - diff --git a/libpcap/NMAP_MODIFICATIONS/HOWTO-UPGRADE b/libpcap/NMAP_MODIFICATIONS/HOWTO-UPGRADE index f5eb1aaad..bdd4c16c1 100644 --- a/libpcap/NMAP_MODIFICATIONS/HOWTO-UPGRADE +++ b/libpcap/NMAP_MODIFICATIONS/HOWTO-UPGRADE @@ -10,8 +10,8 @@ rsync -rv --delete ~/libpcap-X.Y/ ~/nmap/libpcap/ git add -A libpcap cd libpcap ./configure -make grammar.c scanner.c scanner.h tokdefs.h -git add grammar.c scanner.c scanner.h tokdefs.h +make grammar.c scanner.c scanner.h +git add grammar.c scanner.c scanner.h cd .. # Apply patches. git apply ~/NMAP_MODIFICATIONS/000* diff --git a/libpcap/README.sita b/libpcap/README.sita index ee7a42684..014d51d98 100644 --- a/libpcap/README.sita +++ b/libpcap/README.sita @@ -12,7 +12,7 @@ These additions/extensions have been made to PCAP to allow it to capture packets from a SITA ACN device (and potentially others). To enable its support you need to ensure that the distribution has -a correct configure.in file; that can be created if neccessay by +a correct configure.ac file; that can be created if neccessay by using the normal autoconf procedure of: aclocal diff --git a/libpcap/VERSION b/libpcap/VERSION index 661e7aead..a8fdfda1c 100644 --- a/libpcap/VERSION +++ b/libpcap/VERSION @@ -1 +1 @@ -1.7.3 +1.8.1 diff --git a/libpcap/Win32/Include/Gnuc.h b/libpcap/Win32/Include/Gnuc.h index aa4959873..e1b5951d1 100644 --- a/libpcap/Win32/Include/Gnuc.h +++ b/libpcap/Win32/Include/Gnuc.h @@ -1,13 +1,3 @@ -/* Define __P() macro, if necessary */ - -#ifndef __P -#if __STDC__ -#define __P(protos) protos -#else -#define __P(protos) () -#endif -#endif - /* inline foo */ #ifndef __cplusplus #ifdef __GNUC__ @@ -16,29 +6,3 @@ #define inline #endif #endif - -/* - * Handle new and old "dead" routine prototypes - * - * For example: - * - * __dead void foo(void) __attribute__((volatile)); - * - */ -#ifdef __GNUC__ -#ifndef __dead -#define __dead volatile -#endif -#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) -#ifndef __attribute__ -#define __attribute__(args) -#endif -#endif -#else -#ifndef __dead -#define __dead -#endif -#ifndef __attribute__ -#define __attribute__(args) -#endif -#endif diff --git a/libpcap/Win32/Include/addrinfo.h b/libpcap/Win32/Include/addrinfo.h deleted file mode 100644 index ac4fcce10..000000000 --- a/libpcap/Win32/Include/addrinfo.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (C) 1995, 1996, 1997, 1998, and 1999 WIDE Project. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the project nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef HAVE_ADDRINFO - -/* - * Error return codes from getaddrinfo() - */ -#define EAI_ADDRFAMILY 1 /* address family for hostname not supported */ -#define EAI_AGAIN 2 /* temporary failure in name resolution */ -#define EAI_BADFLAGS 3 /* invalid value for ai_flags */ -#define EAI_FAIL 4 /* non-recoverable failure in name resolution */ -#define EAI_FAMILY 5 /* ai_family not supported */ -#define EAI_MEMORY 6 /* memory allocation failure */ -#define EAI_NODATA 7 /* no address associated with hostname */ -#define EAI_NONAME 8 /* hostname nor servname provided, or not known */ -#define EAI_SERVICE 9 /* servname not supported for ai_socktype */ -#define EAI_SOCKTYPE 10 /* ai_socktype not supported */ -#define EAI_SYSTEM 11 /* system error returned in errno */ -#define EAI_BADHINTS 12 -#define EAI_PROTOCOL 13 -#define EAI_MAX 14 - -/* internal error */ -#define NETDB_INTERNAL -1 /* see errno */ - -/* - * Flag values for getaddrinfo() - */ -#define AI_PASSIVE 0x00000001 /* get address to use bind() */ -#define AI_CANONNAME 0x00000002 /* fill ai_canonname */ -#define AI_NUMERICHOST 0x00000004 /* prevent name resolution */ -/* valid flags for addrinfo */ -#define AI_MASK (AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST) - -#define AI_ALL 0x00000100 /* IPv6 and IPv4-mapped (with AI_V4MAPPED) */ -#define AI_V4MAPPED_CFG 0x00000200 /* accept IPv4-mapped if kernel supports */ -#define AI_ADDRCONFIG 0x00000400 /* only if any address is assigned */ -#define AI_V4MAPPED 0x00000800 /* accept IPv4-mapped IPv6 address */ -/* special recommended flags for getipnodebyname */ -#define AI_DEFAULT (AI_V4MAPPED_CFG | AI_ADDRCONFIG) - -struct addrinfo { - int ai_flags; /* AI_PASSIVE, AI_CANONNAME */ - int ai_family; /* PF_xxx */ - int ai_socktype; /* SOCK_xxx */ - int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */ - size_t ai_addrlen; /* length of ai_addr */ - char *ai_canonname; /* canonical name for hostname */ - struct sockaddr *ai_addr; /* binary address */ - struct addrinfo *ai_next; /* next structure in linked list */ -}; - -extern void freeaddrinfo (struct addrinfo *); -extern void freehostent (struct hostent *); -extern char *gai_strerror (int); -extern int getaddrinfo (const char *, const char *, - const struct addrinfo *, struct addrinfo **); -extern int getnameinfo (const struct sockaddr *, size_t, char *, - size_t, char *, size_t, int); -extern struct hostent *getipnodebyaddr (const void *, size_t, int, int *); -extern struct hostent *getipnodebyname (const char *, int, int, int *); -extern int inet_pton (int, const char *, void *); -extern const char *inet_ntop (int, const void *, char *, size_t); -#else - -#ifndef EAI_BADHINTS -#define EAI_BADHINTS 12 -#endif - -#ifndef EAI_PROTOCOL -#define EAI_PROTOCOL 13 -#endif - -#ifndef EAI_MAX -#define EAI_MAX 14 -#endif - -#ifndef NETDB_INTERNAL -#define NETDB_INTERNAL -1 /* see errno */ -#endif - -#ifndef AI_MASK -/* valid flags for addrinfo */ -#define AI_MASK (AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST) -#endif - -#endif /* HAVE_ADDRINFO */ - -/* - * Constants for getnameinfo() - */ -#ifndef NI_MAXHOST -#define NI_MAXHOST 1025 -#endif -#ifndef NI_MAXSERV -#define NI_MAXSERV 32 -#endif - -/* - * Flag values for getnameinfo() - */ -#ifndef NI_NOFQDN -#define NI_NOFQDN 0x00000001 -#endif -#ifndef NI_NUMERICHOST -#define NI_NUMERICHOST 0x00000002 -#endif -#ifndef NI_NAMEREQD -#define NI_NAMEREQD 0x00000004 -#endif -#ifndef NI_NUMERICSERV -#define NI_NUMERICSERV 0x00000008 -#endif -#ifndef NI_DGRAM -#define NI_DGRAM 0x00000010 -#endif - diff --git a/libpcap/Win32/Include/arpa/nameser.h b/libpcap/Win32/Include/arpa/nameser.h deleted file mode 100644 index b20dc1e3f..000000000 --- a/libpcap/Win32/Include/arpa/nameser.h +++ /dev/null @@ -1,349 +0,0 @@ -/* - * ++Copyright++ 1983, 1989, 1993 - * - - * Copyright (c) 1983, 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - - * Portions Copyright (c) 1993 by Digital Equipment Corporation. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies, and that - * the name of Digital Equipment Corporation not be used in advertising or - * publicity pertaining to distribution of the document or software without - * specific, written prior permission. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT - * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * - - * --Copyright-- - */ - -/* - * @(#)nameser.h 8.1 (Berkeley) 6/2/93 - * nameser.h,v 1.2 1995/05/06 14:23:54 hjl Exp - */ - -#ifndef _NAMESER_H_ -#define _NAMESER_H_ - -#ifndef WIN32 -#include -#if (!defined(BSD)) || (BSD < 199306) -# include -#else -# include -#endif -#include -#else -#include -#define __LITTLE_ENDIAN 1 -#define __BYTE_ORDER __LITTLE_ENDIAN -#endif - -/* - * revision information. this is the release date in YYYYMMDD format. - * it can change every day so the right thing to do with it is use it - * in preprocessor commands such as "#if (__BIND > 19931104)". do not - * compare for equality; rather, use it to determine whether your resolver - * is new enough to contain a certain feature. - */ - -#define __BIND 19940417 /* interface version stamp */ - -/* - * Define constants based on rfc883 - */ -#define PACKETSZ 512 /* maximum packet size */ -#define MAXDNAME 256 /* maximum domain name */ -#define MAXCDNAME 255 /* maximum compressed domain name */ -#define MAXLABEL 63 /* maximum length of domain label */ -#define HFIXEDSZ 12 /* #/bytes of fixed data in header */ -#define QFIXEDSZ 4 /* #/bytes of fixed data in query */ -#define RRFIXEDSZ 10 /* #/bytes of fixed data in r record */ -#define INT32SZ 4 /* for systems without 32-bit ints */ -#define INT16SZ 2 /* for systems without 16-bit ints */ -#define INADDRSZ 4 /* for sizeof(struct inaddr) != 4 */ - -/* - * Internet nameserver port number - */ -#define NAMESERVER_PORT 53 - -/* - * Currently defined opcodes - */ -#define QUERY 0x0 /* standard query */ -#define IQUERY 0x1 /* inverse query */ -#define STATUS 0x2 /* nameserver status query */ -/*#define xxx 0x3 *//* 0x3 reserved */ -#define NS_NOTIFY_OP 0x4 /* notify secondary of SOA change */ -#ifdef ALLOW_UPDATES - /* non standard - supports ALLOW_UPDATES stuff from Mike Schwartz */ -# define UPDATEA 0x9 /* add resource record */ -# define UPDATED 0xa /* delete a specific resource record */ -# define UPDATEDA 0xb /* delete all named resource record */ -# define UPDATEM 0xc /* modify a specific resource record */ -# define UPDATEMA 0xd /* modify all named resource record */ -# define ZONEINIT 0xe /* initial zone transfer */ -# define ZONEREF 0xf /* incremental zone referesh */ -#endif - -/* - * Currently defined response codes - */ -#ifdef HAVE_ADDRINFO -#define NOERROR 0 /* no error */ -#endif /* HAVE_ADDRINFO */ -#define FORMERR 1 /* format error */ -#define SERVFAIL 2 /* server failure */ -#define NXDOMAIN 3 /* non existent domain */ -#define NOTIMP 4 /* not implemented */ -#define REFUSED 5 /* query refused */ -#ifdef ALLOW_UPDATES - /* non standard */ -# define NOCHANGE 0xf /* update failed to change db */ -#endif - -/* - * Type values for resources and queries - */ -#define T_A 1 /* host address */ -#define T_NS 2 /* authoritative server */ -#define T_MD 3 /* mail destination */ -#define T_MF 4 /* mail forwarder */ -#define T_CNAME 5 /* canonical name */ -#define T_SOA 6 /* start of authority zone */ -#define T_MB 7 /* mailbox domain name */ -#define T_MG 8 /* mail group member */ -#define T_MR 9 /* mail rename name */ -#define T_NULL 10 /* null resource record */ -#define T_WKS 11 /* well known service */ -#define T_PTR 12 /* domain name pointer */ -#define T_HINFO 13 /* host information */ -#define T_MINFO 14 /* mailbox information */ -#define T_MX 15 /* mail routing information */ -#define T_TXT 16 /* text strings */ -#define T_RP 17 /* responsible person */ -#define T_AFSDB 18 /* AFS cell database */ -#define T_X25 19 /* X_25 calling address */ -#define T_ISDN 20 /* ISDN calling address */ -#define T_RT 21 /* router */ -#define T_NSAP 22 /* NSAP address */ -#define T_NSAP_PTR 23 /* reverse NSAP lookup (deprecated) */ -#define T_SIG 24 /* security signature */ -#define T_KEY 25 /* security key */ -#define T_PX 26 /* X.400 mail mapping */ -#define T_GPOS 27 /* geographical position (withdrawn) */ -#define T_AAAA 28 /* IP6 Address */ -#define T_LOC 29 /* Location Information */ - /* non standard */ -#define T_UINFO 100 /* user (finger) information */ -#define T_UID 101 /* user ID */ -#define T_GID 102 /* group ID */ -#define T_UNSPEC 103 /* Unspecified format (binary data) */ - /* Query type values which do not appear in resource records */ -#define T_AXFR 252 /* transfer zone of authority */ -#define T_MAILB 253 /* transfer mailbox records */ -#define T_MAILA 254 /* transfer mail agent records */ -#define T_ANY 255 /* wildcard match */ - -/* - * Values for class field - */ - -#define C_IN 1 /* the arpa internet */ -#define C_CHAOS 3 /* for chaos net (MIT) */ -#define C_HS 4 /* for Hesiod name server (MIT) (XXX) */ - /* Query class values which do not appear in resource records */ -#define C_ANY 255 /* wildcard match */ - -/* - * Status return codes for T_UNSPEC conversion routines - */ -#define CONV_SUCCESS 0 -#define CONV_OVERFLOW (-1) -#define CONV_BADFMT (-2) -#define CONV_BADCKSUM (-3) -#define CONV_BADBUFLEN (-4) - -#ifndef __BYTE_ORDER -#if (BSD >= 199103) -# include -#else -#ifdef linux -# include -#else -#define __LITTLE_ENDIAN 1234 /* least-significant byte first (vax, pc) */ -#define __BIG_ENDIAN 4321 /* most-significant byte first (IBM, net) */ -#define __PDP_ENDIAN 3412 /* LSB first in word, MSW first in long (pdp)*/ - -#if defined(vax) || defined(ns32000) || defined(sun386) || defined(i386) || \ - defined(MIPSEL) || defined(_MIPSEL) || defined(BIT_ZERO_ON_RIGHT) || \ - defined(__alpha__) || defined(__alpha) -#define __BYTE_ORDER __LITTLE_ENDIAN -#endif - -#if defined(sel) || defined(pyr) || defined(mc68000) || defined(sparc) || \ - defined(is68k) || defined(tahoe) || defined(ibm032) || defined(ibm370) || \ - defined(MIPSEB) || defined(_MIPSEB) || defined(_IBMR2) || defined(DGUX) ||\ - defined(apollo) || defined(__convex__) || defined(_CRAY) || \ - defined(__hppa) || defined(__hp9000) || \ - defined(__hp9000s300) || defined(__hp9000s700) || \ - defined (BIT_ZERO_ON_LEFT) || defined(m68k) -#define __BYTE_ORDER __BIG_ENDIAN -#endif -#endif /* linux */ -#endif /* BSD */ -#endif /* __BYTE_ORDER */ - -#if !defined(__BYTE_ORDER) || \ - (__BYTE_ORDER != __BIG_ENDIAN && __BYTE_ORDER != __LITTLE_ENDIAN && \ - __BYTE_ORDER != __PDP_ENDIAN) - /* you must determine what the correct bit order is for - * your compiler - the next line is an intentional error - * which will force your compiles to bomb until you fix - * the above macros. - */ - error "Undefined or invalid __BYTE_ORDER"; -#endif - -/* - * Structure for query header. The order of the fields is machine- and - * compiler-dependent, depending on the byte/bit order and the layout - * of bit fields. We use bit fields only in int variables, as this - * is all ANSI requires. This requires a somewhat confusing rearrangement. - */ - -typedef struct { - unsigned id :16; /* query identification number */ -#if __BYTE_ORDER == __BIG_ENDIAN - /* fields in third byte */ - unsigned qr: 1; /* response flag */ - unsigned opcode: 4; /* purpose of message */ - unsigned aa: 1; /* authoritive answer */ - unsigned tc: 1; /* truncated message */ - unsigned rd: 1; /* recursion desired */ - /* fields in fourth byte */ - unsigned ra: 1; /* recursion available */ - unsigned pr: 1; /* primary server req'd (!standard) */ - unsigned unused :2; /* unused bits (MBZ as of 4.9.3a3) */ - unsigned rcode :4; /* response code */ -#endif -#if __BYTE_ORDER == __LITTLE_ENDIAN || __BYTE_ORDER == __PDP_ENDIAN - /* fields in third byte */ - unsigned rd :1; /* recursion desired */ - unsigned tc :1; /* truncated message */ - unsigned aa :1; /* authoritive answer */ - unsigned opcode :4; /* purpose of message */ - unsigned qr :1; /* response flag */ - /* fields in fourth byte */ - unsigned rcode :4; /* response code */ - unsigned unused :2; /* unused bits (MBZ as of 4.9.3a3) */ - unsigned pr :1; /* primary server req'd (!standard) */ - unsigned ra :1; /* recursion available */ -#endif - /* remaining bytes */ - unsigned qdcount :16; /* number of question entries */ - unsigned ancount :16; /* number of answer entries */ - unsigned nscount :16; /* number of authority entries */ - unsigned arcount :16; /* number of resource entries */ -} HEADER; - -/* - * Defines for handling compressed domain names - */ -#define INDIR_MASK 0xc0 - -/* - * Structure for passing resource records around. - */ -struct rrec { - int16_t r_zone; /* zone number */ - int16_t r_class; /* class number */ - int16_t r_type; /* type number */ - u_int32_t r_ttl; /* time to live */ - int r_size; /* size of data area */ - char *r_data; /* pointer to data */ -}; - -//extern u_int16_t _getshort __P((const u_char *)); -//extern u_int32_t _getlong __P((const u_char *)); - -/* - * Inline versions of get/put short/long. Pointer is advanced. - * - * These macros demonstrate the property of C whereby it can be - * portable or it can be elegant but rarely both. - */ -#define GETSHORT(s, cp) { \ - register u_char *t_cp = (u_char *)(cp); \ - (s) = ((u_int16_t)t_cp[0] << 8) \ - | ((u_int16_t)t_cp[1]) \ - ; \ - (cp) += INT16SZ; \ -} - -#define GETLONG(l, cp) { \ - register u_char *t_cp = (u_char *)(cp); \ - (l) = ((u_int32_t)t_cp[0] << 24) \ - | ((u_int32_t)t_cp[1] << 16) \ - | ((u_int32_t)t_cp[2] << 8) \ - | ((u_int32_t)t_cp[3]) \ - ; \ - (cp) += INT32SZ; \ -} - -#define PUTSHORT(s, cp) { \ - register u_int16_t t_s = (u_int16_t)(s); \ - register u_char *t_cp = (u_char *)(cp); \ - *t_cp++ = t_s >> 8; \ - *t_cp = t_s; \ - (cp) += INT16SZ; \ -} - -#define PUTLONG(l, cp) { \ - register u_int32_t t_l = (u_int32_t)(l); \ - register u_char *t_cp = (u_char *)(cp); \ - *t_cp++ = t_l >> 24; \ - *t_cp++ = t_l >> 16; \ - *t_cp++ = t_l >> 8; \ - *t_cp = t_l; \ - (cp) += INT32SZ; \ -} - -#endif /* !_NAMESER_H_ */ diff --git a/libpcap/Win32/Include/bittypes.h b/libpcap/Win32/Include/bittypes.h deleted file mode 100644 index 95aa9faa6..000000000 --- a/libpcap/Win32/Include/bittypes.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (C) 1999 WIDE Project. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the project nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ -#ifndef _BITTYPES_H -#define _BITTYPES_H - -#ifndef HAVE_U_INT8_T -typedef unsigned char u_int8_t; -typedef signed char int8_t; -#endif /* HAVE_U_INT8_T */ - -#ifndef HAVE_U_INT16_T -typedef unsigned short u_int16_t; -typedef signed short int16_t; -#endif /* HAVE_U_INT16_T */ - -#ifndef HAVE_U_INT32_T -typedef unsigned int u_int32_t; -typedef signed int int32_t; -#endif /* HAVE_U_INT32_T */ - -#ifndef HAVE_U_INT64_T -#ifdef _MSC_EXTENSIONS -typedef unsigned _int64 u_int64_t; -typedef _int64 int64_t; -#else /* _MSC_EXTENSIONS */ -typedef unsigned long long u_int64_t; -typedef long long int64_t; -#endif /* _MSC_EXTENSIONS */ -#endif /* HAVE_U_INT64_T */ - -#ifndef PRId64 -#ifdef _MSC_EXTENSIONS -#define PRId64 "I64d" -#else /* _MSC_EXTENSIONS */ -#define PRId64 "lld" -#endif /* _MSC_EXTENSIONS */ -#endif /* PRId64 */ - -#ifndef PRIo64 -#ifdef _MSC_EXTENSIONS -#define PRIo64 "I64o" -#else /* _MSC_EXTENSIONS */ -#define PRIo64 "llo" -#endif /* _MSC_EXTENSIONS */ -#endif /* PRIo64 */ - -#ifndef PRIx64 -#ifdef _MSC_EXTENSIONS -#define PRIx64 "I64x" -#else /* _MSC_EXTENSIONS */ -#define PRIx64 "llx" -#endif /* _MSC_EXTENSIONS */ -#endif /* PRIx64 */ - -#ifndef PRIu64 -#ifdef _MSC_EXTENSIONS -#define PRIu64 "I64u" -#else /* _MSC_EXTENSIONS */ -#define PRIu64 "llu" -#endif /* _MSC_EXTENSIONS */ -#endif /* PRIu64 */ - -#endif /* _BITTYPES_H */ diff --git a/libpcap/Win32/Include/cdecl_ext.h b/libpcap/Win32/Include/cdecl_ext.h deleted file mode 100644 index 9d40b84cb..000000000 --- a/libpcap/Win32/Include/cdecl_ext.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 1999 WIDE Project. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the project nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ -#ifndef HAVE_PORTABLE_PROTOTYPE - -#if defined(__STDC__) || defined(__cplusplus) -#define __P(protos) protos /* full-blown ANSI C */ -#else -#define __P(protos) () /* traditional C preprocessor */ -#endif - -#endif /* !HAVE_PORTABLE_PROTOTYPE */ diff --git a/libpcap/Win32/Include/inetprivate.h b/libpcap/Win32/Include/inetprivate.h deleted file mode 100644 index e25ed3d6c..000000000 --- a/libpcap/Win32/Include/inetprivate.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 1999 - 2003 - * NetGroup, Politecnico di Torino (Italy) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Politecnico di Torino nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -extern void _sethtent(int f); -extern void _endhtent(void); -extern struct hostent *_gethtent(void); -extern struct hostent *_gethtbyname(const char *name); -extern struct hostent *_gethtbyaddr(const char *addr, int len, - int type); -extern int _validuser(FILE *hostf, const char *rhost, - const char *luser, const char *ruser, int baselen); -extern int _checkhost(const char *rhost, const char *lhost, int len); -#if 0 -extern void putlong(u_long l, u_char *msgp); -extern void putshort(u_short l, u_char *msgp); -extern u_int32_t _getlong(register const u_char *msgp); -extern u_int16_t _getshort(register const u_char *msgp); -extern void p_query(char *msg); -extern void fp_query(char *msg, FILE *file); -extern char *p_cdname(char *cp, char *msg, FILE *file); -extern char *p_rr(char *cp, char *msg, FILE *file); -extern char *p_type(int type); -extern char * p_class(int class); -extern char *p_time(u_long value); -#endif -extern char * hostalias(const char *name); -extern void sethostfile(char *name); -extern void _res_close (void); -extern void ruserpass(const char *host, char **aname, char **apass); diff --git a/libpcap/Win32/Include/ip6_misc.h b/libpcap/Win32/Include/ip6_misc.h deleted file mode 100644 index 0b578c33c..000000000 --- a/libpcap/Win32/Include/ip6_misc.h +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (c) 1993, 1994, 1997 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that: (1) source code distributions - * retain the above copyright notice and this paragraph in its entirety, (2) - * distributions including binary code include the above copyright notice and - * this paragraph in its entirety in the documentation or other materials - * provided with the distribution, and (3) all advertising materials mentioning - * features or use of this software display the following acknowledgement: - * ``This product includes software developed by the University of California, - * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of - * the University nor the names of its contributors may be used to endorse - * or promote products derived from this software without specific prior - * written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -/* - * This file contains a collage of declarations for IPv6 from FreeBSD not present in Windows - */ - -#include - -#include - -#ifndef __MINGW32__ -#define IN_MULTICAST(a) IN_CLASSD(a) -#endif - -#define IN_EXPERIMENTAL(a) ((((u_int32_t) (a)) & 0xf0000000) == 0xf0000000) - -#define IN_LOOPBACKNET 127 - -#if defined(__MINGW32__) && defined(DEFINE_ADDITIONAL_IPV6_STUFF) -/* IPv6 address */ -struct in6_addr - { - union - { - u_int8_t u6_addr8[16]; - u_int16_t u6_addr16[8]; - u_int32_t u6_addr32[4]; - } in6_u; -#define s6_addr in6_u.u6_addr8 -#define s6_addr16 in6_u.u6_addr16 -#define s6_addr32 in6_u.u6_addr32 -#define s6_addr64 in6_u.u6_addr64 - }; - -#define IN6ADDR_ANY_INIT { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } -#define IN6ADDR_LOOPBACK_INIT { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } -#endif /* __MINGW32__ */ - - -#if (defined _MSC_VER) || (defined(__MINGW32__) && defined(DEFINE_ADDITIONAL_IPV6_STUFF)) -typedef unsigned short sa_family_t; -#endif - - -#if defined(__MINGW32__) && defined(DEFINE_ADDITIONAL_IPV6_STUFF) - -#define __SOCKADDR_COMMON(sa_prefix) \ - sa_family_t sa_prefix##family - -/* Ditto, for IPv6. */ -struct sockaddr_in6 - { - __SOCKADDR_COMMON (sin6_); - u_int16_t sin6_port; /* Transport layer port # */ - u_int32_t sin6_flowinfo; /* IPv6 flow information */ - struct in6_addr sin6_addr; /* IPv6 address */ - }; - -#define IN6_IS_ADDR_V4MAPPED(a) \ - ((((u_int32_t *) (a))[0] == 0) && (((u_int32_t *) (a))[1] == 0) && \ - (((u_int32_t *) (a))[2] == htonl (0xffff))) - -#define IN6_IS_ADDR_MULTICAST(a) (((u_int8_t *) (a))[0] == 0xff) - -#define IN6_IS_ADDR_LINKLOCAL(a) \ - ((((u_int32_t *) (a))[0] & htonl (0xffc00000)) == htonl (0xfe800000)) - -#define IN6_IS_ADDR_LOOPBACK(a) \ - (((u_int32_t *) (a))[0] == 0 && ((u_int32_t *) (a))[1] == 0 && \ - ((u_int32_t *) (a))[2] == 0 && ((u_int32_t *) (a))[3] == htonl (1)) -#endif /* __MINGW32__ */ - -#define ip6_vfc ip6_ctlun.ip6_un2_vfc -#define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow -#define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen -#define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt -#define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim -#define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim - -#define nd_rd_type nd_rd_hdr.icmp6_type -#define nd_rd_code nd_rd_hdr.icmp6_code -#define nd_rd_cksum nd_rd_hdr.icmp6_cksum -#define nd_rd_reserved nd_rd_hdr.icmp6_data32[0] - -/* - * IPV6 extension headers - */ -#define IPPROTO_HOPOPTS 0 /* IPv6 hop-by-hop options */ -#define IPPROTO_IPV6 41 /* IPv6 header. */ -#define IPPROTO_ROUTING 43 /* IPv6 routing header */ -#define IPPROTO_FRAGMENT 44 /* IPv6 fragmentation header */ -#define IPPROTO_ESP 50 /* encapsulating security payload */ -#define IPPROTO_AH 51 /* authentication header */ -#define IPPROTO_ICMPV6 58 /* ICMPv6 */ -#define IPPROTO_NONE 59 /* IPv6 no next header */ -#define IPPROTO_DSTOPTS 60 /* IPv6 destination options */ -#define IPPROTO_PIM 103 /* Protocol Independent Multicast. */ - -#define IPV6_RTHDR_TYPE_0 0 - -/* Option types and related macros */ -#define IP6OPT_PAD1 0x00 /* 00 0 00000 */ -#define IP6OPT_PADN 0x01 /* 00 0 00001 */ -#define IP6OPT_JUMBO 0xC2 /* 11 0 00010 = 194 */ -#define IP6OPT_JUMBO_LEN 6 -#define IP6OPT_ROUTER_ALERT 0x05 /* 00 0 00101 */ - -#define IP6OPT_RTALERT_LEN 4 -#define IP6OPT_RTALERT_MLD 0 /* Datagram contains an MLD message */ -#define IP6OPT_RTALERT_RSVP 1 /* Datagram contains an RSVP message */ -#define IP6OPT_RTALERT_ACTNET 2 /* contains an Active Networks msg */ -#define IP6OPT_MINLEN 2 - -#define IP6OPT_BINDING_UPDATE 0xc6 /* 11 0 00110 */ -#define IP6OPT_BINDING_ACK 0x07 /* 00 0 00111 */ -#define IP6OPT_BINDING_REQ 0x08 /* 00 0 01000 */ -#define IP6OPT_HOME_ADDRESS 0xc9 /* 11 0 01001 */ -#define IP6OPT_EID 0x8a /* 10 0 01010 */ - -#define IP6OPT_TYPE(o) ((o) & 0xC0) -#define IP6OPT_TYPE_SKIP 0x00 -#define IP6OPT_TYPE_DISCARD 0x40 -#define IP6OPT_TYPE_FORCEICMP 0x80 -#define IP6OPT_TYPE_ICMP 0xC0 - -#define IP6OPT_MUTABLE 0x20 - - -#if defined(__MINGW32__) && defined(DEFINE_ADDITIONAL_IPV6_STUFF) -#ifndef EAI_ADDRFAMILY -struct addrinfo { - int ai_flags; /* AI_PASSIVE, AI_CANONNAME */ - int ai_family; /* PF_xxx */ - int ai_socktype; /* SOCK_xxx */ - int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */ - size_t ai_addrlen; /* length of ai_addr */ - char *ai_canonname; /* canonical name for hostname */ - struct sockaddr *ai_addr; /* binary address */ - struct addrinfo *ai_next; /* next structure in linked list */ -}; -#endif -#endif /* __MINGW32__ */ diff --git a/libpcap/Win32/Include/net/netdb.h b/libpcap/Win32/Include/net/netdb.h deleted file mode 100644 index f7685d250..000000000 --- a/libpcap/Win32/Include/net/netdb.h +++ /dev/null @@ -1,166 +0,0 @@ -/*- - * Copyright (c) 1980, 1983, 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)netdb.h 8.1 (Berkeley) 6/2/93 - * netdb.h,v 1.4 1995/08/14 04:05:04 hjl Exp - * - - * Portions Copyright (c) 1993 by Digital Equipment Corporation. - * - * Permission to use, copy, modify and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies, and that - * the name of Digital Equipment Corporation not be used in advertising or - * publicity pertaining to distribution of the document or software without - * specific, written prior permission. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT - * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * - - * --Copyright-- - */ - -#ifndef _NETDB_H_ -#define _NETDB_H_ - -/* MingW64 defines _POSIX_THREAD_SAFE_FUNCTIONS. - */ -#if defined(_POSIX_THREAD_SAFE_FUNCTIONS) || defined(_REENTRANT) && !defined(__MINGW64_VERSION_MAJOR) -#include -#include -#endif - -#include -#include - -#define _PATH_HEQUIV __PATH_ETC_INET"/hosts.equiv" -#define _PATH_HOSTS __PATH_ETC_INET"/hosts" -#define _PATH_NETWORKS __PATH_ETC_INET"/networks" -#define _PATH_PROTOCOLS __PATH_ETC_INET"/protocols" -#define _PATH_SERVICES __PATH_ETC_INET"/services" -#define _PATH_RESCONF __PATH_ETC_INET"/resolv.conf" -#define _PATH_RPC __PATH_ETC_INET"/rpc" - -struct rpcent { - char *r_name; /* name of server for this rpc program */ - char **r_aliases; /* alias list */ - int r_number; /* rpc program number */ -}; - -#ifndef WIN32 -#if defined(_POSIX_THREAD_SAFE_FUNCTIONS) || defined(_REENTRANT) - -#define __NETDB_MAXALIASES 35 -#define __NETDB_MAXADDRS 35 - -/* - * Error return codes from gethostbyname() and gethostbyaddr() - * (left in extern int h_errno). - */ -#define h_errno (*__h_errno_location ()) -#else -extern int h_errno; -#endif -#endif - -#define NETDB_INTERNAL -1 /* see errno */ -#define NETDB_SUCCESS 0 /* no problem */ - -//#include - -void endhostent (void); -void endnetent (void); -void endprotoent (void); -void endservent (void); -void endrpcent (void); -struct hostent *gethostent (void); -struct netent *getnetbyaddr (long, int); /* u_long? */ -struct netent *getnetbyname (const char *); -struct netent *getnetent (void); -struct protoent *getprotoent (void); -struct servent *getservent (void); -struct rpcent *getrpcent (void); -struct rpcent *getrpcbyname (const char *); -struct rpcent *getrpcbynumber (int); -void herror (const char *); -void sethostent (int); -/* void sethostfile (const char *); */ -void setnetent (int); -void setprotoent (int); -void setservent (int); -void setrpcent (int); - -#if defined(_POSIX_THREAD_SAFE_FUNCTIONS) || defined(_REENTRANT) -struct hostent *gethostbyaddr_r (const char *__addr, - int __length, int __type, - struct hostent *__result, - char *__buffer, int __buflen, int *__h_errnop); -struct hostent *gethostbyname_r (const char * __name, - struct hostent *__result, char *__buffer, - int __buflen, int *__h_errnop); -struct hostent *gethostent_r (struct hostent *__result, - char *__buffer, int __buflen, int *__h_errnop); -struct netent *getnetbyaddr_r (long __net, int __type, - struct netent *__result, char *__buffer, - int __buflen); -struct netent *getnetbyname_r (const char * __name, - struct netent *__result, char *__buffer, - int __buflen); -struct netent *getnetent_r (struct netent *__result, - char *__buffer, int __buflen); -struct protoent *getprotobyname_r (const char * __name, - struct protoent *__result, char *__buffer, - int __buflen); -struct protoent *getprotobynumber_r (int __proto, - struct protoent *__result, char *__buffer, - int __buflen); -struct protoent *getprotoent_r (struct protoent *__result, - char *__buffer, int __buflen); -struct servent *getservbyname_r (const char * __name, - const char *__proto, struct servent *__result, - char *__buffer, int __buflen); -struct servent *getservbyport_r (int __port, - const char *__proto, struct servent *__result, - char *__buffer, int __buflen); -struct servent *getservent_r (struct servent *__result, - char *__buffer, int __buflen); - -int *__h_errno_location (void); - -#endif - -#endif /* !_NETDB_H_ */ diff --git a/libpcap/Win32/Include/net/paths.h b/libpcap/Win32/Include/net/paths.h deleted file mode 100644 index 987de4f0d..000000000 --- a/libpcap/Win32/Include/net/paths.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (c) 1989 The Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)paths.h 5.15 (Berkeley) 5/29/91 - */ - -#ifndef _PATHS_H_ -#define _PATHS_H_ - -#if 0 -#define __PATH_ETC_INET "/usr/etc/inet" -#else -#define __PATH_ETC_INET "/etc" -#endif - -/* Default search path. */ -#define _PATH_DEFPATH "/usr/local/bin:/usr/bin:/bin:." -#define _PATH_DEFPATH_ROOT "/sbin:/bin:/usr/sbin:/usr/bin" - -#define _PATH_BSHELL "/bin/sh" -#define _PATH_CONSOLE "/dev/console" -#define _PATH_CSHELL "/bin/csh" -#define _PATH_DEVDB "/var/run/dev.db" -#define _PATH_DEVNULL "/dev/null" -#define _PATH_DRUM "/dev/drum" -#define _PATH_HEQUIV __PATH_ETC_INET"/hosts.equiv" -#define _PATH_KMEM "/dev/kmem" -#define _PATH_MAILDIR "/var/spool/mail" -#define _PATH_MAN "/usr/man" -#define _PATH_MEM "/dev/mem" -#define _PATH_LOGIN "/bin/login" -#define _PATH_NOLOGIN "/etc/nologin" -#define _PATH_SENDMAIL "/usr/sbin/sendmail" -#define _PATH_SHELLS "/etc/shells" -#define _PATH_TTY "/dev/tty" -#define _PATH_UNIX "/vmlinux" -#define _PATH_VI "/usr/bin/vi" - -/* Provide trailing slash, since mostly used for building pathnames. */ -#define _PATH_DEV "/dev/" -#define _PATH_TMP "/tmp/" -#define _PATH_VARRUN "/var/run/" -#define _PATH_VARTMP "/var/tmp/" - -#define _PATH_KLOG "/proc/kmsg" -#define _PATH_LOGCONF __PATH_ETC_INET"/syslog.conf" -#if 0 -#define _PATH_LOGPID __PATH_ETC_INET"/syslog.pid" -#else -#define _PATH_LOGPID "/var/run/syslog.pid" -#endif -#define _PATH_LOG "/dev/log" -#define _PATH_CONSOLE "/dev/console" - -#if 0 -#define _PATH_UTMP "/var/adm/utmp" -#define _PATH_WTMP "/var/adm/wtmp" -#define _PATH_LASTLOG "/var/adm/lastlog" -#else -#define _PATH_UTMP "/var/run/utmp" -#define _PATH_WTMP "/var/log/wtmp" -#define _PATH_LASTLOG "/var/log/lastlog" -#endif - -#define _PATH_LOCALE "/usr/lib/locale" - -#define _PATH_RWHODIR "/var/spool/rwho" - -#if _MIT_POSIX_THREADS -/* For the MIT pthreads */ -#define _PATH_PTY "/dev/" -#define _PATH_TZDIR "/usr/lib/zoneinfo" -#define _PATH_TZFILE "/usr/lib/zoneinfo/localtime" -#endif - -#endif /* !_PATHS_H_ */ diff --git a/libpcap/Win32/Include/sockstorage.h b/libpcap/Win32/Include/sockstorage.h deleted file mode 100644 index cbad19004..000000000 --- a/libpcap/Win32/Include/sockstorage.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 1999 WIDE Project. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the project nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ -struct sockaddr_storage { -#ifdef HAVE_SOCKADDR_SA_LEN - u_int8_t __ss_len; - u_int8_t __ss_family; - u_int8_t fill[126]; -#else - u_int8_t __ss_family; - u_int8_t fill[127]; -#endif /* HAVE_SOCKADDR_SA_LEN */ -}; diff --git a/libpcap/Win32/Prj/libpcap.dsp b/libpcap/Win32/Prj/libpcap.dsp deleted file mode 100644 index 7082122cc..000000000 --- a/libpcap/Win32/Prj/libpcap.dsp +++ /dev/null @@ -1,168 +0,0 @@ -# Microsoft Developer Studio Project File - Name="libpcap" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -CFG=libpcap - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "libpcap.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "libpcap.mak" CFG="libpcap - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "libpcap - Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "libpcap - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "libpcap - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /I "../../" /I "../../lbl/" /I "../../bpf/" /I "../include/" /I "../../../../common" /I "../../../../dag/include" /I "../../../../dag/drv/windows" /D "NDEBUG" /D "YY_NEVER_INTERACTIVE" /D yylval=pcap_lval /D "_USRDLL" /D "LIBPCAP_EXPORTS" /D "HAVE_STRERROR" /D "__STDC__" /D "INET6" /D "_WINDOWS" /D "_MBCS" /D "HAVE_ADDRINFO" /D "WIN32" /D _U_= /D "HAVE_SNPRINTF" /D "HAVE_VSNPRINTF" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo - -!ELSEIF "$(CFG)" == "libpcap - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../" /I "../../lbl/" /I "../../bpf/" /I "../include/" /I "../../../../common" /I "../../../../dag/include" /I "../../../../dag/drv/windows" /D "_DEBUG" /D "YY_NEVER_INTERACTIVE" /D yylval=pcap_lval /D "_USRDLL" /D "LIBPCAP_EXPORTS" /D "HAVE_STRERROR" /D "__STDC__" /D "INET6" /D "_WINDOWS" /D "_MBCS" /D "HAVE_ADDRINFO" /D "WIN32" /D _U_= /D "HAVE_SNPRINTF" /D "HAVE_VSNPRINTF" /YX /FD /GZ /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo - -!ENDIF - -# Begin Target - -# Name "libpcap - Win32 Release" -# Name "libpcap - Win32 Debug" -# Begin Source File - -SOURCE=..\..\bpf_dump.c -# End Source File -# Begin Source File - -SOURCE=..\..\bpf\net\bpf_filter.c -# End Source File -# Begin Source File - -SOURCE=..\..\bpf_image.c -# End Source File -# Begin Source File - -SOURCE=..\..\etherent.c -# End Source File -# Begin Source File - -SOURCE="..\..\fad-win32.c" -# End Source File -# Begin Source File - -SOURCE=..\Src\ffs.c -# End Source File -# Begin Source File - -SOURCE=..\..\gencode.c -# End Source File -# Begin Source File - -SOURCE=..\Src\getnetbynm.c -# End Source File -# Begin Source File - -SOURCE=..\Src\getnetent.c -# End Source File -# Begin Source File - -SOURCE=..\Src\getservent.c -# End Source File -# Begin Source File - -SOURCE=..\..\grammar.c -# End Source File -# Begin Source File - -SOURCE=..\..\inet.c -# End Source File -# Begin Source File - -SOURCE=..\Src\inet_aton.c -# End Source File -# Begin Source File - -SOURCE=..\Src\inet_net.c -# End Source File -# Begin Source File - -SOURCE=..\Src\inet_pton.c -# End Source File -# Begin Source File - -SOURCE=..\..\nametoaddr.c -# End Source File -# Begin Source File - -SOURCE=..\..\optimize.c -# End Source File -# Begin Source File - -SOURCE="..\..\Pcap-win32.c" -# End Source File -# Begin Source File - -SOURCE=..\..\pcap.c -# End Source File -# Begin Source File - -SOURCE=..\..\savefile.c -# End Source File -# Begin Source File - -SOURCE=..\..\scanner.c -# End Source File -# End Target -# End Project diff --git a/libpcap/Win32/Prj/libpcap.dsw b/libpcap/Win32/Prj/libpcap.dsw deleted file mode 100644 index 8cdff2d02..000000000 --- a/libpcap/Win32/Prj/libpcap.dsw +++ /dev/null @@ -1,29 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "libpcap"=".\libpcap.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/libpcap/Win32/Prj/wpcap.sln b/libpcap/Win32/Prj/wpcap.sln new file mode 100644 index 000000000..5a9fce98e --- /dev/null +++ b/libpcap/Win32/Prj/wpcap.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wpcap", "wpcap.vcxproj", "{8E92D840-6A36-452A-A13C-6E1BA5A2C5A9}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8E92D840-6A36-452A-A13C-6E1BA5A2C5A9}.Debug|Win32.ActiveCfg = Debug|Win32 + {8E92D840-6A36-452A-A13C-6E1BA5A2C5A9}.Debug|Win32.Build.0 = Debug|Win32 + {8E92D840-6A36-452A-A13C-6E1BA5A2C5A9}.Debug|x64.ActiveCfg = Debug|x64 + {8E92D840-6A36-452A-A13C-6E1BA5A2C5A9}.Debug|x64.Build.0 = Debug|x64 + {8E92D840-6A36-452A-A13C-6E1BA5A2C5A9}.Release|Win32.ActiveCfg = Release|Win32 + {8E92D840-6A36-452A-A13C-6E1BA5A2C5A9}.Release|Win32.Build.0 = Release|Win32 + {8E92D840-6A36-452A-A13C-6E1BA5A2C5A9}.Release|x64.ActiveCfg = Release|x64 + {8E92D840-6A36-452A-A13C-6E1BA5A2C5A9}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/libpcap/Win32/Prj/wpcap.vcxproj b/libpcap/Win32/Prj/wpcap.vcxproj new file mode 100644 index 000000000..c923357aa --- /dev/null +++ b/libpcap/Win32/Prj/wpcap.vcxproj @@ -0,0 +1,234 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + {8E92D840-6A36-452A-A13C-6E1BA5A2C5A9} + + + + DynamicLibrary + v120 + false + MultiByte + + + DynamicLibrary + v120 + false + MultiByte + + + DynamicLibrary + v120 + false + MultiByte + true + + + DynamicLibrary + v120 + false + MultiByte + true + + + + + + + + + + + + + + + + + + + + + + + .\Release\ + .\Release\ + false + ../../../;$(IncludePath) + + + false + ../../../;$(IncludePath) + + + .\Debug\ + .\Debug\ + true + ../../../;$(IncludePath) + + + true + ../../../;$(IncludePath) + + + + MultiThreaded + Default + true + true + MaxSpeed + true + Level3 + ../../;../../lbl/;../../bpf/;../include/;../../../../common;../../../../dag/include;../../../../dag/drv/windows;../../../Win32-Extensions;./;Win32-Extensions;%(AdditionalIncludeDirectories) + HAVE_VERSION_H;__STDC_VERSION__=199901L;HAVE_PACKET_IS_LOOPBACK_ADAPTER;NDEBUG;YY_NEVER_INTERACTIVE;_USRDLL;BUILDING_PCAP;HAVE_STRERROR;__STDC__;INET6;_WINDOWS;HAVE_ADDRINFO;HAVE_REMOTE;WIN32;_U_=;YY_NO_UNISTD_H;%(PreprocessorDefinitions) + + + 0x0409 + NDEBUG;%(PreprocessorDefinitions) + + + ws2_32.lib;..\..\..\..\packetWin7\Dll\Project\Release No NetMon and AirPcap\Packet.lib;%(AdditionalDependencies) + + + call ..\..\GenVersion.bat ..\..\VERSION ..\..\pcap_version.h.in ..\..\pcap_version.h +win_flex -Ppcap_ -7 --outfile=..\..\scanner.c --header-file=..\..\scanner.h ..\..\scanner.l +win_bison -ppcap_ --yacc --output=..\..\grammar.c --defines ..\..\grammar.y + + + + + MultiThreaded + Default + true + true + MaxSpeed + true + Level3 + ../../;../../lbl/;../../bpf/;../include/;../../../../common;../../../../dag/include;../../../../dag/drv/windows;../../../Win32-Extensions;./;Win32-Extensions;%(AdditionalIncludeDirectories) + HAVE_VERSION_H;__STDC_VERSION__=199901L;HAVE_PACKET_IS_LOOPBACK_ADAPTER;NDEBUG;YY_NEVER_INTERACTIVE;_USRDLL;BUILDING_PCAP;HAVE_STRERROR;__STDC__;INET6;_WINDOWS;HAVE_ADDRINFO;HAVE_REMOTE;WIN32;_U_=;YY_NO_UNISTD_H;%(PreprocessorDefinitions) + + + 0x0409 + NDEBUG;%(PreprocessorDefinitions) + + + ws2_32.lib;..\..\..\..\packetWin7\Dll\Project\x64\Release No NetMon and AirPcap\Packet.lib;%(AdditionalDependencies) + + + call ..\..\GenVersion.bat ..\..\VERSION ..\..\pcap_version.h.in ..\..\pcap_version.h +win_flex -Ppcap_ -7 --outfile=..\..\scanner.c --header-file=..\..\scanner.h ..\..\scanner.l +win_bison -ppcap_ --yacc --output=..\..\grammar.c --defines ..\..\grammar.y + + + + + MultiThreadedDebug + Default + false + Disabled + true + Level3 + true + EditAndContinue + ../../;../../lbl/;../../bpf/;../include/;../../../../common;../../../../dag/include;../../../../dag/drv/windows;../../../Win32-Extensions;./;Win32-Extensions;%(AdditionalIncludeDirectories) + HAVE_VERSION_H;__STDC_VERSION__=199901L;HAVE_PACKET_IS_LOOPBACK_ADAPTER;_DEBUG;YY_NEVER_INTERACTIVE;_USRDLL;BUILDING_PCAP;HAVE_STRERROR;__STDC__;INET6;_WINDOWS;HAVE_ADDRINFO;HAVE_REMOTE;WIN32;_U_=;YY_NO_UNISTD_H;%(PreprocessorDefinitions) + EnableFastChecks + + + 0x0409 + _DEBUG;%(PreprocessorDefinitions) + + + ws2_32.lib;..\..\..\..\packetWin7\Dll\Project\Release No NetMon and AirPcap\Packet.lib;%(AdditionalDependencies) + + + call ..\..\GenVersion.bat ..\..\VERSION ..\..\pcap_version.h.in ..\..\pcap_version.h +win_flex -Ppcap_ -7 --outfile=..\..\scanner.c --header-file=..\..\scanner.h ..\..\scanner.l +win_bison -ppcap_ --yacc --output=..\..\grammar.c --defines ..\..\grammar.y + + + + + MultiThreadedDebug + Default + false + Disabled + true + Level3 + ProgramDatabase + ../../;../../lbl/;../../bpf/;../include/;../../../../common;../../../../dag/include;../../../../dag/drv/windows;../../../Win32-Extensions;./;Win32-Extensions;%(AdditionalIncludeDirectories) + HAVE_VERSION_H;__STDC_VERSION__=199901L;HAVE_PACKET_IS_LOOPBACK_ADAPTER;_DEBUG;YY_NEVER_INTERACTIVE;_USRDLL;BUILDING_PCAP;HAVE_STRERROR;__STDC__;INET6;_WINDOWS;HAVE_ADDRINFO;HAVE_REMOTE;WIN32;_U_=;YY_NO_UNISTD_H;%(PreprocessorDefinitions) + EnableFastChecks + + + 0x0409 + _DEBUG;%(PreprocessorDefinitions) + + + ws2_32.lib;..\..\..\..\packetWin7\Dll\Project\x64\Release No NetMon and AirPcap\Packet.lib;%(AdditionalDependencies) + + + call ..\..\GenVersion.bat ..\..\VERSION ..\..\pcap_version.h.in ..\..\pcap_version.h +win_flex -Ppcap_ -7 --outfile=..\..\scanner.c --header-file=..\..\scanner.h ..\..\scanner.l +win_bison -ppcap_ --yacc --output=..\..\grammar.c --defines ..\..\grammar.y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libpcap/Win32/Prj/wpcap.vcxproj.filters b/libpcap/Win32/Prj/wpcap.vcxproj.filters new file mode 100644 index 000000000..72f1492c0 --- /dev/null +++ b/libpcap/Win32/Prj/wpcap.vcxproj.filters @@ -0,0 +1,107 @@ + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + {c51dce5e-0da9-4e33-a235-d5c76c76485c} + + + {5ec9fd4b-10b5-4527-b249-56b53d844fb1} + + + {c90886f0-8973-436b-a7a1-b9e881544f9a} + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Resource Files + + + diff --git a/libpcap/Win32/Src/gai_strerror.c b/libpcap/Win32/Src/gai_strerror.c deleted file mode 100644 index a36c35d8f..000000000 --- a/libpcap/Win32/Src/gai_strerror.c +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the project nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* -#include - -__FBSDID("$FreeBSD: /repoman/r/ncvs/src/lib/libc/net/gai_strerror.c,v 1.1 2005/04/06 12:45:51 ume Exp $"); - -*/ - -#ifdef WIN32 - -#include - -#else - -#include - -#endif - -/* Entries EAI_ADDRFAMILY (1) and EAI_NODATA (7) are obsoleted, but left */ -/* for backward compatibility with userland code prior to 2553bis-02 */ -static char *ai_errlist[] = { - "Success", /* 0 */ - "Address family for hostname not supported", /* 1 */ - "Temporary failure in name resolution", /* EAI_AGAIN */ - "Invalid value for ai_flags", /* EAI_BADFLAGS */ - "Non-recoverable failure in name resolution", /* EAI_FAIL */ - "ai_family not supported", /* EAI_FAMILY */ - "Memory allocation failure", /* EAI_MEMORY */ - "No address associated with hostname", /* 7 */ - "hostname nor servname provided, or not known", /* EAI_NONAME */ - "servname not supported for ai_socktype", /* EAI_SERVICE */ - "ai_socktype not supported", /* EAI_SOCKTYPE */ - "System error returned in errno", /* EAI_SYSTEM */ - "Invalid value for hints", /* EAI_BADHINTS */ - "Resolved protocol is unknown" /* EAI_PROTOCOL */ -}; - -#ifndef EAI_MAX -#define EAI_MAX (sizeof(ai_errlist)/sizeof(ai_errlist[0])) -#endif - -/* on MingW, gai_strerror is available. - We need to compile gai_strerrorA only for Cygwin - */ -#ifndef gai_strerror - -char * -WSAAPI gai_strerrorA(int ecode) -{ - if (ecode >= 0 && ecode < EAI_MAX) - return ai_errlist[ecode]; - return "Unknown error"; -} - -#endif /* gai_strerror */ \ No newline at end of file diff --git a/libpcap/Win32/Src/getaddrinfo.c b/libpcap/Win32/Src/getaddrinfo.c deleted file mode 100644 index d3ebda085..000000000 --- a/libpcap/Win32/Src/getaddrinfo.c +++ /dev/null @@ -1,1124 +0,0 @@ -/* - * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the project nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * "#ifdef FAITH" part is local hack for supporting IPv4-v6 translator. - * - * Issues to be discussed: - * - Thread safe-ness must be checked. - * - Return values. There are nonstandard return values defined and used - * in the source code. This is because RFC2553 is silent about which error - * code must be returned for which situation. - * Note: - * - We use getipnodebyname() just for thread-safeness. There's no intent - * to let it do PF_UNSPEC (actually we never pass PF_UNSPEC to - * getipnodebyname(). - * - The code filters out AFs that are not supported by the kernel, - * when globbing NULL hostname (to loopback, or wildcard). Is it the right - * thing to do? What is the relationship with post-RFC2553 AI_ADDRCONFIG - * in ai_flags? - */ - -/* - * Mingw64 has its own implementation of getaddrinfo, mingw32 no - */ -#ifndef __MINGW64__ - - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#if 0 -#include -#endif -#ifndef __MINGW32__ -#include -#endif -#include -#include -#include -#include -#include -#include - -#ifndef HAVE_PORTABLE_PROTOTYPE -#include "cdecl_ext.h" -#endif - -#ifndef HAVE_U_INT32_T -#include "bittypes.h" -#endif - -#ifndef HAVE_SOCKADDR_STORAGE -#ifndef __MINGW32__ -#include "sockstorage.h" -#endif -#endif - -#ifdef NEED_ADDRINFO_H -#include "addrinfo.h" -#ifdef WIN32 -#include "ip6_misc.h" -#endif -#endif - - -#if defined(__KAME__) && defined(INET6) -# define FAITH -#endif - -#define SUCCESS 0 -#define ANY 0 -#define YES 1 -#define NO 0 - -#ifdef FAITH -static int translate = NO; -static struct in6_addr faith_prefix = IN6ADDR_ANY_INIT; -#endif - -static const char in_addrany[] = { 0, 0, 0, 0 }; -static const char in6_addrany[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; -static const char in_loopback[] = { 127, 0, 0, 1 }; -static const char in6_loopback[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 -}; - -struct sockinet { - u_char si_len; - u_char si_family; - u_short si_port; - u_int32_t si_scope_id; -}; - -static const struct afd { - int a_af; - int a_addrlen; - int a_socklen; - int a_off; - const char *a_addrany; - const char *a_loopback; - int a_scoped; -} afdl [] = { -#ifdef INET6 - {PF_INET6, sizeof(struct in6_addr), - sizeof(struct sockaddr_in6), - offsetof(struct sockaddr_in6, sin6_addr), - in6_addrany, in6_loopback, 1}, -#endif - {PF_INET, sizeof(struct in_addr), - sizeof(struct sockaddr_in), - offsetof(struct sockaddr_in, sin_addr), - in_addrany, in_loopback, 0}, - {0, 0, 0, 0, NULL, NULL, 0}, -}; - -struct explore { - int e_af; - int e_socktype; - int e_protocol; - const char *e_protostr; - int e_wild; -#define WILD_AF(ex) ((ex)->e_wild & 0x01) -#define WILD_SOCKTYPE(ex) ((ex)->e_wild & 0x02) -#define WILD_PROTOCOL(ex) ((ex)->e_wild & 0x04) -}; - -static const struct explore explore[] = { -#if 0 - { PF_LOCAL, 0, ANY, ANY, NULL, 0x01 }, -#endif -#ifdef INET6 - { PF_INET6, SOCK_DGRAM, IPPROTO_UDP, "udp", 0x07 }, - { PF_INET6, SOCK_STREAM, IPPROTO_TCP, "tcp", 0x07 }, - { PF_INET6, SOCK_RAW, ANY, NULL, 0x05 }, -#endif - { PF_INET, SOCK_DGRAM, IPPROTO_UDP, "udp", 0x07 }, - { PF_INET, SOCK_STREAM, IPPROTO_TCP, "tcp", 0x07 }, - { PF_INET, SOCK_RAW, ANY, NULL, 0x05 }, - { -1, 0, 0, NULL, 0 }, -}; - -#ifdef INET6 -#define PTON_MAX 16 -#else -#define PTON_MAX 4 -#endif - - -static int str_isnumber __P((const char *)); -static int explore_fqdn __P((const struct addrinfo *, const char *, - const char *, struct addrinfo **)); -static int explore_null __P((const struct addrinfo *, const char *, - const char *, struct addrinfo **)); -static int explore_numeric __P((const struct addrinfo *, const char *, - const char *, struct addrinfo **)); -static int explore_numeric_scope __P((const struct addrinfo *, const char *, - const char *, struct addrinfo **)); -static int get_name __P((const char *, const struct afd *, struct addrinfo **, - char *, const struct addrinfo *, const char *)); -static int get_canonname __P((const struct addrinfo *, - struct addrinfo *, const char *)); -static struct addrinfo *get_ai __P((const struct addrinfo *, - const struct afd *, const char *)); -static int get_portmatch __P((const struct addrinfo *, const char *)); -static int get_port __P((struct addrinfo *, const char *, int)); -static const struct afd *find_afd __P((int)); - -static char *ai_errlist[] = { - "Success", - "Address family for hostname not supported", /* EAI_ADDRFAMILY */ - "Temporary failure in name resolution", /* EAI_AGAIN */ - "Invalid value for ai_flags", /* EAI_BADFLAGS */ - "Non-recoverable failure in name resolution", /* EAI_FAIL */ - "ai_family not supported", /* EAI_FAMILY */ - "Memory allocation failure", /* EAI_MEMORY */ - "No address associated with hostname", /* EAI_NODATA */ - "hostname nor servname provided, or not known", /* EAI_NONAME */ - "servname not supported for ai_socktype", /* EAI_SERVICE */ - "ai_socktype not supported", /* EAI_SOCKTYPE */ - "System error returned in errno", /* EAI_SYSTEM */ - "Invalid value for hints", /* EAI_BADHINTS */ - "Resolved protocol is unknown", /* EAI_PROTOCOL */ - "Unknown error", /* EAI_MAX */ -}; - -/* XXX macros that make external reference is BAD. */ - -#define GET_AI(ai, afd, addr) \ -do { \ - /* external reference: pai, error, and label free */ \ - (ai) = get_ai(pai, (afd), (addr)); \ - if ((ai) == NULL) { \ - error = EAI_MEMORY; \ - goto free; \ - } \ -} while (0) - -#define GET_PORT(ai, serv) \ -do { \ - /* external reference: error and label free */ \ - error = get_port((ai), (serv), 0); \ - if (error != 0) \ - goto free; \ -} while (0) - -#define GET_CANONNAME(ai, str) \ -do { \ - /* external reference: pai, error and label free */ \ - error = get_canonname(pai, (ai), (str)); \ - if (error != 0) \ - goto free; \ -} while (0) - -#define ERR(err) \ -do { \ - /* external reference: error, and label bad */ \ - error = (err); \ - goto bad; \ -} while (0) - -#define MATCH_FAMILY(x, y, w) \ - ((x) == (y) || ((w) && ((x) == PF_UNSPEC || (y) == PF_UNSPEC))) -#define MATCH(x, y, w) \ - ((x) == (y) || ((w) && ((x) == ANY || (y) == ANY))) - -#if defined(DEFINE_ADDITIONAL_IPV6_STUFF) -char * -gai_strerror(ecode) - int ecode; -{ - if (ecode < 0 || ecode > EAI_MAX) - ecode = EAI_MAX; - return ai_errlist[ecode]; -} -#endif - -void -freeaddrinfo(ai) - struct addrinfo *ai; -{ - struct addrinfo *next; - - do { - next = ai->ai_next; - if (ai->ai_canonname) - free(ai->ai_canonname); - /* no need to free(ai->ai_addr) */ - free(ai); - } while ((ai = next) != NULL); -} - -static int -str_isnumber(p) - const char *p; -{ - char *q = (char *)p; - while (*q) { - if (! isdigit(*q)) - return NO; - q++; - } - return YES; -} - -int -getaddrinfo(hostname, servname, hints, res) - const char *hostname, *servname; - const struct addrinfo *hints; - struct addrinfo **res; -{ - struct addrinfo sentinel; - struct addrinfo *cur; - int error = 0; - struct addrinfo ai; - struct addrinfo ai0; - struct addrinfo *pai; - const struct afd *afd; - const struct explore *ex; - -#ifdef FAITH - static int firsttime = 1; - - if (firsttime) { - /* translator hack */ - char *q = getenv("GAI"); - if (q && inet_pton(AF_INET6, q, &faith_prefix) == 1) - translate = YES; - firsttime = 0; - } -#endif - - sentinel.ai_next = NULL; - cur = &sentinel; - pai = &ai; - pai->ai_flags = 0; - pai->ai_family = PF_UNSPEC; - pai->ai_socktype = ANY; - pai->ai_protocol = ANY; - pai->ai_addrlen = 0; - pai->ai_canonname = NULL; - pai->ai_addr = NULL; - pai->ai_next = NULL; - - if (hostname == NULL && servname == NULL) - return EAI_NONAME; - if (hints) { - /* error check for hints */ - if (hints->ai_addrlen || hints->ai_canonname || - hints->ai_addr || hints->ai_next) - ERR(EAI_BADHINTS); /* xxx */ - if (hints->ai_flags & ~AI_MASK) - ERR(EAI_BADFLAGS); - switch (hints->ai_family) { - case PF_UNSPEC: - case PF_INET: -#ifdef INET6 - case PF_INET6: -#endif - break; - default: - ERR(EAI_FAMILY); - } - memcpy(pai, hints, sizeof(*pai)); - - /* - * if both socktype/protocol are specified, check if they - * are meaningful combination. - */ - if (pai->ai_socktype != ANY && pai->ai_protocol != ANY) { - for (ex = explore; ex->e_af >= 0; ex++) { - if (pai->ai_family != ex->e_af) - continue; - if (ex->e_socktype == ANY) - continue; - if (ex->e_protocol == ANY) - continue; - if (pai->ai_socktype == ex->e_socktype - && pai->ai_protocol != ex->e_protocol) { - ERR(EAI_BADHINTS); - } - } - } - } - - /* - * check for special cases. (1) numeric servname is disallowed if - * socktype/protocol are left unspecified. (2) servname is disallowed - * for raw and other inet{,6} sockets. - */ - if (MATCH_FAMILY(pai->ai_family, PF_INET, 1) -#ifdef PF_INET6 - || MATCH_FAMILY(pai->ai_family, PF_INET6, 1) -#endif - ) { - ai0 = *pai; - - if (pai->ai_family == PF_UNSPEC) { -#ifdef PF_INET6 - pai->ai_family = PF_INET6; -#else - pai->ai_family = PF_INET; -#endif - } - error = get_portmatch(pai, servname); - if (error) - ERR(error); - - *pai = ai0; - } - - ai0 = *pai; - - /* NULL hostname, or numeric hostname */ - for (ex = explore; ex->e_af >= 0; ex++) { - *pai = ai0; - - if (!MATCH_FAMILY(pai->ai_family, ex->e_af, WILD_AF(ex))) - continue; - if (!MATCH(pai->ai_socktype, ex->e_socktype, WILD_SOCKTYPE(ex))) - continue; - if (!MATCH(pai->ai_protocol, ex->e_protocol, WILD_PROTOCOL(ex))) - continue; - - if (pai->ai_family == PF_UNSPEC) - pai->ai_family = ex->e_af; - if (pai->ai_socktype == ANY && ex->e_socktype != ANY) - pai->ai_socktype = ex->e_socktype; - if (pai->ai_protocol == ANY && ex->e_protocol != ANY) - pai->ai_protocol = ex->e_protocol; - - if (hostname == NULL) - error = explore_null(pai, hostname, servname, &cur->ai_next); - else - error = explore_numeric_scope(pai, hostname, servname, &cur->ai_next); - - if (error) - goto free; - - while (cur && cur->ai_next) - cur = cur->ai_next; - } - - /* - * XXX - * If numreic representation of AF1 can be interpreted as FQDN - * representation of AF2, we need to think again about the code below. - */ - if (sentinel.ai_next) - goto good; - - if (pai->ai_flags & AI_NUMERICHOST) - ERR(EAI_NONAME); - if (hostname == NULL) - ERR(EAI_NONAME); - - /* - * hostname as alphabetical name. - * we would like to prefer AF_INET6 than AF_INET, so we'll make a - * outer loop by AFs. - */ - for (afd = afdl; afd->a_af; afd++) { - *pai = ai0; - - if (!MATCH_FAMILY(pai->ai_family, afd->a_af, 1)) - continue; - - for (ex = explore; ex->e_af >= 0; ex++) { - *pai = ai0; - - if (pai->ai_family == PF_UNSPEC) - pai->ai_family = afd->a_af; - - if (!MATCH_FAMILY(pai->ai_family, ex->e_af, WILD_AF(ex))) - continue; - if (!MATCH(pai->ai_socktype, ex->e_socktype, - WILD_SOCKTYPE(ex))) { - continue; - } - if (!MATCH(pai->ai_protocol, ex->e_protocol, - WILD_PROTOCOL(ex))) { - continue; - } - - if (pai->ai_family == PF_UNSPEC) - pai->ai_family = ex->e_af; - if (pai->ai_socktype == ANY && ex->e_socktype != ANY) - pai->ai_socktype = ex->e_socktype; - if (pai->ai_protocol == ANY && ex->e_protocol != ANY) - pai->ai_protocol = ex->e_protocol; - - error = explore_fqdn(pai, hostname, servname, - &cur->ai_next); - - while (cur && cur->ai_next) - cur = cur->ai_next; - } - } - - /* XXX */ - if (sentinel.ai_next) - error = 0; - - if (error) - goto free; - if (error == 0) { - if (sentinel.ai_next) { - good: - *res = sentinel.ai_next; - return SUCCESS; - } else - error = EAI_FAIL; - } - free: - bad: - if (sentinel.ai_next) - freeaddrinfo(sentinel.ai_next); - *res = NULL; - return error; -} - -/* - * FQDN hostname, DNS lookup - */ -static int -explore_fqdn(pai, hostname, servname, res) - const struct addrinfo *pai; - const char *hostname; - const char *servname; - struct addrinfo **res; -{ - struct hostent *hp; - int h_error; - int af; - char **aplist = NULL, *apbuf = NULL; - char *ap; - struct addrinfo sentinel, *cur; - int i; -#ifndef USE_GETIPNODEBY - int naddrs; -#endif - const struct afd *afd; - int error; - - *res = NULL; - sentinel.ai_next = NULL; - cur = &sentinel; - - /* - * Do not filter unsupported AFs here. We need to honor content of - * databases (/etc/hosts, DNS and others). Otherwise we cannot - * replace gethostbyname() by getaddrinfo(). - */ - - /* - * if the servname does not match socktype/protocol, ignore it. - */ - if (get_portmatch(pai, servname) != 0) - return 0; - - afd = find_afd(pai->ai_family); - - /* - * post-RFC2553: should look at (pai->ai_flags & AI_ADDRCONFIG) - * rather than hardcoding it. we may need to add AI_ADDRCONFIG - * handling code by ourselves in case we don't have getipnodebyname(). - */ -#ifdef USE_GETIPNODEBY - hp = getipnodebyname(hostname, pai->ai_family, AI_ADDRCONFIG, &h_error); -#else -#ifdef HAVE_GETHOSTBYNAME2 - hp = gethostbyname2(hostname, pai->ai_family); -#else - if (pai->ai_family != AF_INET) - return 0; - hp = gethostbyname(hostname); -#ifdef HAVE_H_ERRNO - h_error = h_errno; -#else - h_error = EINVAL; -#endif -#endif /*HAVE_GETHOSTBYNAME2*/ -#endif /*USE_GETIPNODEBY*/ - - if (hp == NULL) { - switch (h_error) { - case HOST_NOT_FOUND: - case NO_DATA: - error = EAI_NODATA; - break; - case TRY_AGAIN: - error = EAI_AGAIN; - break; - case NO_RECOVERY: - case NETDB_INTERNAL: - default: - error = EAI_FAIL; - break; - } - } else if ((hp->h_name == NULL) || (hp->h_name[0] == 0) - || (hp->h_addr_list[0] == NULL)) { -#ifdef USE_GETIPNODEBY - freehostent(hp); -#endif - hp = NULL; - error = EAI_FAIL; - } - - if (hp == NULL) - goto free; - -#ifdef USE_GETIPNODEBY - aplist = hp->h_addr_list; -#else - /* - * hp will be overwritten if we use gethostbyname2(). - * always deep copy for simplification. - */ - for (naddrs = 0; hp->h_addr_list[naddrs] != NULL; naddrs++) - ; - naddrs++; - aplist = (char **)malloc(sizeof(aplist[0]) * naddrs); - apbuf = (char *)malloc(hp->h_length * naddrs); - if (aplist == NULL || apbuf == NULL) { - error = EAI_MEMORY; - goto free; - } - memset(aplist, 0, sizeof(aplist[0]) * naddrs); - for (i = 0; i < naddrs; i++) { - if (hp->h_addr_list[i] == NULL) { - aplist[i] = NULL; - continue; - } - memcpy(&apbuf[i * hp->h_length], hp->h_addr_list[i], - hp->h_length); - aplist[i] = &apbuf[i * hp->h_length]; - } -#endif - - for (i = 0; aplist[i] != NULL; i++) { - af = hp->h_addrtype; - ap = aplist[i]; -#ifdef AF_INET6 - if (af == AF_INET6 - && IN6_IS_ADDR_V4MAPPED((struct in6_addr *)ap)) { - af = AF_INET; - ap = ap + sizeof(struct in6_addr) - - sizeof(struct in_addr); - } -#endif - - if (af != pai->ai_family) - continue; - - if ((pai->ai_flags & AI_CANONNAME) == 0) { - GET_AI(cur->ai_next, afd, ap); - GET_PORT(cur->ai_next, servname); - } else { - /* - * if AI_CANONNAME and if reverse lookup - * fail, return ai anyway to pacify - * calling application. - * - * XXX getaddrinfo() is a name->address - * translation function, and it looks - * strange that we do addr->name - * translation here. - */ - get_name(ap, afd, &cur->ai_next, - ap, pai, servname); - } - - while (cur && cur->ai_next) - cur = cur->ai_next; - } - - *res = sentinel.ai_next; - return 0; - -free: -#ifdef USE_GETIPNODEBY - if (hp) - freehostent(hp); -#endif - if (aplist) - free(aplist); - if (apbuf) - free(apbuf); - if (sentinel.ai_next) - freeaddrinfo(sentinel.ai_next); - return error; -} - -/* - * hostname == NULL. - * passive socket -> anyaddr (0.0.0.0 or ::) - * non-passive socket -> localhost (127.0.0.1 or ::1) - */ -static int -explore_null(pai, hostname, servname, res) - const struct addrinfo *pai; - const char *hostname; - const char *servname; - struct addrinfo **res; -{ - int s; - const struct afd *afd; - struct addrinfo *cur; - struct addrinfo sentinel; - int error; - - *res = NULL; - sentinel.ai_next = NULL; - cur = &sentinel; - - /* - * filter out AFs that are not supported by the kernel - * XXX errno? - */ - s = socket(pai->ai_family, SOCK_DGRAM, 0); - if (s < 0) { - if (errno != EMFILE) - return 0; - } else - close(s); - - /* - * if the servname does not match socktype/protocol, ignore it. - */ - if (get_portmatch(pai, servname) != 0) - return 0; - - afd = find_afd(pai->ai_family); - - if (pai->ai_flags & AI_PASSIVE) { - GET_AI(cur->ai_next, afd, afd->a_addrany); - /* xxx meaningless? - * GET_CANONNAME(cur->ai_next, "anyaddr"); - */ - GET_PORT(cur->ai_next, servname); - } else { - GET_AI(cur->ai_next, afd, afd->a_loopback); - /* xxx meaningless? - * GET_CANONNAME(cur->ai_next, "localhost"); - */ - GET_PORT(cur->ai_next, servname); - } - cur = cur->ai_next; - - *res = sentinel.ai_next; - return 0; - -free: - if (sentinel.ai_next) - freeaddrinfo(sentinel.ai_next); - return error; -} - -/* - * numeric hostname - */ -static int -explore_numeric(pai, hostname, servname, res) - const struct addrinfo *pai; - const char *hostname; - const char *servname; - struct addrinfo **res; -{ - const struct afd *afd; - struct addrinfo *cur; - struct addrinfo sentinel; - int error; - char pton[PTON_MAX]; - int flags; - - *res = NULL; - sentinel.ai_next = NULL; - cur = &sentinel; - - /* - * if the servname does not match socktype/protocol, ignore it. - */ - if (get_portmatch(pai, servname) != 0) - return 0; - - afd = find_afd(pai->ai_family); - flags = pai->ai_flags; - - if (inet_pton(afd->a_af, hostname, pton) == 1) { - u_int32_t v4a; -#ifdef INET6 - u_char pfx; -#endif - - switch (afd->a_af) { - case AF_INET: - v4a = (u_int32_t)ntohl(((struct in_addr *)pton)->s_addr); - if (IN_MULTICAST(v4a) || IN_EXPERIMENTAL(v4a)) - flags &= ~AI_CANONNAME; - v4a >>= IN_CLASSA_NSHIFT; - if (v4a == 0 || v4a == IN_LOOPBACKNET) - flags &= ~AI_CANONNAME; - break; -#ifdef INET6 - case AF_INET6: - pfx = ((struct in6_addr *)pton)->s6_addr[0]; - if (pfx == 0 || pfx == 0xfe || pfx == 0xff) - flags &= ~AI_CANONNAME; - break; -#endif - } - - if (pai->ai_family == afd->a_af || - pai->ai_family == PF_UNSPEC /*?*/) { - if ((flags & AI_CANONNAME) == 0) { - GET_AI(cur->ai_next, afd, pton); - GET_PORT(cur->ai_next, servname); - } else { - /* - * if AI_CANONNAME and if reverse lookup - * fail, return ai anyway to pacify - * calling application. - * - * XXX getaddrinfo() is a name->address - * translation function, and it looks - * strange that we do addr->name - * translation here. - */ - get_name(pton, afd, &cur->ai_next, - pton, pai, servname); - } - while (cur && cur->ai_next) - cur = cur->ai_next; - } else - ERR(EAI_FAMILY); /*xxx*/ - } - - *res = sentinel.ai_next; - return 0; - -free: -bad: - if (sentinel.ai_next) - freeaddrinfo(sentinel.ai_next); - return error; -} - -/* - * numeric hostname with scope - */ -static int -explore_numeric_scope(pai, hostname, servname, res) - const struct addrinfo *pai; - const char *hostname; - const char *servname; - struct addrinfo **res; -{ -#ifndef SCOPE_DELIMITER - return explore_numeric(pai, hostname, servname, res); -#else - const struct afd *afd; - struct addrinfo *cur; - int error; - char *cp, *hostname2 = NULL; - int scope; - struct sockaddr_in6 *sin6; - - /* - * if the servname does not match socktype/protocol, ignore it. - */ - if (get_portmatch(pai, servname) != 0) - return 0; - - afd = find_afd(pai->ai_family); - if (!afd->a_scoped) - return explore_numeric(pai, hostname, servname, res); - - cp = strchr(hostname, SCOPE_DELIMITER); - if (cp == NULL) - return explore_numeric(pai, hostname, servname, res); - - /* - * Handle special case of - */ - hostname2 = strdup(hostname); - if (hostname2 == NULL) - return EAI_MEMORY; - /* terminate at the delimiter */ - hostname2[cp - hostname] = '\0'; - - cp++; - switch (pai->ai_family) { -#ifdef INET6 - case AF_INET6: - scope = if_nametoindex(cp); - if (scope == 0) { - free(hostname2); - return (EAI_NONAME); - } - break; -#endif - } - - error = explore_numeric(pai, hostname2, servname, res); - if (error == 0) { - for (cur = *res; cur; cur = cur->ai_next) { - if (cur->ai_family != AF_INET6) - continue; - sin6 = (struct sockaddr_in6 *)cur->ai_addr; - if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr) || - IN6_IS_ADDR_MC_LINKLOCAL(&sin6->sin6_addr)) - sin6->sin6_scope_id = scope; - } - } - - free(hostname2); - - return error; -#endif -} - -static int -get_name(addr, afd, res, numaddr, pai, servname) - const char *addr; - const struct afd *afd; - struct addrinfo **res; - char *numaddr; - const struct addrinfo *pai; - const char *servname; -{ - struct hostent *hp = NULL; - struct addrinfo *cur = NULL; - int error = 0; - char *ap = NULL, *cn = NULL; -#ifdef USE_GETIPNODEBY - int h_error; - - hp = getipnodebyaddr(addr, afd->a_addrlen, afd->a_af, &h_error); -#else - hp = gethostbyaddr(addr, afd->a_addrlen, afd->a_af); -#endif - if (hp && hp->h_name && hp->h_name[0] && hp->h_addr_list[0]) { -#ifdef USE_GETIPNODEBY - GET_AI(cur, afd, hp->h_addr_list[0]); - GET_PORT(cur, servname); - GET_CANONNAME(cur, hp->h_name); -#else - /* hp will be damaged if we use gethostbyaddr() */ - if ((ap = (char *)malloc(hp->h_length)) == NULL) { - error = EAI_MEMORY; - goto free; - } - memcpy(ap, hp->h_addr_list[0], hp->h_length); - if ((cn = strdup(hp->h_name)) == NULL) { - error = EAI_MEMORY; - goto free; - } - - GET_AI(cur, afd, ap); - GET_PORT(cur, servname); - GET_CANONNAME(cur, cn); - free(ap); ap = NULL; - free(cn); cn = NULL; -#endif - } else { - GET_AI(cur, afd, numaddr); - GET_PORT(cur, servname); - } - -#ifdef USE_GETIPNODEBY - if (hp) - freehostent(hp); -#endif - *res = cur; - return SUCCESS; - free: - if (cur) - freeaddrinfo(cur); - if (ap) - free(ap); - if (cn) - free(cn); -#ifdef USE_GETIPNODEBY - if (hp) - freehostent(hp); -#endif - *res = NULL; - return error; -} - -static int -get_canonname(pai, ai, str) - const struct addrinfo *pai; - struct addrinfo *ai; - const char *str; -{ - if ((pai->ai_flags & AI_CANONNAME) != 0) { - ai->ai_canonname = strdup(str); - if (ai->ai_canonname == NULL) - return EAI_MEMORY; - } - return 0; -} - -static struct addrinfo * -get_ai(pai, afd, addr) - const struct addrinfo *pai; - const struct afd *afd; - const char *addr; -{ - char *p; - struct addrinfo *ai; - - ai = (struct addrinfo *)malloc(sizeof(struct addrinfo) - + (afd->a_socklen)); - if (ai == NULL) - return NULL; - - memcpy(ai, pai, sizeof(struct addrinfo)); - ai->ai_addr = (struct sockaddr *)(ai + 1); - memset(ai->ai_addr, 0, afd->a_socklen); -#ifdef HAVE_SOCKADDR_SA_LEN - ai->ai_addr->sa_len = afd->a_socklen; -#endif - ai->ai_addrlen = afd->a_socklen; - ai->ai_addr->sa_family = ai->ai_family = afd->a_af; - p = (char *)(ai->ai_addr); - memcpy(p + afd->a_off, addr, afd->a_addrlen); - return ai; -} - -static int -get_portmatch(ai, servname) - const struct addrinfo *ai; - const char *servname; -{ - - /* get_port does not touch first argument. when matchonly == 1. */ - return get_port((struct addrinfo *)ai, servname, 1); -} - -static int -get_port(ai, servname, matchonly) - struct addrinfo *ai; - const char *servname; - int matchonly; -{ - const char *proto; - struct servent *sp; - int port; - int allownumeric; - - if (servname == NULL) - return 0; - switch (ai->ai_family) { - case AF_INET: -#ifdef AF_INET6 - case AF_INET6: -#endif - break; - default: - return 0; - } - - switch (ai->ai_socktype) { - case SOCK_RAW: - return EAI_SERVICE; - case SOCK_DGRAM: - case SOCK_STREAM: - allownumeric = 1; - break; - case ANY: - allownumeric = 0; - break; - default: - return EAI_SOCKTYPE; - } - - if (str_isnumber(servname)) { - if (!allownumeric) - return EAI_SERVICE; - port = htons(atoi(servname)); - if (port < 0 || port > 65535) - return EAI_SERVICE; - } else { - switch (ai->ai_socktype) { - case SOCK_DGRAM: - proto = "udp"; - break; - case SOCK_STREAM: - proto = "tcp"; - break; - default: - proto = NULL; - break; - } - - if ((sp = getservbyname(servname, proto)) == NULL) - return EAI_SERVICE; - port = sp->s_port; - } - - if (!matchonly) { - switch (ai->ai_family) { - case AF_INET: - ((struct sockaddr_in *)ai->ai_addr)->sin_port = port; - break; -#ifdef INET6 - case AF_INET6: - ((struct sockaddr_in6 *)ai->ai_addr)->sin6_port = port; - break; -#endif - } - } - - return 0; -} - -static const struct afd * -find_afd(af) - int af; -{ - const struct afd *afd; - - if (af == PF_UNSPEC) - return NULL; - for (afd = afdl; afd->a_af; afd++) { - if (afd->a_af == af) - return afd; - } - return NULL; -} - - -#endif /*__MING64__*/ diff --git a/libpcap/Win32/Src/getnetbynm.c b/libpcap/Win32/Src/getnetbynm.c deleted file mode 100644 index fa4d398e5..000000000 --- a/libpcap/Win32/Src/getnetbynm.c +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 1983 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that the above copyright notice and this paragraph are - * duplicated in all such forms and that any documentation, - * advertising materials, and other materials related to such - * distribution and use acknowledge that the software was developed - * by the University of California, Berkeley. The name of the - * University may not be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)getnetbyname.c 5.5 (Berkeley) 6/27/88"; -#endif /* LIBC_SCCS and not lint */ - -#include "inetprivate.h" - -extern int _net_stayopen; - -struct netent * -getnetbyname(const char *name) -{ - register struct netent *p; - register char **cp; - - setnetent(_net_stayopen); - while (p = getnetent()) { - if (strcmp(p->n_name, name) == 0) - break; - for (cp = p->n_aliases; *cp != 0; cp++) - if (strcmp(*cp, name) == 0) - goto found; - } -found: - if (!_net_stayopen) - endnetent(); - return (p); -} diff --git a/libpcap/Win32/Src/getnetent.c b/libpcap/Win32/Src/getnetent.c deleted file mode 100644 index 95281a548..000000000 --- a/libpcap/Win32/Src/getnetent.c +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (c) 1983 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that the above copyright notice and this paragraph are - * duplicated in all such forms and that any documentation, - * advertising materials, and other materials related to such - * distribution and use acknowledge that the software was developed - * by the University of California, Berkeley. The name of the - * University may not be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)getnetent.c 5.5 (Berkeley) 6/27/88"; -#endif /* LIBC_SCCS and not lint */ - -#include "inetprivate.h" - -#define MAXALIASES 35 - -static char NETDB[] = _PATH_NETWORKS; -static FILE *netf = NULL; -static char line[BUFSIZ+1]; -static struct netent net; -static char *net_aliases[MAXALIASES]; -static char *any(char *, char *); - -int _net_stayopen; -extern u_int32_t inet_network(const char *cp); - -void -setnetent(f) - int f; -{ - if (netf == NULL) - netf = fopen(NETDB, "r" ); - else - rewind(netf); - _net_stayopen |= f; -} - -void -endnetent() -{ - if (netf) { - fclose(netf); - netf = NULL; - } - _net_stayopen = 0; -} - -struct netent * -getnetent() -{ - char *p; - register char *cp, **q; - - if (netf == NULL && (netf = fopen(NETDB, "r" )) == NULL) - return (NULL); -again: - p = fgets(line, BUFSIZ, netf); - if (p == NULL) - return (NULL); - if (*p == '#') - goto again; - cp = any(p, "#\n"); - if (cp == NULL) - goto again; - *cp = '\0'; - net.n_name = p; - cp = any(p, " \t"); - if (cp == NULL) - goto again; - *cp++ = '\0'; - while (*cp == ' ' || *cp == '\t') - cp++; - p = any(cp, " \t"); - if (p != NULL) - *p++ = '\0'; - net.n_net = inet_network(cp); - net.n_addrtype = AF_INET; - q = net.n_aliases = net_aliases; - if (p != NULL) - cp = p; - while (cp && *cp) { - if (*cp == ' ' || *cp == '\t') { - cp++; - continue; - } - if (q < &net_aliases[MAXALIASES - 1]) - *q++ = cp; - cp = any(cp, " \t"); - if (cp != NULL) - *cp++ = '\0'; - } - *q = NULL; - return (&net); -} - -static char * -any(cp, match) - register char *cp; - char *match; -{ - register char *mp, c; - - while (c = *cp) { - for (mp = match; *mp; mp++) - if (*mp == c) - return (cp); - cp++; - } - return ((char *)0); -} diff --git a/libpcap/Win32/Src/getservent.c b/libpcap/Win32/Src/getservent.c deleted file mode 100644 index 61b8cb04b..000000000 --- a/libpcap/Win32/Src/getservent.c +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (c) 1983, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)getservent.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ - -#include -#include - -#include -#include -#include -#include -#include -#include - -#define MAXALIASES 35 - -static char SERVDB[] = _PATH_SERVICES; -static FILE *servf = NULL; -static char line[BUFSIZ+1]; -static struct servent serv; -static char *serv_aliases[MAXALIASES]; -int _serv_stayopen; - -void -setservent(f) - int f; -{ - if (servf == NULL) - servf = fopen(SERVDB, "r" ); - else - rewind(servf); - _serv_stayopen |= f; -} - -void -endservent() -{ - if (servf) { - fclose(servf); - servf = NULL; - } - _serv_stayopen = 0; -} - -struct servent * -getservent() -{ - char *p; - register char *cp, **q; - - if (servf == NULL && (servf = fopen(SERVDB, "r" )) == NULL) - return (NULL); -again: - if ((p = fgets(line, BUFSIZ, servf)) == NULL) - return (NULL); - if (*p == '#') - goto again; - cp = strpbrk(p, "#\n"); - if (cp == NULL) - goto again; - *cp = '\0'; - serv.s_name = p; - p = strpbrk(p, " \t"); - if (p == NULL) - goto again; - *p++ = '\0'; - while (*p == ' ' || *p == '\t') - p++; - cp = strpbrk(p, ",/"); - if (cp == NULL) - goto again; - *cp++ = '\0'; - serv.s_port = htons((u_short)atoi(p)); - serv.s_proto = cp; - q = serv.s_aliases = serv_aliases; - cp = strpbrk(cp, " \t"); - if (cp != NULL) - *cp++ = '\0'; - while (cp && *cp) { - if (*cp == ' ' || *cp == '\t') { - cp++; - continue; - } - if (q < &serv_aliases[MAXALIASES - 1]) - *q++ = cp; - cp = strpbrk(cp, " \t"); - if (cp != NULL) - *cp++ = '\0'; - } - *q = NULL; - return (&serv); -} diff --git a/libpcap/Win32/Src/inet_aton.c b/libpcap/Win32/Src/inet_aton.c deleted file mode 100644 index db97bceae..000000000 --- a/libpcap/Win32/Src/inet_aton.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 1995, 1996, 1997 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the Kungliga Tekniska - * Högskolan and its contributors. - * - * 4. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include -#include - -/* Minimal implementation of inet_aton. - * Cannot distinguish between failure and a local broadcast address. */ - -#ifndef INADDR_NONE -#define INADDR_NONE 0xffffffff -#endif - -int -inet_aton(const char *cp, struct in_addr *addr) -{ - addr->s_addr = inet_addr(cp); - return (addr->s_addr == INADDR_NONE) ? 0 : 1; -} diff --git a/libpcap/Win32/Src/inet_net.c b/libpcap/Win32/Src/inet_net.c deleted file mode 100644 index 5bbe3914e..000000000 --- a/libpcap/Win32/Src/inet_net.c +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (c) 1983, 1993 - * The Regents of the University of California. All rights reserved. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)inet_network.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ - -#include "inetprivate.h" - -/* - * Internet network address interpretation routine. - * The library routines call this routine to interpret - * network numbers. - */ -u_int32_t -inet_network(const char *cp) -{ - register u_long val, base, n; - register char c; - u_long parts[4], *pp = parts; - register int i; - -again: - /* - * Collect number up to ``.''. - * Values are specified as for C: - * 0x=hex, 0=octal, other=decimal. - */ - val = 0; base = 10; - /* - * The 4.4BSD version of this file also accepts 'x__' as a hexa - * number. I don't think this is correct. -- Uli - */ - if (*cp == '0') { - if (*++cp == 'x' || *cp == 'X') - base = 16, cp++; - else - base = 8; - } - while ((c = *cp)) { - if (isdigit(c)) { - val = (val * base) + (c - '0'); - cp++; - continue; - } - if (base == 16 && isxdigit(c)) { - val = (val << 4) + (c + 10 - (islower(c) ? 'a' : 'A')); - cp++; - continue; - } - break; - } - if (*cp == '.') { - if (pp >= parts + 4) - return (INADDR_NONE); - *pp++ = val, cp++; - goto again; - } - if (*cp && !isspace(*cp)) - return (INADDR_NONE); - *pp++ = val; - n = pp - parts; - if (n > 4) - return (INADDR_NONE); - for (val = 0, i = 0; i < (int)n; i++) { - val <<= 8; - val |= parts[i] & 0xff; - } - return (val); -} diff --git a/libpcap/Win32/Src/inet_pton.c b/libpcap/Win32/Src/inet_pton.c deleted file mode 100644 index 7fe3813a0..000000000 --- a/libpcap/Win32/Src/inet_pton.c +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 1999 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the Kungliga Tekniska - * Högskolan and its contributors. - * - * 4. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include - -#ifdef WIN32 -#ifndef EAFNOSUPPORT -#define EAFNOSUPPORT 97 /* not present in errno.h provided with VC */ -#endif -#endif - -#ifdef __MINGW32__ -int* _errno(); -#define errno (*_errno()) -#endif /* __MINGW32__ */ - -#include - -int inet_aton(const char *cp, struct in_addr *addr); - -int -inet_pton(int af, const char *src, void *dst) -{ - if (af != AF_INET) { - errno = EAFNOSUPPORT; - return -1; - } - return inet_aton (src, dst); -} diff --git a/libpcap/aclocal.m4 b/libpcap/aclocal.m4 index 02502b27f..83f5761f0 100644 --- a/libpcap/aclocal.m4 +++ b/libpcap/aclocal.m4 @@ -102,6 +102,13 @@ AC_DEFUN(AC_LBL_C_INIT, # -Werror forces warnings to be errors. # ac_lbl_cc_force_warning_errors=-Werror + + # + # Try to have the compiler default to hiding symbols, + # so that only symbols explicitly exported with + # PCAP_API will be visible outside (shared) libraries. + # + AC_LBL_CHECK_COMPILER_OPT($1, -fvisibility=hidden) else $2="$$2 -I/usr/local/include" LDFLAGS="$LDFLAGS -L/usr/local/lib" @@ -114,6 +121,13 @@ AC_DEFUN(AC_LBL_C_INIT, # of which use -Werror to force warnings to be errors. # ac_lbl_cc_force_warning_errors=-Werror + + # + # Try to have the compiler default to hiding symbols, + # so that only symbols explicitly exported with + # PCAP_API will be visible outside (shared) libraries. + # + AC_LBL_CHECK_COMPILER_OPT($1, -fvisibility=hidden) ;; hpux*) @@ -188,6 +202,13 @@ AC_DEFUN(AC_LBL_C_INIT, # warnings to be treated as errors. # ac_lbl_cc_force_warning_errors=-errwarn + + # + # Try to have the compiler default to hiding symbols, + # so that only symbols explicitly exported with + # PCAP_API will be visible outside (shared) libraries. + # + AC_LBL_CHECK_COMPILER_OPT($1, -xldscope=hidden) ;; ultrix*) @@ -249,7 +270,18 @@ AC_DEFUN(AC_LBL_CHECK_COMPILER_OPT, [ AC_MSG_CHECKING([whether the compiler supports the $2 option]) save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $ac_lbl_unknown_warning_option_error $2" + if expr "x$2" : "x-W.*" >/dev/null + then + CFLAGS="$CFLAGS $ac_lbl_unknown_warning_option_error $2" + elif expr "x$2" : "x-f.*" >/dev/null + then + CFLAGS="$CFLAGS -Werror $2" + elif expr "x$2" : "x-m.*" >/dev/null + then + CFLAGS="$CFLAGS -Werror $2" + else + CFLAGS="$CFLAGS $2" + fi AC_TRY_COMPILE( [], [return 0], @@ -629,82 +661,6 @@ AC_DEFUN(AC_LBL_FIXINCLUDES, fi fi]) -dnl -dnl Check for flex, default to lex -dnl Require flex 2.4 or higher -dnl Check for bison, default to yacc -dnl Default to lex/yacc if both flex and bison are not available -dnl -dnl If we're using flex and bison, pass -P to flex and -p to bison -dnl to define a prefix string for the lexer and parser -dnl -dnl If we're not using flex and bison, don't pass those options -dnl (as they might not work - although if "lex" is a wrapper for -dnl Flex and "yacc" is a wrapper for Bison, they will work), and -dnl define NEED_YYPARSE_WRAPPER (we *CANNOT* use YYBISON to check -dnl whether the wrapper is needed, as some people apparently, for -dnl some unknown reason, choose to use --without-flex and -dnl --without-bison on systems that have Flex and Bison, which -dnl means that the "yacc" they end up using is a wrapper that -dnl runs "bison -y", and at least some versions of Bison define -dnl YYBISON even if run with "-y", so we end up not compiling -dnl the yyparse wrapper and end up with a libpcap that doesn't -dnl define pcap_parse()) -dnl -dnl usage: -dnl -dnl AC_LBL_LEX_AND_YACC(lex, yacc, yyprefix) -dnl -dnl results: -dnl -dnl $1 (lex set) -dnl $2 (yacc appended) -dnl $3 (optional flex and bison -P prefix) -dnl -AC_DEFUN(AC_LBL_LEX_AND_YACC, - [AC_ARG_WITH(flex, [ --without-flex don't use flex]) - AC_ARG_WITH(bison, [ --without-bison don't use bison]) - if test "$with_flex" = no ; then - $1=lex - else - AC_CHECK_PROGS($1, flex, lex) - fi - if test "$$1" = flex ; then - # The -V flag was added in 2.4 - AC_MSG_CHECKING(for flex 2.4 or higher) - AC_CACHE_VAL(ac_cv_lbl_flex_v24, - if flex -V >/dev/null 2>&1; then - ac_cv_lbl_flex_v24=yes - else - ac_cv_lbl_flex_v24=no - fi) - AC_MSG_RESULT($ac_cv_lbl_flex_v24) - if test $ac_cv_lbl_flex_v24 = no ; then - s="2.4 or higher required" - AC_MSG_WARN(ignoring obsolete flex executable ($s)) - $1=lex - fi - fi - if test "$with_bison" = no ; then - $2=yacc - else - AC_CHECK_PROGS($2, bison, yacc) - fi - if test "$$2" = bison ; then - $2="$$2 -y" - fi - if test "$$1" != lex -a "$$2" = yacc -o "$$1" = lex -a "$$2" != yacc ; then - AC_MSG_WARN(don't have both flex and bison; reverting to lex/yacc) - $1=lex - $2=yacc - fi - if test "$$1" = flex -a -n "$3" ; then - $1="$$1 -P$3" - $2="$$2 -p $3" - else - AC_DEFINE(NEED_YYPARSE_WRAPPER,1,[if we need a pcap_parse wrapper around yyparse]) - fi]) - dnl dnl Checks to see if union wait is used with WEXITSTATUS() dnl @@ -970,8 +926,12 @@ AC_DEFUN(AC_LBL_DEVEL, if test "$ac_lbl_cc_dont_try_gcc_dashW" != yes; then AC_LBL_CHECK_UNKNOWN_WARNING_OPTION_ERROR() AC_LBL_CHECK_COMPILER_OPT($1, -Wall) + AC_LBL_CHECK_COMPILER_OPT($1, -Wsign-compare) AC_LBL_CHECK_COMPILER_OPT($1, -Wmissing-prototypes) AC_LBL_CHECK_COMPILER_OPT($1, -Wstrict-prototypes) + AC_LBL_CHECK_COMPILER_OPT($1, -Wshadow) + AC_LBL_CHECK_COMPILER_OPT($1, -Wdeclaration-after-statement) + AC_LBL_CHECK_COMPILER_OPT($1, -Wused-but-marked-unused) fi AC_LBL_CHECK_DEPENDENCY_GENERATION_OPT() # diff --git a/libpcap/bpf/net/bpf_filter.c b/libpcap/bpf/net/bpf_filter.c index ffe04ce35..01a1b64e7 100644 --- a/libpcap/bpf/net/bpf_filter.c +++ b/libpcap/bpf/net/bpf_filter.c @@ -42,11 +42,11 @@ #include "config.h" #endif -#ifdef WIN32 +#ifdef _WIN32 #include -#else /* WIN32 */ +#else /* _WIN32 */ #if HAVE_INTTYPES_H #include @@ -73,7 +73,7 @@ # define MLEN(m) ((m)->m_len) #endif /* defined(__hpux) || SOLARIS */ -#endif /* WIN32 */ +#endif /* _WIN32 */ #include @@ -99,7 +99,7 @@ #endif #ifndef LBL_ALIGN -#ifndef WIN32 +#ifndef _WIN32 #include #endif @@ -216,6 +216,8 @@ enum { * rejects the filter; it contains VLAN tag information * For the kernel, p is assumed to be a pointer to an mbuf if buflen is 0, * in all other cases, p is a pointer to a buffer and buflen is its size. + * + * Thanks to Ani Sinha for providing initial implementation */ u_int bpf_filter_with_aux_data(pc, p, wirelen, buflen, aux_data) @@ -577,7 +579,12 @@ bpf_filter_with_aux_data(pc, p, wirelen, buflen, aux_data) continue; case BPF_ALU|BPF_NEG: - A = -A; + /* + * Most BPF arithmetic is unsigned, but negation + * can't be unsigned; throw some casts to + * specify what we're trying to do. + */ + A = (u_int32)(-(int32)A); continue; case BPF_MISC|BPF_TAX: @@ -631,7 +638,7 @@ bpf_validate(f, len) return 0; #endif - for (i = 0; i < len; ++i) { + for (i = 0; i < (u_int)len; ++i) { p = &f[i]; switch (BPF_CLASS(p->code)) { /* @@ -732,7 +739,7 @@ bpf_validate(f, len) #if defined(KERNEL) || defined(_KERNEL) if (from + p->k < from || from + p->k >= len) #else - if (from + p->k >= len) + if (from + p->k >= (u_int)len) #endif return 0; break; @@ -740,7 +747,7 @@ bpf_validate(f, len) case BPF_JGT: case BPF_JGE: case BPF_JSET: - if (from + p->jt >= len || from + p->jf >= len) + if (from + p->jt >= (u_int)len || from + p->jf >= (u_int)len) return 0; break; default: diff --git a/libpcap/bpf_dump.c b/libpcap/bpf_dump.c index 5eaadc08a..d5ab61e5e 100644 --- a/libpcap/bpf_dump.c +++ b/libpcap/bpf_dump.c @@ -51,7 +51,10 @@ bpf_dump(const struct bpf_program *p, int option) for (i = 0; i < n; ++insn, ++i) { #ifdef BDEBUG extern int bids[]; - printf(bids[i] > 0 ? "[%02d]" : " -- ", bids[i] - 1); + if (bids[i] > 0) + printf("[%02d]", bids[i] - 1); + else + printf(" -- "); #endif puts(bpf_image(insn, i)); } diff --git a/libpcap/bpf_image.c b/libpcap/bpf_image.c index 3e9a23f51..01ec536df 100644 --- a/libpcap/bpf_image.c +++ b/libpcap/bpf_image.c @@ -23,9 +23,9 @@ #include "config.h" #endif -#ifdef WIN32 +#ifdef _WIN32 #include -#else /* WIN32 */ +#else /* _WIN32 */ #if HAVE_INTTYPES_H #include #elif HAVE_STDINT_H @@ -35,7 +35,7 @@ #include #endif #include -#endif /* WIN32 */ +#endif /* _WIN32 */ #include #include @@ -306,13 +306,13 @@ bpf_image(p, n) fmt = ""; break; } - (void)snprintf(operand, sizeof operand, fmt, v); + (void)pcap_snprintf(operand, sizeof operand, fmt, v); if (BPF_CLASS(p->code) == BPF_JMP && BPF_OP(p->code) != BPF_JA) { - (void)snprintf(image, sizeof image, + (void)pcap_snprintf(image, sizeof image, "(%03d) %-8s %-16s jt %d\tjf %d", n, op, operand, n + 1 + p->jt, n + 1 + p->jf); } else { - (void)snprintf(image, sizeof image, + (void)pcap_snprintf(image, sizeof image, "(%03d) %-8s %s", n, op, operand); } diff --git a/libpcap/cmake/preconfigure.cmake b/libpcap/cmake/preconfigure.cmake new file mode 100644 index 000000000..c8c92a48e --- /dev/null +++ b/libpcap/cmake/preconfigure.cmake @@ -0,0 +1,55 @@ +if( NOT LIBPCAP_PRECONFIGURED ) + set( LIBPCAP_PRECONFIGURED TRUE ) + + ################################################################### + # Parameters + ################################################################### + + option (USE_STATIC_RT "Use static Runtime" ON) + + ###################################### + # Project setings + ###################################### + + add_definitions( -DBUILDING_PCAP ) + + if( MSVC ) + add_definitions( -D__STDC__ ) + add_definitions( -D_CRT_SECURE_NO_WARNINGS ) + add_definitions( "-D_U_=" ) + elseif( CMAKE_COMPILER_IS_GNUCXX ) + add_definitions( "-D_U_=__attribute__((unused))" ) + else(MSVC) + add_definitions( "-D_U_=" ) + endif( MSVC ) + + if (USE_STATIC_RT) + MESSAGE( STATUS "Use STATIC runtime" ) + + if( MSVC ) + set (CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} /MT") + set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /MT") + set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT") + set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd") + + set (CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} /MT") + set (CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} /MT") + set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MT") + set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /MTd") + endif( MSVC ) + else (USE_STATIC_RT) + MESSAGE( STATUS "Use DYNAMIC runtime" ) + + if( MSVC ) + set (CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} /MD") + set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /MD") + set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD") + set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd") + + set (CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} /MD") + set (CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} /MD") + set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MD") + set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /MDd") + endif( MSVC ) + endif (USE_STATIC_RT) +endif( NOT LIBPCAP_PRECONFIGURED ) diff --git a/libpcap/cmakeconfig.h.in b/libpcap/cmakeconfig.h.in new file mode 100644 index 000000000..94edb5f44 --- /dev/null +++ b/libpcap/cmakeconfig.h.in @@ -0,0 +1,345 @@ +/* cmakeconfig.h.in */ + +/* Enable optimizer debugging */ +#cmakedefine BDEBUG 1 + +/* define if you have a cloning BPF device */ +#cmakedefine HAVE_CLONING_BPF 1 + +/* define if you have the DAG API */ +#cmakedefine HAVE_DAG_API 1 + +/* define if you have dag_get_erf_types() */ +#cmakedefine HAVE_DAG_GET_ERF_TYPES 1 + +/* define if you have dag_get_stream_erf_types() */ +#cmakedefine HAVE_DAG_GET_STREAM_ERF_TYPES 1 + +/* define if you have streams capable DAG API */ +#cmakedefine HAVE_DAG_STREAMS_API 1 + +/* define if you have vdag_set_device_info() */ +#cmakedefine HAVE_DAG_VDAG 1 + +/* Define to 1 if you have the declaration of `ether_hostton', and to 0 if you + don't. */ +#cmakedefine HAVE_DECL_ETHER_HOSTTON 1 + +/* define if you have a /dev/dlpi */ +#cmakedefine HAVE_DEV_DLPI 1 + +/* if passive_req_t primitive exists */ +#cmakedefine HAVE_DLPI_PASSIVE 1 + +/* Define to 1 if you have the `ether_hostton' function. */ +#cmakedefine HAVE_ETHER_HOSTTON 1 + +/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */ +#cmakedefine HAVE_FSEEKO 1 + +/* on HP-UX 10.20 or later */ +#cmakedefine HAVE_HPUX10_20_OR_LATER 1 + +/* on HP-UX 9.x */ +#cmakedefine HAVE_HPUX9 1 + +/* if ppa_info_t_dl_module_id exists */ +#cmakedefine HAVE_HP_PPA_INFO_T_DL_MODULE_ID_1 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_INTTYPES_H 1 + +/* if libdlpi exists */ +#cmakedefine HAVE_LIBDLPI 1 + +/* if libnl exists */ +#cmakedefine HAVE_LIBNL 1 + +/* if libnl exists and is version 2.x */ +#cmakedefine HAVE_LIBNL_2_x 1 + +/* if libnl exists and is version 3.x */ +#cmakedefine HAVE_LIBNL_3_x 1 + +/* libnl has NLE_FAILURE */ +#cmakedefine HAVE_LIBNL_NLE 1 + +/* libnl has new-style socket api */ +#cmakedefine HAVE_LIBNL_SOCKETS 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_LIMITS_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_LINUX_COMPILER_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_LINUX_ETHTOOL_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_LINUX_IF_BONDING_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_LINUX_IF_PACKET_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_LINUX_NET_TSTAMP_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_LINUX_SOCKIOS_H 1 + +/* if tp_vlan_tci exists */ +#cmakedefine HAVE_LINUX_TPACKET_AUXDATA_TP_VLAN_TCI 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_LINUX_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_LINUX_USBDEVICE_FS_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_LINUX_WIRELESS_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_MEMORY_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_NETINET_ETHER_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_NETINET_IF_ETHER_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_NETPACKET_IF_PACKET_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_NETPACKET_PACKET_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_NET_IF_MEDIA_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_NET_PFVAR_H 1 + +/* if there's an os_proto.h for this platform, to use additional prototypes */ +#cmakedefine HAVE_OS_PROTO_H 1 + +/* Define to 1 if remote packet capture is to be supported */ +#cmakedefine HAVE_REMOTE 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_PATHS_H 1 + +/* define if net/pfvar.h defines PF_NAT through PF_NORDR */ +#cmakedefine HAVE_PF_NAT_THROUGH_PF_NORDR 1 + +/* define if you have the Septel API */ +#cmakedefine HAVE_SEPTEL_API 1 + +/* define if you have the Myricom SNF API */ +#cmakedefine HAVE_SNF_API 1 + +/* Define to 1 if you have the `snprintf' function. */ +#cmakedefine HAVE_SNPRINTF 1 + +/* if struct sockaddr has the sa_len member */ +#cmakedefine HAVE_SOCKADDR_SA_LEN 1 + +/* if struct sockaddr_storage exists */ +#cmakedefine HAVE_SOCKADDR_STORAGE 1 + +/* define if socklen_t is defined */ +#cmakedefine HAVE_SOCKLEN_T 1 + +/* On solaris */ +#cmakedefine HAVE_SOLARIS 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strerror' function. */ +#cmakedefine HAVE_STRERROR 1 + +/* Define to 1 if you have the `strlcpy' function. */ +#cmakedefine HAVE_STRLCPY 1 + +/* Define to 1 if the system has the type `struct BPF_TIMEVAL'. */ +#cmakedefine HAVE_STRUCT_BPF_TIMEVAL 1 + +/* Define to 1 if the system has the type `struct ether_addr'. */ +#cmakedefine HAVE_STRUCT_ETHER_ADDR 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_BITYPES_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_BUFMOD_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_DLPI_EXT_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_IOCCOM_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_SOCKIO_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_TYPES_H 1 + +/* define if you have the TurboCap API */ +#cmakedefine HAVE_TC_API 1 + +/* if if_packet.h has tpacket_stats defined */ +#cmakedefine HAVE_TPACKET_STATS 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_UNISTD_H 1 + +/* if struct usbdevfs_ctrltransfer has bRequestType */ +#cmakedefine HAVE_USBDEVFS_CTRLTRANSFER_BREQUESTTYPE 1 + +/* Define to 1 if you have the `vsnprintf' function. */ +#cmakedefine HAVE_VSNPRINTF 1 + +/* Define to 1 if you have the `PacketIsLoopbackAdapter' function. */ +#cmakedefine HAVE_PACKET_IS_LOOPBACK_ADAPTER 1 + +/* define if the system supports zerocopy BPF */ +#cmakedefine HAVE_ZEROCOPY_BPF 1 + +/* define if your compiler has __attribute__ */ +#cmakedefine HAVE___ATTRIBUTE__ 1 + +/* IPv6 */ +#cmakedefine INET6 1 + +/* if unaligned access fails */ +#cmakedefine LBL_ALIGN 1 + +/* path for device for USB sniffing */ +#cmakedefine LINUX_USB_MON_DEV 1 + +/* if we need a pcap_parse wrapper around yyparse */ +#cmakedefine NEED_YYPARSE_WRAPPER 1 + +/* Define to 1 if netinet/ether.h declares `ether_hostton' */ +#cmakedefine NETINET_ETHER_H_DECLARES_ETHER_HOSTTON 1 + +/* Define to 1 if netinet/if_ether.h declares `ether_hostton' */ +#cmakedefine NETINET_IF_ETHER_H_DECLARES_ETHER_HOSTTON 1 + +/* do not use protochain */ +#cmakedefine NO_PROTOCHAIN 1 + +/* Define to the address where bug reports for this package should be sent. */ +#cmakedefine PACKAGE_BUGREPORT 1 + +/* Define to the full name of this package. */ +#cmakedefine PACKAGE_NAME 1 + +/* Define to the full name and version of this package. */ +#cmakedefine PACKAGE_STRING 1 + +/* Define to the one symbol short name of this package. */ +#cmakedefine PACKAGE_TARNAME 1 + +/* Define to the home page for this package. */ +#cmakedefine PACKAGE_URL 1 + +/* Define to the version of this package. */ +#cmakedefine PACKAGE_VERSION 1 + +/* /dev/dlpi directory */ +#cmakedefine PCAP_DEV_PREFIX 1 + +/* target host supports Bluetooth sniffing */ +#cmakedefine PCAP_SUPPORT_BT 1 + +/* target host supports Bluetooth Monitor */ +#cmakedefine PCAP_SUPPORT_BT_MONITOR 1 + +/* support D-Bus sniffing */ +#cmakedefine PCAP_SUPPORT_DBUS 1 + +/* target host supports netfilter sniffing */ +#cmakedefine PCAP_SUPPORT_NETFILTER 1 + +/* use Linux packet ring capture if available */ +#cmakedefine PCAP_SUPPORT_PACKET_RING 1 + +/* target host supports USB sniffing */ +#cmakedefine PCAP_SUPPORT_USB 1 + +/* include ACN support */ +#cmakedefine SITA 1 + +/* if struct sockaddr_hci has hci_channel member */ +#cmakedefine SOCKADDR_HCI_HAS_HCI_CHANNEL 1 + +/* Define to 1 if you have the ANSI C header files. */ +#cmakedefine STDC_HEADERS 1 + +/* Enable parser debugging */ +#cmakedefine YYDEBUG 1 + +/* Enable large inode numbers on Mac OS X 10.5. */ +#ifndef _DARWIN_USE_64_BIT_INODE +# define _DARWIN_USE_64_BIT_INODE 1 +#endif + +/* Number of bits in a file offset, on hosts where this is settable. */ +#cmakedefine _FILE_OFFSET_BITS 1 + +/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ +#cmakedefine _LARGEFILE_SOURCE 1 + +/* Define for large files, on AIX-style hosts. */ +#cmakedefine _LARGE_FILES 1 + +/* define on AIX to get certain functions */ +#cmakedefine _SUN 1 + +/* define if your compiler allows __attribute__((format)) without a warning */ +#cmakedefine __ATTRIBUTE___FORMAT_OK 1 + +#if 0 +/* to handle Ultrix compilers that don't support const in prototypes */ +#cmakedefine const 1 + +/* Define as token for inline if inlining supported */ +#cmakedefine inline 1 + +/* Define to `short' if int16_t not defined. */ +#cmakedefine int16_t 1 + +/* Define to `int' if int32_t not defined. */ +#cmakedefine int32_t 1 + +/* Define to `long long' if int64_t not defined. */ +#cmakedefine int64_t 1 + +/* Define to `signed char' if int8_t not defined. */ +#cmakedefine int8_t 1 + +/* on sinix */ +#cmakedefine sinix 1 + +/* Define to `unsigned short' if u_int16_t not defined. */ +#cmakedefine u_int16_t 1 + +/* Define to `unsigned int' if u_int32_t not defined. */ +#cmakedefine u_int32_t 1 + +/* Define to `unsigned long long' if u_int64_t not defined. */ +#cmakedefine u_int64_t 1 + +/* Define to `unsigned char' if u_int8_t not defined. */ +#cmakedefine u_int8_t 1 +#endif diff --git a/libpcap/config.h.in b/libpcap/config.h.in index 3b9f90a48..e85b2a3f5 100644 --- a/libpcap/config.h.in +++ b/libpcap/config.h.in @@ -1,4 +1,4 @@ -/* config.h.in. Generated from configure.in by autoheader. */ +/* config.h.in. Generated from configure.ac by autoheader. */ /* Enable optimizer debugging */ #undef BDEBUG @@ -124,16 +124,13 @@ /* if there's an os_proto.h for this platform, to use additional prototypes */ #undef HAVE_OS_PROTO_H -/* Define to 1 if you have the header file. */ -#undef HAVE_PATHS_H - /* define if net/pfvar.h defines PF_NAT through PF_NORDR */ #undef HAVE_PF_NAT_THROUGH_PF_NORDR -/* define if you have a Septel API */ +/* define if you have the Septel API */ #undef HAVE_SEPTEL_API -/* define if you have Myricom SNF API */ +/* define if you have the Myricom SNF API */ #undef HAVE_SNF_API /* Define to 1 if you have the `snprintf' function. */ @@ -169,6 +166,9 @@ /* Define to 1 if you have the `strlcpy' function. */ #undef HAVE_STRLCPY +/* Define to 1 if you have the `strtok_r' function. */ +#undef HAVE_STRTOK_R + /* Define to 1 if the system has the type `struct BPF_TIMEVAL'. */ #undef HAVE_STRUCT_BPF_TIMEVAL @@ -187,6 +187,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SYS_IOCCOM_H +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SELECT_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKIO_H @@ -196,6 +199,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H +/* define if you have the TurboCap API */ +#undef HAVE_TC_API + /* if if_packet.h has tpacket_stats defined */ #undef HAVE_TPACKET_STATS @@ -205,9 +211,6 @@ /* if struct usbdevfs_ctrltransfer has bRequestType */ #undef HAVE_USBDEVFS_CTRLTRANSFER_BREQUESTTYPE -/* define if version.h is generated in the build procedure */ -#undef HAVE_VERSION_H - /* Define to 1 if you have the `vsnprintf' function. */ #undef HAVE_VSNPRINTF @@ -226,9 +229,6 @@ /* path for device for USB sniffing */ #undef LINUX_USB_MON_DEV -/* if we need a pcap_parse wrapper around yyparse */ -#undef NEED_YYPARSE_WRAPPER - /* Define to 1 if netinet/ether.h declares `ether_hostton' */ #undef NETINET_ETHER_H_DECLARES_ETHER_HOSTTON @@ -265,12 +265,6 @@ /* target host supports Bluetooth Monitor */ #undef PCAP_SUPPORT_BT_MONITOR -/* target host supports CAN sniffing */ -#undef PCAP_SUPPORT_CAN - -/* target host supports canusb */ -#undef PCAP_SUPPORT_CANUSB - /* support D-Bus sniffing */ #undef PCAP_SUPPORT_DBUS @@ -295,6 +289,10 @@ /* Enable parser debugging */ #undef YYDEBUG +/* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a + `char[]'. */ +#undef YYTEXT_POINTER + /* Enable large inode numbers on Mac OS X 10.5. */ #ifndef _DARWIN_USE_64_BIT_INODE # define _DARWIN_USE_64_BIT_INODE 1 diff --git a/libpcap/config/have_siocglifconf.c b/libpcap/config/have_siocglifconf.c new file mode 100644 index 000000000..5a67abc19 --- /dev/null +++ b/libpcap/config/have_siocglifconf.c @@ -0,0 +1,6 @@ +#include +#include +#include +int main() { + ioctl(0, SIOCGLIFCONF, (char *)0); +} diff --git a/libpcap/configure b/libpcap/configure index 91fa6762a..4c64875e3 100755 --- a/libpcap/configure +++ b/libpcap/configure @@ -627,10 +627,6 @@ PCAP_SUPPORT_PACKET_RING DBUS_SRC PCAP_SUPPORT_DBUS PKGCONFIG -CAN_SRC -PCAP_SUPPORT_CAN -CANUSB_SRC -PCAP_SUPPORT_CANUSB BT_MONITOR_SRC BT_SRC PCAP_SUPPORT_BT @@ -644,11 +640,13 @@ DYEXT SSRC ADDLARCHIVEOBJS ADDLOBJS +V_YACC V_RPATH_OPT V_SONAME_OPT V_SHLIB_OPT V_SHLIB_CMD V_PCAP +V_LEX V_INCLS V_FINDALLDEVS V_DEFS @@ -658,7 +656,13 @@ DEPENDENCY_CFLAG LN_S AR RANLIB +YFLAGS +YACC +LEXLIB +LEX_OUTPUT_ROOT +LEX HAVE_LINUX_TPACKET_AUXDATA +VALGRINDTEST LIBOBJS EGREP GREP @@ -740,12 +744,11 @@ with_septel with_snf with_snf_includes with_snf_libraries +with_turbocap enable_universal enable_shared enable_usb enable_bluetooth -enable_canusb -enable_can enable_dbus enable_packet_ring ' @@ -757,7 +760,9 @@ CFLAGS LDFLAGS LIBS CPPFLAGS -CPP' +CPP +YACC +YFLAGS' # Initialize some variables set by options. @@ -1377,13 +1382,14 @@ Optional Features: --enable-optimizer-dbg build optimizer debugging code --enable-yydebug build parser debugging code --disable-universal don't build universal on OS X - --enable-shared build shared libraries [default=no] + --enable-shared build shared libraries [default=yes, if support + available] --enable-usb enable nusb support [default=yes, if support available] - --enable-bluetooth enable Bluetooth support [default=no] - --enable-canusb enable canusb support [default=no] - --enable-can enable CAN support [default=no] - --enable-dbus enable D-Bus capture support [default=no] + --enable-bluetooth enable Bluetooth support [default=yes, if support + available] + --enable-dbus enable D-Bus capture support [default=yes, if + support available] --enable-packet-ring enable Linux packet ring support [default=yes] Optional Packages: @@ -1392,19 +1398,25 @@ Optional Packages: --without-gcc don't use gcc --with-sita include SITA support --with-pcap=TYPE use packet capture TYPE - --without-libnl disable libnl support [default=disabled] - --with-dag[=DIR] include Endace DAG support ["yes", "no" or DIR; - default="yes" on BSD and Linux if present] - --with-dag-includes=DIR Endace DAG include directory - --with-dag-libraries=DIR - Endace DAG library directory + --without-libnl disable libnl support [default=yes, on Linux, if + present] + --with-dag[=DIR] include Endace DAG support (located in directory + DIR, if supplied). [default=yes, if present] + --with-dag-includes=IDIR + Endace DAG include directory, if not DIR/include + --with-dag-libraries=LDIR + Endace DAG library directory, if not DIR/lib --with-septel[=DIR] include Septel support (located in directory DIR, if - supplied). [default=yes, on Linux, if present] - --with-snf[=DIR] include Myricom SNF support ["yes", "no" or DIR; - default="yes" on BSD and Linux if present] - --with-snf-includes=DIR Myricom SNF include directory - --with-snf-libraries=DIR - Myricom SNF library directory + supplied). [default=yes, if present] + --with-snf[=DIR] include Myricom SNF support (located in directory + DIR, if supplied). [default=yes, if present] + --with-snf-includes=IDIR + Myricom SNF include directory, if not DIR/include + --with-snf-libraries=LDIR + Myricom SNF library directory, if not DIR/lib + --with-turbocap[=DIR] include Riverbed TurboCap support (located in + directory DIR, if supplied). [default=yes, if + present] Some influential environment variables: CC C compiler command @@ -1415,6 +1427,12 @@ Some influential environment variables: CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor + YACC The `Yet Another Compiler Compiler' implementation to use. + Defaults to the first program found out of: `bison -y', `byacc', + `yacc'. + YFLAGS The list of arguments that will be passed by default to $YACC. + This script will default YFLAGS to the empty string to avoid a + default value of `-d' given by some make applications. Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. @@ -3302,11 +3320,61 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu + if test "$GCC" = yes ; then # # -Werror forces warnings to be errors. # ac_lbl_cc_force_warning_errors=-Werror + + # + # Try to have the compiler default to hiding symbols, + # so that only symbols explicitly exported with + # PCAP_API will be visible outside (shared) libraries. + # + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports the -fvisibility=hidden option" >&5 +$as_echo_n "checking whether the compiler supports the -fvisibility=hidden option... " >&6; } + save_CFLAGS="$CFLAGS" + if expr "x-fvisibility=hidden" : "x-W.*" >/dev/null + then + CFLAGS="$CFLAGS $ac_lbl_unknown_warning_option_error -fvisibility=hidden" + elif expr "x-fvisibility=hidden" : "x-f.*" >/dev/null + then + CFLAGS="$CFLAGS -Werror -fvisibility=hidden" + elif expr "x-fvisibility=hidden" : "x-m.*" >/dev/null + then + CFLAGS="$CFLAGS -Werror -fvisibility=hidden" + else + CFLAGS="$CFLAGS -fvisibility=hidden" + fi + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0 + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + CFLAGS="$save_CFLAGS" + V_CCOPT="$V_CCOPT -fvisibility=hidden" + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + CFLAGS="$save_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + else V_INCLS="$V_INCLS -I/usr/local/include" LDFLAGS="$LDFLAGS -L/usr/local/lib" @@ -3319,6 +3387,55 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu # of which use -Werror to force warnings to be errors. # ac_lbl_cc_force_warning_errors=-Werror + + # + # Try to have the compiler default to hiding symbols, + # so that only symbols explicitly exported with + # PCAP_API will be visible outside (shared) libraries. + # + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports the -fvisibility=hidden option" >&5 +$as_echo_n "checking whether the compiler supports the -fvisibility=hidden option... " >&6; } + save_CFLAGS="$CFLAGS" + if expr "x-fvisibility=hidden" : "x-W.*" >/dev/null + then + CFLAGS="$CFLAGS $ac_lbl_unknown_warning_option_error -fvisibility=hidden" + elif expr "x-fvisibility=hidden" : "x-f.*" >/dev/null + then + CFLAGS="$CFLAGS -Werror -fvisibility=hidden" + elif expr "x-fvisibility=hidden" : "x-m.*" >/dev/null + then + CFLAGS="$CFLAGS -Werror -fvisibility=hidden" + else + CFLAGS="$CFLAGS -fvisibility=hidden" + fi + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0 + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + CFLAGS="$save_CFLAGS" + V_CCOPT="$V_CCOPT -fvisibility=hidden" + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + CFLAGS="$save_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ;; hpux*) @@ -3393,6 +3510,55 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu # warnings to be treated as errors. # ac_lbl_cc_force_warning_errors=-errwarn + + # + # Try to have the compiler default to hiding symbols, + # so that only symbols explicitly exported with + # PCAP_API will be visible outside (shared) libraries. + # + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports the -xldscope=hidden option" >&5 +$as_echo_n "checking whether the compiler supports the -xldscope=hidden option... " >&6; } + save_CFLAGS="$CFLAGS" + if expr "x-xldscope=hidden" : "x-W.*" >/dev/null + then + CFLAGS="$CFLAGS $ac_lbl_unknown_warning_option_error -xldscope=hidden" + elif expr "x-xldscope=hidden" : "x-f.*" >/dev/null + then + CFLAGS="$CFLAGS -Werror -xldscope=hidden" + elif expr "x-xldscope=hidden" : "x-m.*" >/dev/null + then + CFLAGS="$CFLAGS -Werror -xldscope=hidden" + else + CFLAGS="$CFLAGS -xldscope=hidden" + fi + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0 + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + CFLAGS="$save_CFLAGS" + V_CCOPT="$V_CCOPT -xldscope=hidden" + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + CFLAGS="$save_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ;; ultrix*) @@ -3401,8 +3567,7 @@ $as_echo_n "checking that Ultrix $CC hacks const in prototypes... " >&6; } if ${ac_cv_lbl_cc_const_proto+:} false; then : $as_echo_n "(cached) " >&6 else - -cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int @@ -4322,7 +4487,7 @@ else We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; @@ -4368,7 +4533,7 @@ else We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; @@ -4392,7 +4557,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; @@ -4437,7 +4602,7 @@ else We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; @@ -4461,7 +4626,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; @@ -4566,7 +4731,7 @@ $as_echo "#define HAVE_FSEEKO 1" >>confdefs.h fi -for ac_header in sys/ioccom.h sys/sockio.h limits.h paths.h +for ac_header in sys/ioccom.h sys/select.h sys/sockio.h limits.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" @@ -4699,7 +4864,7 @@ done fi case "$host_os" in -linux*) +linux*|uclinux*) for ac_header in linux/sockios.h linux/if_bonding.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` @@ -4803,6 +4968,29 @@ esac fi +needstrtok_r=no +for ac_func in strtok_r +do : + ac_fn_c_check_func "$LINENO" "strtok_r" "ac_cv_func_strtok_r" +if test "x$ac_cv_func_strtok_r" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STRTOK_R 1 +_ACEOF + +else + needstrtok_r=yes +fi +done + +if test $needstrtok_r = yes; then + case " $LIBOBJS " in + *" strtok_r.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strtok_r.$ac_objext" + ;; +esac + +fi + # # Do this before checking for ether_hostton(), as it's a # "gethostbyname() -ish function". @@ -5219,6 +5407,13 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${enable_protochain}" >&5 $as_echo "${enable_protochain}" >&6; } +# +# valgrindtest directly uses the native capture mechanism, but +# only tests with BPF and PF_PACKET sockets; only enable it if +# we have BPF or PF_PACKET sockets. +# +VALGRINDTEST= + # # SITA support is mutually exclusive with native capture support; # "--with-sita" selects SITA support. @@ -5234,7 +5429,6 @@ $as_echo "#define SITA 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: Enabling SITA ACN support" >&5 $as_echo "$as_me: Enabling SITA ACN support" >&6;} V_PCAP=sita - V_FINDALLDEVS=sita fi else @@ -5260,8 +5454,18 @@ elif test -r /dev/bpf -o -h /dev/bpf ; then $as_echo "#define HAVE_CLONING_BPF 1" >>confdefs.h + + # + # We have BPF, so build valgrindtest with "make test". + # + VALGRINDTEST=valgrindtest elif test -r /dev/bpf0 ; then V_PCAP=bpf + + # + # We have BPF, so build valgrindtest with "make test". + # + VALGRINDTEST=valgrindtest elif test -r /usr/include/net/pfilt.h ; then V_PCAP=pf elif test -r /dev/enet ; then @@ -5272,6 +5476,12 @@ elif test -r /usr/include/sys/net/nit.h ; then V_PCAP=nit elif test -r /usr/include/linux/socket.h ; then V_PCAP=linux + + # + # XXX - this won't work with older kernels that have SOCK_PACKET + # sockets but not PF_PACKET sockets. + # + VALGRINDTEST=valgrindtest elif test -r /usr/include/net/raw.h ; then V_PCAP=snoop elif test -r /usr/include/odmi.h ; then @@ -5283,6 +5493,11 @@ elif test -r /usr/include/odmi.h ; then V_PCAP=bpf elif test -c /dev/bpf0 ; then # check again in case not readable V_PCAP=bpf + + # + # We have BPF, so build valgrindtest with "make test". + # + VALGRINDTEST=valgrindtest elif test -r /usr/include/sys/dlpi.h ; then V_PCAP=dlpi elif test -c /dev/enet ; then # check again in case not readable @@ -5295,6 +5510,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $V_PCAP" >&5 $as_echo "$V_PCAP" >&6; } + # # Do capture-mechanism-dependent tests. # @@ -5525,7 +5741,7 @@ if test "${with_libnl+set}" = set; then : fi - if test x$with_libnl = xyes ; then + if test x$with_libnl != xno ; then have_any_nl="no" incdir=-I/usr/include/libnl3 @@ -5883,15 +6099,30 @@ fi ;; dag) + # + # --with-pcap=dag is the only way to get here, and it means + # "DAG support but nothing else" + # V_DEFS="$V_DEFS -DDAG_ONLY" + xxx_only=yes ;; septel) + # + # --with-pcap=septel is the only way to get here, and it means + # "Septel support but nothing else" + # V_DEFS="$V_DEFS -DSEPTEL_ONLY" + xxx_only=yes ;; snf) + # + # --with-pcap=snf is the only way to get here, and it means + # "SNF support but nothing else" + # V_DEFS="$V_DEFS -DSNF_ONLY" + xxx_only=yes ;; null) @@ -5902,14 +6133,8 @@ $as_echo "$as_me: WARNING: (see the INSTALL doc for more info)" >&2;} ;; esac -if test "$V_PCAP" = null +if test "$V_PCAP" != null then - # - # We can't capture, so we can't open any capture - # devices, so we won't return any interfaces. - # - V_FINDALLDEVS=null -else ac_fn_c_check_func "$LINENO" "getifaddrs" "ac_cv_func_getifaddrs" if test "x$ac_cv_func_getifaddrs" = xyes; then : @@ -5924,7 +6149,7 @@ if test "x$ac_cv_header_ifaddrs_h" = xyes; then : # We have the header, so we use "getifaddrs()" to # get the list of interfaces. # - V_FINDALLDEVS=getad + V_FINDALLDEVS=fad-getad.c else @@ -5992,9 +6217,9 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lbl_have_siocglifconf" >&5 $as_echo "$ac_cv_lbl_have_siocglifconf" >&6; } if test $ac_cv_lbl_have_siocglifconf = yes ; then - V_FINDALLDEVS=glifc + V_FINDALLDEVS=fad-glifc.c else - V_FINDALLDEVS=gifc + V_FINDALLDEVS=fad-gifc.c fi ;; @@ -6005,7 +6230,7 @@ $as_echo "$ac_cv_lbl_have_siocglifconf" >&6; } # another mechanism, and we should be using that # instead.) # - V_FINDALLDEVS=gifc + V_FINDALLDEVS=fad-gifc.c ;; esac fi @@ -6124,10 +6349,20 @@ if test "${with_dag+set}" = set; then : else - # - # Use DAG API if present, otherwise don't - # - want_dag=ifpresent + if test "$V_PCAP" = dag; then + # User requested DAG-only libpcap, so we'd better have + # the DAG API. + want_dag=yes + elif test "xxx_only" = yes; then + # User requested something-else-only pcap, so they don't + # want DAG support. + want_dag=no + else + # + # Use DAG API if present, otherwise don't + # + want_dag=ifpresent + fi fi @@ -6154,28 +6389,6 @@ if test "${with_dag_libraries+set}" = set; then : fi -case "$V_PCAP" in -linux|bpf|dag) - # - # We support the DAG API if we're on Linux or BSD, or if we're - # building a DAG-only libpcap. - # - ;; -*) - # - # If the user explicitly requested DAG, tell them it's not - # supported. - # - # If they expressed no preference, don't include it. - # - if test $want_dag = yes; then - as_fn_error $? "DAG support is only available with 'linux' 'bpf' and 'dag' packet capture types" "$LINENO" 5 - elif test $want_dag = yes; then - want_dag=no - fi - ;; -esac - ac_cv_lbl_dag_api=no if test "$want_dag" != no; then @@ -6184,7 +6397,7 @@ $as_echo_n "checking whether we have DAG API headers... " >&6; } # If necessary, set default paths for DAG API headers and libraries. if test -z "$dag_root"; then - dag_root=/usr/local + dag_root=/usr/local fi if test -z "$dag_include_dir"; then @@ -6192,33 +6405,33 @@ $as_echo_n "checking whether we have DAG API headers... " >&6; } fi if test -z "$dag_lib_dir"; then - dag_lib_dir="$dag_root/lib" + dag_lib_dir="$dag_root/lib" fi if test -z "$dag_tools_dir"; then - dag_tools_dir="$dag_root/tools" + dag_tools_dir="$dag_root/tools" fi if test -r $dag_include_dir/dagapi.h; then ac_cv_lbl_dag_api=yes fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lbl_dag_api ($dag_include_dir)" >&5 -$as_echo "$ac_cv_lbl_dag_api ($dag_include_dir)" >&6; } -fi -if test $ac_cv_lbl_dag_api = yes; then - V_INCLS="$V_INCLS -I$dag_include_dir" + if test "$ac_cv_lbl_dag_api" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes ($dag_include_dir)" >&5 +$as_echo "yes ($dag_include_dir)" >&6; } - if test $V_PCAP != dag ; then - SSRC="pcap-dag.c" - fi + V_INCLS="$V_INCLS -I$dag_include_dir" - # See if we can find a general version string. - # Don't need to save and restore LIBS to prevent -ldag being - # included if there's a found-action (arg 3). - saved_ldflags=$LDFLAGS - LDFLAGS="-L$dag_lib_dir" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dag_attach_stream in -ldag" >&5 + if test $V_PCAP != dag ; then + SSRC="$SSRC pcap-dag.c" + fi + + # See if we can find a general version string. + # Don't need to save and restore LIBS to prevent -ldag being + # included if there's a found-action (arg 3). + saved_ldflags=$LDFLAGS + LDFLAGS="-L$dag_lib_dir" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dag_attach_stream in -ldag" >&5 $as_echo_n "checking for dag_attach_stream in -ldag... " >&6; } if ${ac_cv_lib_dag_dag_attach_stream+:} false; then : $as_echo_n "(cached) " >&6 @@ -6260,7 +6473,7 @@ else dag_streams="0" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dag_get_erf_types in -ldag" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dag_get_erf_types in -ldag" >&5 $as_echo_n "checking for dag_get_erf_types in -ldag... " >&6; } if ${ac_cv_lib_dag_dag_get_erf_types+:} false; then : $as_echo_n "(cached) " >&6 @@ -6303,7 +6516,7 @@ $as_echo "#define HAVE_DAG_GET_ERF_TYPES 1" >>confdefs.h fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dag_get_stream_erf_types in -ldag" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dag_get_stream_erf_types in -ldag" >&5 $as_echo_n "checking for dag_get_stream_erf_types in -ldag... " >&6; } if ${ac_cv_lib_dag_dag_get_stream_erf_types+:} false; then : $as_echo_n "(cached) " >&6 @@ -6347,16 +6560,16 @@ $as_echo "#define HAVE_DAG_GET_STREAM_ERF_TYPES 1" >>confdefs.h fi - LDFLAGS=$saved_ldflags + LDFLAGS=$saved_ldflags - if test "$dag_streams" = 1; then + if test "$dag_streams" = 1; then $as_echo "#define HAVE_DAG_STREAMS_API 1" >>confdefs.h - LIBS="$LIBS -ldag" - LDFLAGS="$LDFLAGS -L$dag_lib_dir" + LIBS="$LIBS -ldag" + LDFLAGS="$LDFLAGS -L$dag_lib_dir" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for vdag_set_device_info in -lvdag" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for vdag_set_device_info in -lvdag" >&5 $as_echo_n "checking for vdag_set_device_info in -lvdag... " >&6; } if ${ac_cv_lib_vdag_vdag_set_device_info+:} false; then : $as_echo_n "(cached) " >&6 @@ -6398,38 +6611,32 @@ else ac_dag_have_vdag="0" fi - if test "$ac_dag_have_vdag" = 1; then + if test "$ac_dag_have_vdag" = 1; then $as_echo "#define HAVE_DAG_VDAG 1" >>confdefs.h - LIBS="$LIBS -lpthread" + LIBS="$LIBS -lpthread" + fi fi - fi $as_echo "#define HAVE_DAG_API 1" >>confdefs.h -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we have the DAG API" >&5 -$as_echo_n "checking whether we have the DAG API... " >&6; } - -if test $ac_cv_lbl_dag_api = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } - if test "$want_dag" = yes; then - # User wanted DAG support but we couldn't find it. - as_fn_error $? "DAG API requested, but not found at $dag_root: use --without-dag" "$LINENO" 5 - fi - if test "$V_PCAP" = dag; then - # User requested "dag" capture type but the DAG API wasn't - # found. - as_fn_error $? "Specifying the capture type as \"dag\" requires the DAG API to be present; use the --with-dag options to specify the location. (Try \"./configure --help\" for more information.)" "$LINENO" 5 + if test "$V_PCAP" = dag; then + # User requested "dag" capture type but we couldn't + # find the DAG API support. + as_fn_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" "$LINENO" 5 + fi + + if test "$want_dag" = yes; then + # User wanted DAG support but we couldn't find it. + as_fn_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" "$LINENO" 5 + fi fi -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } fi @@ -6450,41 +6657,31 @@ if test "${with_septel+set}" = set; then : else - # - # Use Septel API if present, otherwise don't - # - want_septel=ifpresent - septel_root=./../septel + if test "$V_PCAP" = septel; then + # User requested Septel-only libpcap, so we'd better have + # the Septel API. + want_septel=yes + elif test "xxx_only" = yes; then + # User requested something-else-only pcap, so they don't + # want Septel support. + want_septel=no + else + # + # Use Septel API if present, otherwise don't + # + want_septel=ifpresent + fi fi + ac_cv_lbl_septel_api=no -case "$V_PCAP" in -linux|septel) - # - # We support the Septel API if we're on Linux, or if we're building - # a Septel-only libpcap. - # - ;; -*) - # - # If the user explicitly requested Septel, tell them it's not - # supported. - # - # If they expressed no preference, don't include it. - # - if test $want_septel = yes; then - as_fn_error $? "Septel support only available with 'linux' and 'septel' packet capture types" "$LINENO" 5 - elif test $want_septel = yes; then - want_septel=no - fi - ;; -esac - if test "$with_septel" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we have Septel API" >&5 -$as_echo_n "checking whether we have Septel API... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we have Septel API headers" >&5 +$as_echo_n "checking whether we have Septel API headers... " >&6; } + + # If necessary, set default paths for Septel API headers and libraries. if test -z "$septel_root"; then septel_root=$srcdir/../septel fi @@ -6492,33 +6689,40 @@ $as_echo_n "checking whether we have Septel API... " >&6; } septel_tools_dir="$septel_root" septel_include_dir="$septel_root/INC" - ac_cv_lbl_septel_api=no if test -r "$septel_include_dir/msg.h"; then + ac_cv_lbl_septel_api=yes + fi + + if test "$ac_cv_lbl_septel_api" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes ($septel_include_dir)" >&5 +$as_echo "yes ($septel_include_dir)" >&6; } + V_INCLS="$V_INCLS -I$septel_include_dir" 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" 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" if test "$V_PCAP" != septel ; then - SSRC="pcap-septel.c" + SSRC="$SSRC pcap-septel.c" fi - ac_cv_lbl_septel_api=yes - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lbl_septel_api" >&5 -$as_echo "$ac_cv_lbl_septel_api" >&6; } - if test $ac_cv_lbl_septel_api = no; then - if test "$want_septel" = yes; then - as_fn_error $? "Septel API not found under directory $septel_root; use --without-septel" "$LINENO" 5 - fi - else $as_echo "#define HAVE_SEPTEL_API 1" >>confdefs.h - fi -fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } -if test "$V_PCAP" = septel -a "$ac_cv_lbl_septel_api" = no; then - as_fn_error $? "Specifying the capture type as 'septel' requires the Septel API to be present; use --with-septel=DIR" "$LINENO" 5 + if test "$V_PCAP" = septel; then + # User requested "septel" capture type but + # we couldn't find the Septel API support. + as_fn_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" "$LINENO" 5 + fi + + if test "$want_septel" = yes; then + # User wanted Septel support but we couldn't find it. + as_fn_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" "$LINENO" 5 + fi + fi fi # Check for Myricom SNF support. @@ -6532,7 +6736,7 @@ if test "${with_snf+set}" = set; then : want_snf=no elif test "$withval" = yes then - # User wants SNF support but hasn't specific a directory. + # User wants SNF support but hasn't specified a directory. want_snf=yes else # User wants SNF support with a specified directory. @@ -6542,10 +6746,20 @@ if test "${with_snf+set}" = set; then : else - # - # Use Sniffer API if present, otherwise don't - # - want_snf=ifpresent + if test "$V_PCAP" = snf; then + # User requested Sniffer-only libpcap, so we'd better have + # the Sniffer API. + want_snf=yes + elif test "xxx_only" = yes; then + # User requested something-else-only pcap, so they don't + # want SNF support. + want_snf=no + else + # + # Use Sniffer API if present, otherwise don't + # + want_snf=ifpresent + fi fi @@ -6572,34 +6786,13 @@ if test "${with_snf_libraries+set}" = set; then : fi -case "$V_PCAP" in -bpf|linux|snf) - # - # We support the Sniffer API if we're on BSD, Linux, or if we're - # building a Sniffer-only libpcap. - # - ;; -*) - # - # If the user explicitly requested Sniffer, tell them it's not - # supported. - # - # If they expressed no preference, don't include it. - # - if test $want_snf = yes; then - as_fn_error $? "Myricom SNF support only available with 'bpf' 'linux' and 'snf' packet capture types" "$LINENO" 5 - elif test $want_snf = yes; then - want_snf=no - fi - ;; -esac - ac_cv_lbl_snf_api=no if test "$with_snf" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we have Myricom Sniffer API" >&5 $as_echo_n "checking whether we have Myricom Sniffer API... " >&6; } + # If necessary, set default paths for Sniffer headers and libraries. if test -z "$snf_root"; then snf_root=/opt/snf fi @@ -6613,16 +6806,7 @@ $as_echo_n "checking whether we have Myricom Sniffer API... " >&6; } fi if test -f "$snf_include_dir/snf.h"; then - ac_cv_lbl_snf_api=yes - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lbl_snf_api ($snf_root)" >&5 -$as_echo "$ac_cv_lbl_snf_api ($snf_root)" >&6; } - - if test $ac_cv_lbl_snf_api = no; then - if test "$want_snf" = yes; then - as_fn_error $? "SNF API headers not found under $snf_include_dir; use --without-snf" "$LINENO" 5 - fi - else + # We found a header; make sure we can link with the library saved_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -L$snf_lib_dir" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for snf_init in -lsnf" >&5 @@ -6663,32 +6847,394 @@ fi $as_echo "$ac_cv_lib_snf_snf_init" >&6; } if test "x$ac_cv_lib_snf_snf_init" = xyes; then : ac_cv_lbl_snf_api="yes" -else - ac_cv_lbl_snf_api="no" fi LDFLAGS="$saved_ldflags" + if test "$ac_cv_lbl_snf_api" = no; then + as_fn_error $? "SNF API cannot correctly be linked; check config.log" "$LINENO" 5 + fi + fi + + if test "$ac_cv_lbl_snf_api" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes ($snf_root)" >&5 +$as_echo "yes ($snf_root)" >&6; } + + V_INCLS="$V_INCLS -I$snf_include_dir" + LIBS="$LIBS -lsnf" + LDFLAGS="$LDFLAGS -L$snf_lib_dir" + + if test "$V_PCAP" != snf ; then + SSRC="$SSRC pcap-snf.c" + fi - if test $ac_cv_lbl_snf_api = no; then - if test "$want_snf" = yes; then - as_fn_error $? "SNF API cannot correctly be linked check config.log; use --without-snf" "$LINENO" 5 - fi - else - V_INCLS="$V_INCLS -I$snf_include_dir" - LIBS="$LIBS -lsnf" - LDFLAGS="$LDFLAGS -L$snf_lib_dir" - if test "$V_PCAP" != snf ; then - SSRC="pcap-snf.c" - fi $as_echo "#define HAVE_SNF_API 1" >>confdefs.h + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + if test "$want_snf" = yes; then + # User requested "snf" capture type but + # we couldn't find the Sniffer API support. + as_fn_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" "$LINENO" 5 + fi + + if test "$want_snf" = yes; then + as_fn_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" "$LINENO" 5 fi fi fi -if test "$V_PCAP" = snf -a "$ac_cv_lbl_snf_api" = no; then - as_fn_error $? "Specifying the capture type as 'snf' requires the Myricom Sniffer API to be present; use --with-snf=DIR" "$LINENO" 5 +# Check for Riverbed TurboCap support. + +# Check whether --with-turbocap was given. +if test "${with_turbocap+set}" = set; then : + withval=$with_turbocap; + if test "$withval" = no + then + # User explicitly doesn't want TurboCap + want_turbocap=no + elif test "$withval" = yes + then + # User wants TurboCap support but hasn't specified a directory. + want_turbocap=yes + else + # User wants TurboCap support with a specified directory. + want_turbocap=yes + turbocap_root=$withval + fi + +else + + if test "xxx_only" = yes; then + # User requested something-else-only pcap, so they don't + # want TurboCap support. + want_turbocap=no + else + # + # Use TurboCap API if present, otherwise don't + # + want_turbocap=ifpresent + fi + +fi + + +ac_cv_lbl_turbocap_api=no +if test "$want_turbocap" != no; then + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether TurboCap is supported" >&5 +$as_echo_n "checking whether TurboCap is supported... " >&6; } + + save_CFLAGS="$CFLAGS" + save_LIBS="$LIBS" + if test ! -z "$turbocap_root"; then + TURBOCAP_CFLAGS="-I$turbocap_root/include" + TURBOCAP_LIBS="-L$turbocap_root/lib" + CFLAGS="$CFLAGS $TURBOCAP_CFLAGS" + fi + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + +int +main () +{ + + TC_INSTANCE a; TC_PORT b; TC_BOARD c; + TC_INSTANCE i; + (void)TcInstanceCreateByName("foo", &i); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_lbl_turbocap_api=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + CFLAGS="$save_CFLAGS" + if test $ac_cv_lbl_turbocap_api = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + SSRC="$SSRC pcap-tc.c" + V_INCLS="$V_INCLS $TURBOCAP_CFLAGS" + LIBS="$LIBS $TURBOCAP_LIBS -lTcApi -lpthread -lstdc++" + + +$as_echo "#define HAVE_TC_API 1" >>confdefs.h + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + if test "$want_turbocap" = yes; then + # User wanted Turbo support but we couldn't find it. + as_fn_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" "$LINENO" 5 + fi + fi +fi + +# +# Look for {f}lex. +# +for ac_prog in flex lex +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LEX"; then + ac_cv_prog_LEX="$LEX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LEX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LEX=$ac_cv_prog_LEX +if test -n "$LEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5 +$as_echo "$LEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$LEX" && break +done +test -n "$LEX" || LEX=":" + +if test "x$LEX" != "x:"; then + cat >conftest.l <<_ACEOF +%% +a { ECHO; } +b { REJECT; } +c { yymore (); } +d { yyless (1); } +e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument. */ + yyless ((input () != 0)); } +f { unput (yytext[0]); } +. { BEGIN INITIAL; } +%% +#ifdef YYTEXT_POINTER +extern char *yytext; +#endif +int +main (void) +{ + return ! yylex () + ! yywrap (); +} +_ACEOF +{ { ac_try="$LEX conftest.l" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$LEX conftest.l") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking lex output file root" >&5 +$as_echo_n "checking lex output file root... " >&6; } +if ${ac_cv_prog_lex_root+:} false; then : + $as_echo_n "(cached) " >&6 +else + +if test -f lex.yy.c; then + ac_cv_prog_lex_root=lex.yy +elif test -f lexyy.c; then + ac_cv_prog_lex_root=lexyy +else + as_fn_error $? "cannot find output from $LEX; giving up" "$LINENO" 5 +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5 +$as_echo "$ac_cv_prog_lex_root" >&6; } +LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root + +if test -z "${LEXLIB+set}"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex library" >&5 +$as_echo_n "checking lex library... " >&6; } +if ${ac_cv_lib_lex+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ac_save_LIBS=$LIBS + ac_cv_lib_lex='none needed' + for ac_lib in '' -lfl -ll; do + LIBS="$ac_lib $ac_save_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +`cat $LEX_OUTPUT_ROOT.c` +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_lex=$ac_lib +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + test "$ac_cv_lib_lex" != 'none needed' && break + done + LIBS=$ac_save_LIBS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5 +$as_echo "$ac_cv_lib_lex" >&6; } + test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5 +$as_echo_n "checking whether yytext is a pointer... " >&6; } +if ${ac_cv_prog_lex_yytext_pointer+:} false; then : + $as_echo_n "(cached) " >&6 +else + # POSIX says lex can declare yytext either as a pointer or an array; the +# default is implementation-dependent. Figure out which it is, since +# not all implementations provide the %pointer and %array declarations. +ac_cv_prog_lex_yytext_pointer=no +ac_save_LIBS=$LIBS +LIBS="$LEXLIB $ac_save_LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #define YYTEXT_POINTER 1 +`cat $LEX_OUTPUT_ROOT.c` +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_prog_lex_yytext_pointer=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_save_LIBS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5 +$as_echo "$ac_cv_prog_lex_yytext_pointer" >&6; } +if test $ac_cv_prog_lex_yytext_pointer = yes; then + +$as_echo "#define YYTEXT_POINTER 1" >>confdefs.h + +fi +rm -f conftest.l $LEX_OUTPUT_ROOT.c + +fi +if test "$LEX" = ":"; then + as_fn_error $? "Neither flex nor lex was found." "$LINENO" 5 +fi + +# +# Make sure {f}lex supports the -P, --header-file, and --nounput flags +# and supports processing our scanner.l. +# +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for capable lex" >&5 +$as_echo_n "checking for capable lex... " >&6; } +if ${tcpdump_cv_capable_lex+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $LEX -P pcap_ --header-file=/dev/null --nounput -t $srcdir/scanner.l > /dev/null 2>&1; then + tcpdump_cv_capable_lex=yes + else + tcpdump_cv_capable_lex=insufficient + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcpdump_cv_capable_lex" >&5 +$as_echo "$tcpdump_cv_capable_lex" >&6; } +if test $tcpdump_cv_capable_lex = insufficient ; then + as_fn_error $? "$LEX is insufficient to compile libpcap. + libpcap requires Flex 2.5.31 or later, or a compatible version of lex." "$LINENO" 5 +fi + +# +# Look for yacc/bison/byacc. +# +for ac_prog in 'bison -y' byacc +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_YACC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$YACC"; then + ac_cv_prog_YACC="$YACC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_YACC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +YACC=$ac_cv_prog_YACC +if test -n "$YACC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 +$as_echo "$YACC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$YACC" && break +done +test -n "$YACC" || YACC="yacc" + + +# +# Make sure it supports the -p flag and supports processing our +# grammar.y. +# +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for capable yacc/bison" >&5 +$as_echo_n "checking for capable yacc/bison... " >&6; } +if ${tcpdump_cv_capable_yacc+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $YACC -p pcap_ -o /dev/null $srcdir/grammar.y >/dev/null 2>&1; then + tcpdump_cv_capable_yacc=yes + else + tcpdump_cv_capable_yacc=insufficient + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcpdump_cv_capable_yacc" >&5 +$as_echo "$tcpdump_cv_capable_yacc" >&6; } +if test $tcpdump_cv_capable_yacc = insufficient ; then + as_fn_error $? "$YACC is insufficient to compile libpcap. + libpcap requires Bison, Berkeley YACC, or another YACC compatible with them." "$LINENO" 5 fi # @@ -6971,7 +7517,7 @@ if test "${enable_shared+set}" = set; then : enableval=$enable_shared; fi -test "x$enable_shared" != "xyes" && DYEXT="none" +test "x$enable_shared" = "xno" && DYEXT="none" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. @@ -7220,7 +7766,18 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports the -Wall option" >&5 $as_echo_n "checking whether the compiler supports the -Wall option... " >&6; } save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $ac_lbl_unknown_warning_option_error -Wall" + if expr "x-Wall" : "x-W.*" >/dev/null + then + CFLAGS="$CFLAGS $ac_lbl_unknown_warning_option_error -Wall" + elif expr "x-Wall" : "x-f.*" >/dev/null + then + CFLAGS="$CFLAGS -Werror -Wall" + elif expr "x-Wall" : "x-m.*" >/dev/null + then + CFLAGS="$CFLAGS -Werror -Wall" + else + CFLAGS="$CFLAGS -Wall" + fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -7249,10 +7806,64 @@ fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports the -Wsign-compare option" >&5 +$as_echo_n "checking whether the compiler supports the -Wsign-compare option... " >&6; } + save_CFLAGS="$CFLAGS" + if expr "x-Wsign-compare" : "x-W.*" >/dev/null + then + CFLAGS="$CFLAGS $ac_lbl_unknown_warning_option_error -Wsign-compare" + elif expr "x-Wsign-compare" : "x-f.*" >/dev/null + then + CFLAGS="$CFLAGS -Werror -Wsign-compare" + elif expr "x-Wsign-compare" : "x-m.*" >/dev/null + then + CFLAGS="$CFLAGS -Werror -Wsign-compare" + else + CFLAGS="$CFLAGS -Wsign-compare" + fi + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0 + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + CFLAGS="$save_CFLAGS" + V_CCOPT="$V_CCOPT -Wsign-compare" + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + CFLAGS="$save_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports the -Wmissing-prototypes option" >&5 $as_echo_n "checking whether the compiler supports the -Wmissing-prototypes option... " >&6; } save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $ac_lbl_unknown_warning_option_error -Wmissing-prototypes" + if expr "x-Wmissing-prototypes" : "x-W.*" >/dev/null + then + CFLAGS="$CFLAGS $ac_lbl_unknown_warning_option_error -Wmissing-prototypes" + elif expr "x-Wmissing-prototypes" : "x-f.*" >/dev/null + then + CFLAGS="$CFLAGS -Werror -Wmissing-prototypes" + elif expr "x-Wmissing-prototypes" : "x-m.*" >/dev/null + then + CFLAGS="$CFLAGS -Werror -Wmissing-prototypes" + else + CFLAGS="$CFLAGS -Wmissing-prototypes" + fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -7284,7 +7895,18 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports the -Wstrict-prototypes option" >&5 $as_echo_n "checking whether the compiler supports the -Wstrict-prototypes option... " >&6; } save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $ac_lbl_unknown_warning_option_error -Wstrict-prototypes" + if expr "x-Wstrict-prototypes" : "x-W.*" >/dev/null + then + CFLAGS="$CFLAGS $ac_lbl_unknown_warning_option_error -Wstrict-prototypes" + elif expr "x-Wstrict-prototypes" : "x-f.*" >/dev/null + then + CFLAGS="$CFLAGS -Werror -Wstrict-prototypes" + elif expr "x-Wstrict-prototypes" : "x-m.*" >/dev/null + then + CFLAGS="$CFLAGS -Werror -Wstrict-prototypes" + else + CFLAGS="$CFLAGS -Wstrict-prototypes" + fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -7309,6 +7931,135 @@ else $as_echo "no" >&6; } CFLAGS="$save_CFLAGS" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports the -Wshadow option" >&5 +$as_echo_n "checking whether the compiler supports the -Wshadow option... " >&6; } + save_CFLAGS="$CFLAGS" + if expr "x-Wshadow" : "x-W.*" >/dev/null + then + CFLAGS="$CFLAGS $ac_lbl_unknown_warning_option_error -Wshadow" + elif expr "x-Wshadow" : "x-f.*" >/dev/null + then + CFLAGS="$CFLAGS -Werror -Wshadow" + elif expr "x-Wshadow" : "x-m.*" >/dev/null + then + CFLAGS="$CFLAGS -Werror -Wshadow" + else + CFLAGS="$CFLAGS -Wshadow" + fi + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0 + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + CFLAGS="$save_CFLAGS" + V_CCOPT="$V_CCOPT -Wshadow" + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + CFLAGS="$save_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports the -Wdeclaration-after-statement option" >&5 +$as_echo_n "checking whether the compiler supports the -Wdeclaration-after-statement option... " >&6; } + save_CFLAGS="$CFLAGS" + if expr "x-Wdeclaration-after-statement" : "x-W.*" >/dev/null + then + CFLAGS="$CFLAGS $ac_lbl_unknown_warning_option_error -Wdeclaration-after-statement" + elif expr "x-Wdeclaration-after-statement" : "x-f.*" >/dev/null + then + CFLAGS="$CFLAGS -Werror -Wdeclaration-after-statement" + elif expr "x-Wdeclaration-after-statement" : "x-m.*" >/dev/null + then + CFLAGS="$CFLAGS -Werror -Wdeclaration-after-statement" + else + CFLAGS="$CFLAGS -Wdeclaration-after-statement" + fi + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0 + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + CFLAGS="$save_CFLAGS" + V_CCOPT="$V_CCOPT -Wdeclaration-after-statement" + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + CFLAGS="$save_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports the -Wused-but-marked-unused option" >&5 +$as_echo_n "checking whether the compiler supports the -Wused-but-marked-unused option... " >&6; } + save_CFLAGS="$CFLAGS" + if expr "x-Wused-but-marked-unused" : "x-W.*" >/dev/null + then + CFLAGS="$CFLAGS $ac_lbl_unknown_warning_option_error -Wused-but-marked-unused" + elif expr "x-Wused-but-marked-unused" : "x-f.*" >/dev/null + then + CFLAGS="$CFLAGS -Werror -Wused-but-marked-unused" + elif expr "x-Wused-but-marked-unused" : "x-m.*" >/dev/null + then + CFLAGS="$CFLAGS -Werror -Wused-but-marked-unused" + else + CFLAGS="$CFLAGS -Wused-but-marked-unused" + fi + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0 + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + CFLAGS="$save_CFLAGS" + V_CCOPT="$V_CCOPT -Wused-but-marked-unused" + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + CFLAGS="$save_CFLAGS" + fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext @@ -7631,14 +8382,6 @@ $as_echo "#define LBL_ALIGN 1" >>confdefs.h fi -# -# Makefile.in includes rules to generate version.h, so we assume -# that it will be generated if autoconf is used. -# - -$as_echo "#define HAVE_VERSION_H 1" >>confdefs.h - - rm -f net ln -s ${srcdir}/bpf/net net @@ -7658,6 +8401,8 @@ ln -s ${srcdir}/bpf/net net + + # Check whether --enable-usb was given. if test "${enable_usb+set}" = set; then : enableval=$enable_usb; @@ -7666,6 +8411,12 @@ else fi +if test "xxx_only" = yes; then + # User requested something-else-only pcap, so they don't + # want USB support. + enable_usb=no +fi + if test "x$enable_usb" != "xno" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for USB sniffing support" >&5 $as_echo_n "checking for USB sniffing support... " >&6; } @@ -7783,6 +8534,15 @@ $as_echo "#define HAVE_USBDEVFS_CTRLTRANSFER_BREQUESTTYPE 1" >>confdefs.h fi fi ;; + freebsd*) + # + # This just uses BPF in FreeBSD 8.4 and later; we don't need + # to check for anything special for capturing. + # + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in FreeBSD 8.4 and later" >&5 +$as_echo "yes, in FreeBSD 8.4 and later" >&6; } + ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } @@ -7792,23 +8552,24 @@ fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the platform could support netfilter sniffing" >&5 +if test "xxx_only" != yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the platform could support netfilter sniffing" >&5 $as_echo_n "checking whether the platform could support netfilter sniffing... " >&6; } -case "$host_os" in -linux*) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + case "$host_os" in + linux*) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } - # - # Life's too short to deal with trying to get this to compile - # if you don't get the right types defined with - # __KERNEL_STRICT_NAMES getting defined by some other include. - # - # Check whether the includes Just Work. If not, don't turn on - # netfilter support. - # - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we can compile the netfilter support" >&5 + # + # Life's too short to deal with trying to get this to compile + # if you don't get the right types defined with + # __KERNEL_STRICT_NAMES getting defined by some other include. + # + # Check whether the includes Just Work. If not, don't turn on + # netfilter support. + # + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we can compile the netfilter support" >&5 $as_echo_n "checking whether we can compile the netfilter support... " >&6; } - if ${ac_cv_netfilter_can_compile+:} false; then : + if ${ac_cv_netfilter_can_compile+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -7840,20 +8601,21 @@ fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_netfilter_can_compile" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_netfilter_can_compile" >&5 $as_echo "$ac_cv_netfilter_can_compile" >&6; } - if test $ac_cv_netfilter_can_compile = yes ; then + if test $ac_cv_netfilter_can_compile = yes ; then $as_echo "#define PCAP_SUPPORT_NETFILTER 1" >>confdefs.h - NETFILTER_SRC=pcap-netfilter-linux.c - fi - ;; -*) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + NETFILTER_SRC=pcap-netfilter-linux.c + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } - ;; -esac + ;; + esac +fi @@ -7861,10 +8623,16 @@ esac if test "${enable_bluetooth+set}" = set; then : enableval=$enable_bluetooth; else - enable_bluetooth=no + enable_bluetooth=ifsupportavailable fi +if test "xxx_only" = yes; then + # User requested something-else-only pcap, so they don't + # want Bluetooth support. + enable_bluetooth=no +fi + if test "x$enable_bluetooth" != "xno" ; then case "$host_os" in linux*) @@ -7984,161 +8752,22 @@ $as_echo "$as_me: no Bluetooth sniffing support implemented for $host_os" >&6;} -fi - -# Check whether --enable-canusb was given. -if test "${enable_canusb+set}" = set; then : - enableval=$enable_canusb; -else - enable_canusb=no -fi - - -if test "x$enable_canusb" != "xno" ; then - case "$host_os" in - linux*|uclinux*) - ac_fn_c_check_header_mongrel "$LINENO" "libusb-1.0/libusb.h" "ac_cv_header_libusb_1_0_libusb_h" "$ac_includes_default" -if test "x$ac_cv_header_libusb_1_0_libusb_h" = xyes; then : - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libusb_init in -lusb-1.0" >&5 -$as_echo_n "checking for libusb_init in -lusb-1.0... " >&6; } -if ${ac_cv_lib_usb_1_0_libusb_init+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lusb-1.0 -lpthread - $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char libusb_init (); -int -main () -{ -return libusb_init (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_usb_1_0_libusb_init=yes -else - ac_cv_lib_usb_1_0_libusb_init=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_usb_1_0_libusb_init" >&5 -$as_echo "$ac_cv_lib_usb_1_0_libusb_init" >&6; } -if test "x$ac_cv_lib_usb_1_0_libusb_init" = xyes; then : - - -$as_echo "#define PCAP_SUPPORT_CANUSB 1" >>confdefs.h - - CANUSB_SRC=pcap-canusb-linux.c - LIBS="-lusb-1.0 -lpthread $LIBS" - ac_lbl_has_libusb=yes - -else - ac_lbl_has_libusb=no -fi - - -else - ac_lbl_has_libusb=no - -fi - - - if test "x$ac_lbl_has_libusb" = "xyes" ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: canusb sniffing is supported" >&5 -$as_echo "$as_me: canusb sniffing is supported" >&6;} - else - if test "x$enable_canusb" = "xyes" ; then - as_fn_error $? "canusb sniffing is not supported; install libusb1.0 lib devel to enable it" "$LINENO" 5 - else - { $as_echo "$as_me:${as_lineno-$LINENO}: canusb sniffing is not supported; install libusb1.0 lib devel to enable it" >&5 -$as_echo "$as_me: canusb sniffing is not supported; install libusb1.0 lib devel to enable it" >&6;} - fi - fi - ;; - *) - if test "x$enable_canusb" = "xyes" ; then - as_fn_error $? "no canusb support implemented for $host_os" "$LINENO" 5 - else - { $as_echo "$as_me:${as_lineno-$LINENO}: no canusb support implemented for $host_os" >&5 -$as_echo "$as_me: no canusb support implemented for $host_os" >&6;} - fi - ;; - esac - - -fi - -# Check whether --enable-can was given. -if test "${enable_can+set}" = set; then : - enableval=$enable_can; -else - enable_can=no -fi - - -if test "x$enable_can" != "xno" ; then - case "$host_os" in - linux*) - ac_fn_c_check_header_compile "$LINENO" "linux/can.h" "ac_cv_header_linux_can_h" "#include - -" -if test "x$ac_cv_header_linux_can_h" = xyes; then : - - -$as_echo "#define PCAP_SUPPORT_CAN 1" >>confdefs.h - - CAN_SRC=pcap-can-linux.c - { $as_echo "$as_me:${as_lineno-$LINENO}: CAN sniffing is supported" >&5 -$as_echo "$as_me: CAN sniffing is supported" >&6;} - -else - - if test "x$enable_can" = "xyes" ; then - as_fn_error $? "CAN sniffing is not supported" "$LINENO" 5 - else - { $as_echo "$as_me:${as_lineno-$LINENO}: CAN sniffing is not supported" >&5 -$as_echo "$as_me: CAN sniffing is not supported" >&6;} - fi - -fi - - - ;; - *) - if test "x$enable_can" = "xyes" ; then - as_fn_error $? "no CAN sniffing support implemented for $host_os" "$LINENO" 5 - else - { $as_echo "$as_me:${as_lineno-$LINENO}: no CAN sniffing support implemented for $host_os" >&5 -$as_echo "$as_me: no CAN sniffing support implemented for $host_os" >&6;} - fi - ;; - esac - - fi # Check whether --enable-dbus was given. if test "${enable_dbus+set}" = set; then : enableval=$enable_dbus; else - enable_dbus=no + enable_dbus=ifavailable fi +if test "xxx_only" = yes; then + # User requested something-else-only pcap, so they don't + # want D-Bus support. + enable_dbus=no +fi + if test "x$enable_dbus" != "xno"; then if test "x$enable_dbus" = "xyes"; then case "$host_os" in diff --git a/libpcap/configure.in b/libpcap/configure.ac similarity index 75% rename from libpcap/configure.in rename to libpcap/configure.ac index ad2e437bf..da2f940da 100644 --- a/libpcap/configure.in +++ b/libpcap/configure.ac @@ -104,7 +104,7 @@ dnl in "aclocal.m4" uses it, so we would still have to test for it dnl and set "HAVE_SYS_IOCCOM_H" if we have it, otherwise dnl "AC_LBL_FIXINCLUDES" wouldn't work on some platforms such as Solaris. dnl -AC_CHECK_HEADERS(sys/ioccom.h sys/sockio.h limits.h paths.h) +AC_CHECK_HEADERS(sys/ioccom.h sys/select.h sys/sockio.h limits.h) AC_CHECK_HEADERS(linux/types.h) AC_CHECK_HEADERS(linux/if_packet.h netpacket/packet.h netpacket/if_packet.h) AC_CHECK_HEADERS(net/pfvar.h, , , [#include @@ -149,7 +149,7 @@ struct rtentry; fi case "$host_os" in -linux*) +linux*|uclinux*) AC_CHECK_HEADERS(linux/sockios.h linux/if_bonding.h,,, [ #include @@ -169,6 +169,13 @@ if test $needsnprintf = yes; then AC_LIBOBJ([snprintf]) fi +needstrtok_r=no +AC_CHECK_FUNCS(strtok_r,, + [needstrtok_r=yes]) +if test $needstrtok_r = yes; then + AC_LIBOBJ([strtok_r]) +fi + # # Do this before checking for ether_hostton(), as it's a # "gethostbyname() -ish function". @@ -281,6 +288,13 @@ if test "$enable_protochain" = "disabled"; then fi AC_MSG_RESULT(${enable_protochain}) +# +# valgrindtest directly uses the native capture mechanism, but +# only tests with BPF and PF_PACKET sockets; only enable it if +# we have BPF or PF_PACKET sockets. +# +VALGRINDTEST= + # # SITA support is mutually exclusive with native capture support; # "--with-sita" selects SITA support. @@ -292,7 +306,6 @@ AC_HELP_STRING([--with-sita],[include SITA support]), AC_DEFINE(SITA,1,[include ACN support]) AC_MSG_NOTICE(Enabling SITA ACN support) V_PCAP=sita - V_FINDALLDEVS=sita fi ], [ @@ -318,8 +331,18 @@ elif test -r /dev/bpf -o -h /dev/bpf ; then # V_PCAP=bpf AC_DEFINE(HAVE_CLONING_BPF,1,[define if you have a cloning BPF device]) + + # + # We have BPF, so build valgrindtest with "make test". + # + VALGRINDTEST=valgrindtest elif test -r /dev/bpf0 ; then V_PCAP=bpf + + # + # We have BPF, so build valgrindtest with "make test". + # + VALGRINDTEST=valgrindtest elif test -r /usr/include/net/pfilt.h ; then V_PCAP=pf elif test -r /dev/enet ; then @@ -330,6 +353,12 @@ elif test -r /usr/include/sys/net/nit.h ; then V_PCAP=nit elif test -r /usr/include/linux/socket.h ; then V_PCAP=linux + + # + # XXX - this won't work with older kernels that have SOCK_PACKET + # sockets but not PF_PACKET sockets. + # + VALGRINDTEST=valgrindtest elif test -r /usr/include/net/raw.h ; then V_PCAP=snoop elif test -r /usr/include/odmi.h ; then @@ -341,6 +370,11 @@ elif test -r /usr/include/odmi.h ; then V_PCAP=bpf elif test -c /dev/bpf0 ; then # check again in case not readable V_PCAP=bpf + + # + # We have BPF, so build valgrindtest with "make test". + # + VALGRINDTEST=valgrindtest elif test -r /usr/include/sys/dlpi.h ; then V_PCAP=dlpi elif test -c /dev/enet ; then # check again in case not readable @@ -351,6 +385,7 @@ else V_PCAP=null fi AC_MSG_RESULT($V_PCAP) +AC_SUBST(VALGRINDTEST) # # Do capture-mechanism-dependent tests. @@ -450,10 +485,10 @@ linux) # Do we have libnl? # AC_ARG_WITH(libnl, - AC_HELP_STRING([--without-libnl],[disable libnl support @<:@default=disabled@:>@]), + AC_HELP_STRING([--without-libnl],[disable libnl support @<:@default=yes, on Linux, if present@:>@]), with_libnl=$withval,,) - if test x$with_libnl = xyes ; then + if test x$with_libnl != xno ; then have_any_nl="no" incdir=-I/usr/include/libnl3 @@ -567,15 +602,30 @@ bpf) ;; dag) + # + # --with-pcap=dag is the only way to get here, and it means + # "DAG support but nothing else" + # V_DEFS="$V_DEFS -DDAG_ONLY" + xxx_only=yes ;; septel) + # + # --with-pcap=septel is the only way to get here, and it means + # "Septel support but nothing else" + # V_DEFS="$V_DEFS -DSEPTEL_ONLY" + xxx_only=yes ;; snf) + # + # --with-pcap=snf is the only way to get here, and it means + # "SNF support but nothing else" + # V_DEFS="$V_DEFS -DSNF_ONLY" + xxx_only=yes ;; null) @@ -589,14 +639,8 @@ dnl Now figure out how we get a list of interfaces and addresses, dnl if we support capturing. Don't bother if we don't support dnl capturing. dnl -if test "$V_PCAP" = null +if test "$V_PCAP" != null then - # - # We can't capture, so we can't open any capture - # devices, so we won't return any interfaces. - # - V_FINDALLDEVS=null -else AC_CHECK_FUNC(getifaddrs,[ # # We have "getifaddrs()"; make sure we have @@ -607,7 +651,7 @@ else # We have the header, so we use "getifaddrs()" to # get the list of interfaces. # - V_FINDALLDEVS=getad + V_FINDALLDEVS=fad-getad.c ],[ # # We don't have the header - give up. @@ -650,9 +694,9 @@ else ac_cv_lbl_have_siocglifconf=no)) AC_MSG_RESULT($ac_cv_lbl_have_siocglifconf) if test $ac_cv_lbl_have_siocglifconf = yes ; then - V_FINDALLDEVS=glifc + V_FINDALLDEVS=fad-glifc.c else - V_FINDALLDEVS=gifc + V_FINDALLDEVS=fad-gifc.c fi ;; @@ -663,7 +707,7 @@ else # another mechanism, and we should be using that # instead.) # - V_FINDALLDEVS=gifc + V_FINDALLDEVS=fad-gifc.c ;; esac]) fi @@ -716,7 +760,7 @@ AC_MSG_RESULT(${enable_yydebug-no}) # Check for Endace DAG card support. AC_ARG_WITH([dag], -AC_HELP_STRING([--with-dag@<:@=DIR@:>@],[include Endace DAG support @<:@"yes", "no" or DIR; default="yes" on BSD and Linux if present@:>@]), +AC_HELP_STRING([--with-dag@<:@=DIR@:>@],[include Endace DAG support (located in directory DIR, if supplied). @<:@default=yes, if present@:>@]), [ if test "$withval" = no then @@ -732,14 +776,24 @@ AC_HELP_STRING([--with-dag@<:@=DIR@:>@],[include Endace DAG support @<:@"yes", " dag_root=$withval fi ],[ - # - # Use DAG API if present, otherwise don't - # - want_dag=ifpresent + if test "$V_PCAP" = dag; then + # User requested DAG-only libpcap, so we'd better have + # the DAG API. + want_dag=yes + elif test "xxx_only" = yes; then + # User requested something-else-only pcap, so they don't + # want DAG support. + want_dag=no + else + # + # Use DAG API if present, otherwise don't + # + want_dag=ifpresent + fi ]) AC_ARG_WITH([dag-includes], -AC_HELP_STRING([--with-dag-includes=DIR],[Endace DAG include directory]), +AC_HELP_STRING([--with-dag-includes=IDIR],[Endace DAG include directory, if not DIR/include]), [ # User wants DAG support and has specified a header directory, so use the provided value. want_dag=yes @@ -747,35 +801,13 @@ AC_HELP_STRING([--with-dag-includes=DIR],[Endace DAG include directory]), ],[]) AC_ARG_WITH([dag-libraries], -AC_HELP_STRING([--with-dag-libraries=DIR],[Endace DAG library directory]), +AC_HELP_STRING([--with-dag-libraries=LDIR],[Endace DAG library directory, if not DIR/lib]), [ # User wants DAG support and has specified a library directory, so use the provided value. want_dag=yes dag_lib_dir=$withval ],[]) -case "$V_PCAP" in -linux|bpf|dag) - # - # We support the DAG API if we're on Linux or BSD, or if we're - # building a DAG-only libpcap. - # - ;; -*) - # - # If the user explicitly requested DAG, tell them it's not - # supported. - # - # If they expressed no preference, don't include it. - # - if test $want_dag = yes; then - AC_MSG_ERROR([DAG support is only available with 'linux' 'bpf' and 'dag' packet capture types]) - elif test $want_dag = yes; then - want_dag=no - fi - ;; -esac - ac_cv_lbl_dag_api=no if test "$want_dag" != no; then @@ -783,7 +815,7 @@ if test "$want_dag" != no; then # If necessary, set default paths for DAG API headers and libraries. if test -z "$dag_root"; then - dag_root=/usr/local + dag_root=/usr/local fi if test -z "$dag_include_dir"; then @@ -791,74 +823,70 @@ if test "$want_dag" != no; then fi if test -z "$dag_lib_dir"; then - dag_lib_dir="$dag_root/lib" + dag_lib_dir="$dag_root/lib" fi if test -z "$dag_tools_dir"; then - dag_tools_dir="$dag_root/tools" + dag_tools_dir="$dag_root/tools" fi if test -r $dag_include_dir/dagapi.h; then ac_cv_lbl_dag_api=yes fi - AC_MSG_RESULT([$ac_cv_lbl_dag_api ($dag_include_dir)]) -fi -if test $ac_cv_lbl_dag_api = yes; then - V_INCLS="$V_INCLS -I$dag_include_dir" + if test "$ac_cv_lbl_dag_api" = yes; then + AC_MSG_RESULT([yes ($dag_include_dir)]) - if test $V_PCAP != dag ; then - SSRC="pcap-dag.c" - fi + V_INCLS="$V_INCLS -I$dag_include_dir" - # See if we can find a general version string. - # Don't need to save and restore LIBS to prevent -ldag being - # included if there's a found-action (arg 3). - saved_ldflags=$LDFLAGS - LDFLAGS="-L$dag_lib_dir" - AC_CHECK_LIB([dag], [dag_attach_stream], [dag_streams="1"], [dag_streams="0"]) - AC_CHECK_LIB([dag],[dag_get_erf_types], [ - AC_DEFINE(HAVE_DAG_GET_ERF_TYPES, 1, [define if you have dag_get_erf_types()])]) - AC_CHECK_LIB([dag],[dag_get_stream_erf_types], [ - AC_DEFINE(HAVE_DAG_GET_STREAM_ERF_TYPES, 1, [define if you have dag_get_stream_erf_types()])]) + if test $V_PCAP != dag ; then + SSRC="$SSRC pcap-dag.c" + fi - LDFLAGS=$saved_ldflags + # See if we can find a general version string. + # Don't need to save and restore LIBS to prevent -ldag being + # included if there's a found-action (arg 3). + saved_ldflags=$LDFLAGS + LDFLAGS="-L$dag_lib_dir" + AC_CHECK_LIB([dag], [dag_attach_stream], [dag_streams="1"], [dag_streams="0"]) + AC_CHECK_LIB([dag],[dag_get_erf_types], [ + AC_DEFINE(HAVE_DAG_GET_ERF_TYPES, 1, [define if you have dag_get_erf_types()])]) + AC_CHECK_LIB([dag],[dag_get_stream_erf_types], [ + AC_DEFINE(HAVE_DAG_GET_STREAM_ERF_TYPES, 1, [define if you have dag_get_stream_erf_types()])]) - if test "$dag_streams" = 1; then - AC_DEFINE(HAVE_DAG_STREAMS_API, 1, [define if you have streams capable DAG API]) - LIBS="$LIBS -ldag" - LDFLAGS="$LDFLAGS -L$dag_lib_dir" + LDFLAGS=$saved_ldflags - AC_CHECK_LIB([vdag],[vdag_set_device_info], [ac_dag_have_vdag="1"], [ac_dag_have_vdag="0"]) - if test "$ac_dag_have_vdag" = 1; then - AC_DEFINE(HAVE_DAG_VDAG, 1, [define if you have vdag_set_device_info()]) - LIBS="$LIBS -lpthread" + if test "$dag_streams" = 1; then + AC_DEFINE(HAVE_DAG_STREAMS_API, 1, [define if you have streams capable DAG API]) + LIBS="$LIBS -ldag" + LDFLAGS="$LDFLAGS -L$dag_lib_dir" + + AC_CHECK_LIB([vdag],[vdag_set_device_info], [ac_dag_have_vdag="1"], [ac_dag_have_vdag="0"]) + if test "$ac_dag_have_vdag" = 1; then + AC_DEFINE(HAVE_DAG_VDAG, 1, [define if you have vdag_set_device_info()]) + LIBS="$LIBS -lpthread" + fi + fi + + AC_DEFINE(HAVE_DAG_API, 1, [define if you have the DAG API]) + else + AC_MSG_RESULT(no) + + if test "$V_PCAP" = dag; then + # User requested "dag" capture type but we couldn't + # find the DAG API support. + 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]) + fi + + if test "$want_dag" = yes; then + # User wanted DAG support but we couldn't find it. + 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]) fi fi - - AC_DEFINE(HAVE_DAG_API, 1, [define if you have the DAG API]) -fi - -AC_MSG_CHECKING(whether we have the DAG API) - -if test $ac_cv_lbl_dag_api = no; then - AC_MSG_RESULT(no) - if test "$want_dag" = yes; then - # User wanted DAG support but we couldn't find it. - AC_MSG_ERROR([DAG API requested, but not found at $dag_root: use --without-dag]) - fi - - if test "$V_PCAP" = dag; then - # User requested "dag" capture type but the DAG API wasn't - # found. - AC_MSG_ERROR([Specifying the capture type as "dag" requires the DAG API to be present; use the --with-dag options to specify the location. (Try "./configure --help" for more information.)]) - fi -else - AC_MSG_RESULT(yes) fi AC_ARG_WITH(septel, -AC_HELP_STRING([--with-septel@<:@=DIR@:>@],[include Septel support (located in directory DIR, if supplied). @<:@default=yes, on Linux, if present@:>@]), +AC_HELP_STRING([--with-septel@<:@=DIR@:>@],[include Septel support (located in directory DIR, if supplied). @<:@default=yes, if present@:>@]), [ if test "$withval" = no then @@ -872,38 +900,28 @@ AC_HELP_STRING([--with-septel@<:@=DIR@:>@],[include Septel support (located in d septel_root=$withval fi ],[ - # - # Use Septel API if present, otherwise don't - # - want_septel=ifpresent - septel_root=./../septel -]) -ac_cv_lbl_septel_api=no -case "$V_PCAP" in -linux|septel) - # - # We support the Septel API if we're on Linux, or if we're building - # a Septel-only libpcap. - # - ;; -*) - # - # If the user explicitly requested Septel, tell them it's not - # supported. - # - # If they expressed no preference, don't include it. - # - if test $want_septel = yes; then - AC_MSG_ERROR(Septel support only available with 'linux' and 'septel' packet capture types) - elif test $want_septel = yes; then + if test "$V_PCAP" = septel; then + # User requested Septel-only libpcap, so we'd better have + # the Septel API. + want_septel=yes + elif test "xxx_only" = yes; then + # User requested something-else-only pcap, so they don't + # want Septel support. want_septel=no + else + # + # Use Septel API if present, otherwise don't + # + want_septel=ifpresent fi - ;; -esac +]) +ac_cv_lbl_septel_api=no if test "$with_septel" != no; then - AC_MSG_CHECKING(whether we have Septel API) + AC_MSG_CHECKING([whether we have Septel API headers]) + + # If necessary, set default paths for Septel API headers and libraries. if test -z "$septel_root"; then septel_root=$srcdir/../septel fi @@ -911,35 +929,41 @@ if test "$with_septel" != no; then septel_tools_dir="$septel_root" septel_include_dir="$septel_root/INC" - ac_cv_lbl_septel_api=no if test -r "$septel_include_dir/msg.h"; then + ac_cv_lbl_septel_api=yes + fi + + if test "$ac_cv_lbl_septel_api" = yes; then + AC_MSG_RESULT([yes ($septel_include_dir)]) + V_INCLS="$V_INCLS -I$septel_include_dir" 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" 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" if test "$V_PCAP" != septel ; then - SSRC="pcap-septel.c" + SSRC="$SSRC pcap-septel.c" fi - ac_cv_lbl_septel_api=yes - fi - AC_MSG_RESULT($ac_cv_lbl_septel_api) - if test $ac_cv_lbl_septel_api = no; then - if test "$want_septel" = yes; then - AC_MSG_ERROR(Septel API not found under directory $septel_root; use --without-septel) - fi + AC_DEFINE(HAVE_SEPTEL_API, 1, [define if you have the Septel API]) else - AC_DEFINE(HAVE_SEPTEL_API, 1, [define if you have a Septel API]) - fi -fi + AC_MSG_RESULT(no) -if test "$V_PCAP" = septel -a "$ac_cv_lbl_septel_api" = no; then - AC_MSG_ERROR(Specifying the capture type as 'septel' requires the Septel API to be present; use --with-septel=DIR) + if test "$V_PCAP" = septel; then + # User requested "septel" capture type but + # we couldn't find the Septel API support. + 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]) + fi + + if test "$want_septel" = yes; then + # User wanted Septel support but we couldn't find it. + 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]) + fi + fi fi # Check for Myricom SNF support. AC_ARG_WITH([snf], -AC_HELP_STRING([--with-snf@<:@=DIR@:>@],[include Myricom SNF support @<:@"yes", "no" or DIR; default="yes" on BSD and Linux if present@:>@]), +AC_HELP_STRING([--with-snf@<:@=DIR@:>@],[include Myricom SNF support (located in directory DIR, if supplied). @<:@default=yes, if present@:>@]), [ if test "$withval" = no then @@ -947,7 +971,7 @@ AC_HELP_STRING([--with-snf@<:@=DIR@:>@],[include Myricom SNF support @<:@"yes", want_snf=no elif test "$withval" = yes then - # User wants SNF support but hasn't specific a directory. + # User wants SNF support but hasn't specified a directory. want_snf=yes else # User wants SNF support with a specified directory. @@ -955,14 +979,24 @@ AC_HELP_STRING([--with-snf@<:@=DIR@:>@],[include Myricom SNF support @<:@"yes", snf_root=$withval fi ],[ - # - # Use Sniffer API if present, otherwise don't - # - want_snf=ifpresent + if test "$V_PCAP" = snf; then + # User requested Sniffer-only libpcap, so we'd better have + # the Sniffer API. + want_snf=yes + elif test "xxx_only" = yes; then + # User requested something-else-only pcap, so they don't + # want SNF support. + want_snf=no + else + # + # Use Sniffer API if present, otherwise don't + # + want_snf=ifpresent + fi ]) AC_ARG_WITH([snf-includes], -AC_HELP_STRING([--with-snf-includes=DIR],[Myricom SNF include directory]), +AC_HELP_STRING([--with-snf-includes=IDIR],[Myricom SNF include directory, if not DIR/include]), [ # User wants SNF with specific header directory want_snf=yes @@ -970,40 +1004,19 @@ AC_HELP_STRING([--with-snf-includes=DIR],[Myricom SNF include directory]), ],[]) AC_ARG_WITH([snf-libraries], -AC_HELP_STRING([--with-snf-libraries=DIR],[Myricom SNF library directory]), +AC_HELP_STRING([--with-snf-libraries=LDIR],[Myricom SNF library directory, if not DIR/lib]), [ # User wants SNF with specific lib directory want_snf=yes snf_lib_dir=$withval ],[]) -case "$V_PCAP" in -bpf|linux|snf) - # - # We support the Sniffer API if we're on BSD, Linux, or if we're - # building a Sniffer-only libpcap. - # - ;; -*) - # - # If the user explicitly requested Sniffer, tell them it's not - # supported. - # - # If they expressed no preference, don't include it. - # - if test $want_snf = yes; then - AC_MSG_ERROR(Myricom SNF support only available with 'bpf' 'linux' and 'snf' packet capture types) - elif test $want_snf = yes; then - want_snf=no - fi - ;; -esac - ac_cv_lbl_snf_api=no if test "$with_snf" != no; then AC_MSG_CHECKING(whether we have Myricom Sniffer API) + # If necessary, set default paths for Sniffer headers and libraries. if test -z "$snf_root"; then snf_root=/opt/snf fi @@ -1017,38 +1030,157 @@ if test "$with_snf" != no; then fi if test -f "$snf_include_dir/snf.h"; then - ac_cv_lbl_snf_api=yes - fi - AC_MSG_RESULT([$ac_cv_lbl_snf_api ($snf_root)]) - - if test $ac_cv_lbl_snf_api = no; then - if test "$want_snf" = yes; then - AC_MSG_ERROR(SNF API headers not found under $snf_include_dir; use --without-snf) - fi - else + # We found a header; make sure we can link with the library saved_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -L$snf_lib_dir" - AC_CHECK_LIB([snf], [snf_init], [ac_cv_lbl_snf_api="yes"], [ac_cv_lbl_snf_api="no"]) + AC_CHECK_LIB([snf], [snf_init], [ac_cv_lbl_snf_api="yes"]) LDFLAGS="$saved_ldflags" + if test "$ac_cv_lbl_snf_api" = no; then + AC_MSG_ERROR(SNF API cannot correctly be linked; check config.log) + fi + fi - if test $ac_cv_lbl_snf_api = no; then - if test "$want_snf" = yes; then - AC_MSG_ERROR(SNF API cannot correctly be linked check config.log; use --without-snf) - fi - else - V_INCLS="$V_INCLS -I$snf_include_dir" - LIBS="$LIBS -lsnf" - LDFLAGS="$LDFLAGS -L$snf_lib_dir" - if test "$V_PCAP" != snf ; then - SSRC="pcap-snf.c" - fi - AC_DEFINE(HAVE_SNF_API, 1, [define if you have Myricom SNF API]) + if test "$ac_cv_lbl_snf_api" = yes; then + AC_MSG_RESULT([yes ($snf_root)]) + + V_INCLS="$V_INCLS -I$snf_include_dir" + LIBS="$LIBS -lsnf" + LDFLAGS="$LDFLAGS -L$snf_lib_dir" + + if test "$V_PCAP" != snf ; then + SSRC="$SSRC pcap-snf.c" + fi + + AC_DEFINE(HAVE_SNF_API, 1, [define if you have the Myricom SNF API]) + else + AC_MSG_RESULT(no) + + if test "$want_snf" = yes; then + # User requested "snf" capture type but + # we couldn't find the Sniffer API support. + 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]) + fi + + if test "$want_snf" = yes; then + 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]) fi fi fi -if test "$V_PCAP" = snf -a "$ac_cv_lbl_snf_api" = no; then - AC_MSG_ERROR(Specifying the capture type as 'snf' requires the Myricom Sniffer API to be present; use --with-snf=DIR) +# Check for Riverbed TurboCap support. +AC_ARG_WITH([turbocap], +AC_HELP_STRING([--with-turbocap@<:@=DIR@:>@],[include Riverbed TurboCap support (located in directory DIR, if supplied). @<:@default=yes, if present@:>@]), +[ + if test "$withval" = no + then + # User explicitly doesn't want TurboCap + want_turbocap=no + elif test "$withval" = yes + then + # User wants TurboCap support but hasn't specified a directory. + want_turbocap=yes + else + # User wants TurboCap support with a specified directory. + want_turbocap=yes + turbocap_root=$withval + fi +],[ + if test "xxx_only" = yes; then + # User requested something-else-only pcap, so they don't + # want TurboCap support. + want_turbocap=no + else + # + # Use TurboCap API if present, otherwise don't + # + want_turbocap=ifpresent + fi +]) + +ac_cv_lbl_turbocap_api=no +if test "$want_turbocap" != no; then + + AC_MSG_CHECKING(whether TurboCap is supported) + + save_CFLAGS="$CFLAGS" + save_LIBS="$LIBS" + if test ! -z "$turbocap_root"; then + TURBOCAP_CFLAGS="-I$turbocap_root/include" + TURBOCAP_LIBS="-L$turbocap_root/lib" + CFLAGS="$CFLAGS $TURBOCAP_CFLAGS" + fi + + AC_TRY_COMPILE( + [ + #include + ], + [ + TC_INSTANCE a; TC_PORT b; TC_BOARD c; + TC_INSTANCE i; + (void)TcInstanceCreateByName("foo", &i); + ], + ac_cv_lbl_turbocap_api=yes) + + CFLAGS="$save_CFLAGS" + if test $ac_cv_lbl_turbocap_api = yes; then + AC_MSG_RESULT(yes) + + SSRC="$SSRC pcap-tc.c" + V_INCLS="$V_INCLS $TURBOCAP_CFLAGS" + LIBS="$LIBS $TURBOCAP_LIBS -lTcApi -lpthread -lstdc++" + + AC_DEFINE(HAVE_TC_API, 1, [define if you have the TurboCap API]) + else + AC_MSG_RESULT(no) + + if test "$want_turbocap" = yes; then + # User wanted Turbo support but we couldn't find it. + 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]) + fi + fi +fi + +# +# Look for {f}lex. +# +AC_PROG_LEX +if test "$LEX" = ":"; then + AC_MSG_ERROR([Neither flex nor lex was found.]) +fi + +# +# Make sure {f}lex supports the -P, --header-file, and --nounput flags +# and supports processing our scanner.l. +# +AC_CACHE_CHECK([for capable lex], tcpdump_cv_capable_lex, + if $LEX -P pcap_ --header-file=/dev/null --nounput -t $srcdir/scanner.l > /dev/null 2>&1; then + tcpdump_cv_capable_lex=yes + else + tcpdump_cv_capable_lex=insufficient + fi) +if test $tcpdump_cv_capable_lex = insufficient ; then + AC_MSG_ERROR([$LEX is insufficient to compile libpcap. + libpcap requires Flex 2.5.31 or later, or a compatible version of lex.]) +fi + +# +# Look for yacc/bison/byacc. +# +AC_PROG_YACC + +# +# Make sure it supports the -p flag and supports processing our +# grammar.y. +# +AC_CACHE_CHECK([for capable yacc/bison], tcpdump_cv_capable_yacc, + if $YACC -p pcap_ -o /dev/null $srcdir/grammar.y >/dev/null 2>&1; then + tcpdump_cv_capable_yacc=yes + else + tcpdump_cv_capable_yacc=insufficient + fi) +if test $tcpdump_cv_capable_yacc = insufficient ; then + AC_MSG_ERROR([$YACC is insufficient to compile libpcap. + libpcap requires Bison, Berkeley YACC, or another YACC compatible with them.]) fi # @@ -1301,8 +1433,8 @@ solaris*) esac AC_ARG_ENABLE(shared, -AC_HELP_STRING([--enable-shared],[build shared libraries @<:@default=no@:>@])) -test "x$enable_shared" != "xyes" && DYEXT="none" +AC_HELP_STRING([--enable-shared],[build shared libraries @<:@default=yes, if support available@:>@])) +test "x$enable_shared" = "xno" && DYEXT="none" AC_PROG_RANLIB AC_CHECK_TOOL([AR], [ar]) @@ -1320,12 +1452,6 @@ AC_LBL_HP_PPA_INFO_T_DL_MODULE_ID_1 AC_LBL_UNALIGNED_ACCESS -# -# Makefile.in includes rules to generate version.h, so we assume -# that it will be generated if autoconf is used. -# -AC_DEFINE(HAVE_VERSION_H, 1, [define if version.h is generated in the build procedure]) - rm -f net ln -s ${srcdir}/bpf/net net @@ -1333,11 +1459,13 @@ AC_SUBST(V_CCOPT) AC_SUBST(V_DEFS) AC_SUBST(V_FINDALLDEVS) AC_SUBST(V_INCLS) +AC_SUBST(V_LEX) AC_SUBST(V_PCAP) AC_SUBST(V_SHLIB_CMD) AC_SUBST(V_SHLIB_OPT) AC_SUBST(V_SONAME_OPT) AC_SUBST(V_RPATH_OPT) +AC_SUBST(V_YACC) AC_SUBST(ADDLOBJS) AC_SUBST(ADDLARCHIVEOBJS) AC_SUBST(SSRC) @@ -1350,6 +1478,12 @@ AC_ARG_ENABLE([usb], [], [enable_usb=yes]) +if test "xxx_only" = yes; then + # User requested something-else-only pcap, so they don't + # want USB support. + enable_usb=no +fi + if test "x$enable_usb" != "xno" ; then dnl check for USB sniffing support AC_MSG_CHECKING(for USB sniffing support) @@ -1405,6 +1539,14 @@ AC_INCLUDES_DEFAULT fi fi ;; + freebsd*) + # + # This just uses BPF in FreeBSD 8.4 and later; we don't need + # to check for anything special for capturing. + # + AC_MSG_RESULT([yes, in FreeBSD 8.4 and later]) + ;; + *) AC_MSG_RESULT(no) ;; @@ -1414,21 +1556,22 @@ AC_SUBST(PCAP_SUPPORT_USB) AC_SUBST(USB_SRC) dnl check for netfilter sniffing support -AC_MSG_CHECKING(whether the platform could support netfilter sniffing) -case "$host_os" in -linux*) - AC_MSG_RESULT(yes) - # - # Life's too short to deal with trying to get this to compile - # if you don't get the right types defined with - # __KERNEL_STRICT_NAMES getting defined by some other include. - # - # Check whether the includes Just Work. If not, don't turn on - # netfilter support. - # - AC_MSG_CHECKING(whether we can compile the netfilter support) - AC_CACHE_VAL(ac_cv_netfilter_can_compile, - AC_TRY_COMPILE([ +if test "xxx_only" != yes; then + AC_MSG_CHECKING(whether the platform could support netfilter sniffing) + case "$host_os" in + linux*) + AC_MSG_RESULT(yes) + # + # Life's too short to deal with trying to get this to compile + # if you don't get the right types defined with + # __KERNEL_STRICT_NAMES getting defined by some other include. + # + # Check whether the includes Just Work. If not, don't turn on + # netfilter support. + # + AC_MSG_CHECKING(whether we can compile the netfilter support) + AC_CACHE_VAL(ac_cv_netfilter_can_compile, + AC_TRY_COMPILE([ AC_INCLUDES_DEFAULT #include #include @@ -1442,24 +1585,31 @@ AC_INCLUDES_DEFAULT [], ac_cv_netfilter_can_compile=yes, ac_cv_netfilter_can_compile=no)) - AC_MSG_RESULT($ac_cv_netfilter_can_compile) - if test $ac_cv_netfilter_can_compile = yes ; then - AC_DEFINE(PCAP_SUPPORT_NETFILTER, 1, - [target host supports netfilter sniffing]) - NETFILTER_SRC=pcap-netfilter-linux.c - fi - ;; -*) - AC_MSG_RESULT(no) - ;; -esac + AC_MSG_RESULT($ac_cv_netfilter_can_compile) + if test $ac_cv_netfilter_can_compile = yes ; then + AC_DEFINE(PCAP_SUPPORT_NETFILTER, 1, + [target host supports netfilter sniffing]) + NETFILTER_SRC=pcap-netfilter-linux.c + fi + ;; + *) + AC_MSG_RESULT(no) + ;; + esac +fi AC_SUBST(PCAP_SUPPORT_NETFILTER) AC_SUBST(NETFILTER_SRC) AC_ARG_ENABLE([bluetooth], -[AC_HELP_STRING([--enable-bluetooth],[enable Bluetooth support @<:@default=no@:>@])], +[AC_HELP_STRING([--enable-bluetooth],[enable Bluetooth support @<:@default=yes, if support available@:>@])], [], - [enable_bluetooth=no]) + [enable_bluetooth=ifsupportavailable]) + +if test "xxx_only" = yes; then + # User requested something-else-only pcap, so they don't + # want Bluetooth support. + enable_bluetooth=no +fi if test "x$enable_bluetooth" != "xno" ; then dnl check for Bluetooth sniffing support @@ -1535,93 +1685,16 @@ if test "x$enable_bluetooth" != "xno" ; then AC_SUBST(BT_MONITOR_SRC) fi -AC_ARG_ENABLE([canusb], -[AC_HELP_STRING([--enable-canusb],[enable canusb support @<:@default=no@:>@])], - [], - [enable_canusb=no]) - -if test "x$enable_canusb" != "xno" ; then - dnl check for canusb support - case "$host_os" in - linux*|uclinux*) - AC_CHECK_HEADER(libusb-1.0/libusb.h, - [ - AC_CHECK_LIB(usb-1.0, libusb_init, - [ - AC_DEFINE(PCAP_SUPPORT_CANUSB, 1, [target host supports canusb]) - CANUSB_SRC=pcap-canusb-linux.c - LIBS="-lusb-1.0 -lpthread $LIBS" - ac_lbl_has_libusb=yes - ], - ac_lbl_has_libusb=no, - -lpthread - ) - ], - ac_lbl_has_libusb=no - ) - if test "x$ac_lbl_has_libusb" = "xyes" ; then - AC_MSG_NOTICE(canusb sniffing is supported) - else - if test "x$enable_canusb" = "xyes" ; then - AC_MSG_ERROR(canusb sniffing is not supported; install libusb1.0 lib devel to enable it) - else - AC_MSG_NOTICE(canusb sniffing is not supported; install libusb1.0 lib devel to enable it) - fi - fi - ;; - *) - if test "x$enable_canusb" = "xyes" ; then - AC_MSG_ERROR(no canusb support implemented for $host_os) - else - AC_MSG_NOTICE(no canusb support implemented for $host_os) - fi - ;; - esac - AC_SUBST(PCAP_SUPPORT_CANUSB) - AC_SUBST(CANUSB_SRC) -fi - -AC_ARG_ENABLE([can], -[AC_HELP_STRING([--enable-can],[enable CAN support @<:@default=no@:>@])], - [], - [enable_can=no]) - -if test "x$enable_can" != "xno" ; then - dnl check for CAN sniffing support - case "$host_os" in - linux*) - AC_CHECK_HEADER(linux/can.h, - [ - AC_DEFINE(PCAP_SUPPORT_CAN, 1, [target host supports CAN sniffing]) - CAN_SRC=pcap-can-linux.c - AC_MSG_NOTICE(CAN sniffing is supported) - ], - [ - if test "x$enable_can" = "xyes" ; then - AC_MSG_ERROR(CAN sniffing is not supported) - else - AC_MSG_NOTICE(CAN sniffing is not supported) - fi - ], - [#include ] - ) - ;; - *) - if test "x$enable_can" = "xyes" ; then - AC_MSG_ERROR(no CAN sniffing support implemented for $host_os) - else - AC_MSG_NOTICE(no CAN sniffing support implemented for $host_os) - fi - ;; - esac - AC_SUBST(PCAP_SUPPORT_CAN) - AC_SUBST(CAN_SRC) -fi - AC_ARG_ENABLE([dbus], -[AC_HELP_STRING([--enable-dbus],[enable D-Bus capture support @<:@default=no@:>@])], +[AC_HELP_STRING([--enable-dbus],[enable D-Bus capture support @<:@default=yes, if support available@:>@])], [], - [enable_dbus=no]) + [enable_dbus=ifavailable]) + +if test "xxx_only" = yes; then + # User requested something-else-only pcap, so they don't + # want D-Bus support. + enable_dbus=no +fi if test "x$enable_dbus" != "xno"; then if test "x$enable_dbus" = "xyes"; then diff --git a/libpcap/dlpisubs.c b/libpcap/dlpisubs.c index 131fa279d..fb94a6057 100644 --- a/libpcap/dlpisubs.c +++ b/libpcap/dlpisubs.c @@ -186,8 +186,8 @@ pcap_process_pkts(pcap_t *p, pcap_handler callback, u_char *user, pkthdr.len = origlen; pkthdr.caplen = caplen; /* Insure caplen does not exceed snapshot */ - if (pkthdr.caplen > p->snapshot) - pkthdr.caplen = p->snapshot; + if (pkthdr.caplen > (bpf_u_int32)p->snapshot) + pkthdr.caplen = (bpf_u_int32)p->snapshot; (*callback)(user, &pkthdr, pk); if (++n >= count && !PACKET_COUNT_IS_UNLIMITED(count)) { p->cc = ep - bufp; @@ -255,8 +255,29 @@ pcap_process_mactype(pcap_t *p, u_int mactype) break; #endif +#ifdef DL_IPV4 + case DL_IPV4: + p->linktype = DLT_IPV4; + p->offset = 0; + break; +#endif + +#ifdef DL_IPV6 + case DL_IPV6: + p->linktype = DLT_IPV6; + p->offset = 0; + break; +#endif + +#ifdef DL_IPNET + case DL_IPNET: + p->linktype = DLT_IPNET; + p->offset = 0; + break; +#endif + default: - snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "unknown mactype %u", + pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "unknown mactype 0x%x", mactype); retv = -1; } @@ -326,7 +347,7 @@ int pcap_alloc_databuf(pcap_t *p) { p->bufsize = PKTBUFSIZE; - p->buffer = (u_char *)malloc(p->bufsize + p->offset); + p->buffer = malloc(p->bufsize + p->offset); if (p->buffer == NULL) { strlcpy(p->errbuf, pcap_strerror(errno), PCAP_ERRBUF_SIZE); return (-1); @@ -362,6 +383,6 @@ strioctl(int fd, int cmd, int len, char *dp) static void pcap_stream_err(const char *func, int err, char *errbuf) { - snprintf(errbuf, PCAP_ERRBUF_SIZE, "%s: %s", func, pcap_strerror(err)); + pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "%s: %s", func, pcap_strerror(err)); } #endif diff --git a/libpcap/etherent.c b/libpcap/etherent.c index 707fd9d14..5cfd1b4c3 100644 --- a/libpcap/etherent.c +++ b/libpcap/etherent.c @@ -23,9 +23,9 @@ #include "config.h" #endif -#ifdef WIN32 +#ifdef _WIN32 #include -#else /* WIN32 */ +#else /* _WIN32 */ #if HAVE_INTTYPES_H #include #elif HAVE_STDINT_H @@ -35,7 +35,7 @@ #include #endif #include -#endif /* WIN32 */ +#endif /* _WIN32 */ #include #include diff --git a/libpcap/ethertype.h b/libpcap/ethertype.h index 8bab88163..51f63083f 100644 --- a/libpcap/ethertype.h +++ b/libpcap/ethertype.h @@ -112,6 +112,9 @@ #ifndef ETHERTYPE_PPPOES #define ETHERTYPE_PPPOES 0x8864 #endif +#ifndef ETHERTYPE_8021AD +#define ETHERTYPE_8021AD 0x88a8 +#endif #ifndef ETHERTYPE_LOOPBACK #define ETHERTYPE_LOOPBACK 0x9000 #endif diff --git a/libpcap/extract.h b/libpcap/extract.h new file mode 100644 index 000000000..face5b7e9 --- /dev/null +++ b/libpcap/extract.h @@ -0,0 +1,221 @@ +/* + * Copyright (c) 1992, 1993, 1994, 1995, 1996 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that: (1) source code distributions + * retain the above copyright notice and this paragraph in its entirety, (2) + * distributions including binary code include the above copyright notice and + * this paragraph in its entirety in the documentation or other materials + * provided with the distribution, and (3) all advertising materials mentioning + * features or use of this software display the following acknowledgement: + * ``This product includes software developed by the University of California, + * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of + * the University nor the names of its contributors may be used to endorse + * or promote products derived from this software without specific prior + * written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#ifndef _WIN32 +#include +#endif + +/* + * Macros to extract possibly-unaligned big-endian integral values. + */ +#ifdef LBL_ALIGN +/* + * The processor doesn't natively handle unaligned loads. + */ +#if defined(__GNUC__) && defined(HAVE___ATTRIBUTE__) && \ + (defined(__alpha) || defined(__alpha__) || \ + defined(__mips) || defined(__mips__)) + +/* + * This is a GCC-compatible compiler and we have __attribute__, which + * we assume that mean we have __attribute__((packed)), and this is + * MIPS or Alpha, which has instructions that can help when doing + * unaligned loads. + * + * Declare packed structures containing a uint16_t and a uint32_t, + * cast the pointer to point to one of those, and fetch through it; + * the GCC manual doesn't appear to explicitly say that + * __attribute__((packed)) causes the compiler to generate unaligned-safe + * code, but it apppears to do so. + * + * We do this in case the compiler can generate code using those + * instructions to do an unaligned load and pass stuff to "ntohs()" or + * "ntohl()", which might be better than than the code to fetch the + * bytes one at a time and assemble them. (That might not be the + * case on a little-endian platform, such as DEC's MIPS machines and + * Alpha machines, where "ntohs()" and "ntohl()" might not be done + * inline.) + * + * We do this only for specific architectures because, for example, + * at least some versions of GCC, when compiling for 64-bit SPARC, + * generate code that assumes alignment if we do this. + * + * XXX - add other architectures and compilers as possible and + * appropriate. + * + * HP's C compiler, indicated by __HP_cc being defined, supports + * "#pragma unaligned N" in version A.05.50 and later, where "N" + * specifies a number of bytes at which the typedef on the next + * line is aligned, e.g. + * + * #pragma unalign 1 + * typedef uint16_t unaligned_uint16_t; + * + * to define unaligned_uint16_t as a 16-bit unaligned data type. + * This could be presumably used, in sufficiently recent versions of + * the compiler, with macros similar to those below. This would be + * useful only if that compiler could generate better code for PA-RISC + * or Itanium than would be generated by a bunch of shifts-and-ORs. + * + * DEC C, indicated by __DECC being defined, has, at least on Alpha, + * an __unaligned qualifier that can be applied to pointers to get the + * compiler to generate code that does unaligned loads and stores when + * dereferencing the pointer in question. + * + * XXX - what if the native C compiler doesn't support + * __attribute__((packed))? How can we get it to generate unaligned + * accesses for *specific* items? + */ +typedef struct { + uint16_t val; +} __attribute__((packed)) unaligned_uint16_t; + +typedef struct { + uint32_t val; +} __attribute__((packed)) unaligned_uint32_t; + +static inline uint16_t +EXTRACT_16BITS(const void *p) +{ + return ((uint16_t)ntohs(((const unaligned_uint16_t *)(p))->val)); +} + +static inline uint32_t +EXTRACT_32BITS(const void *p) +{ + return ((uint32_t)ntohl(((const unaligned_uint32_t *)(p))->val)); +} + +static inline uint64_t +EXTRACT_64BITS(const void *p) +{ + return ((uint64_t)(((uint64_t)ntohl(((const unaligned_uint32_t *)(p) + 0)->val)) << 32 | \ + ((uint64_t)ntohl(((const unaligned_uint32_t *)(p) + 1)->val)) << 0)); +} + +#else /* have to do it a byte at a time */ +/* + * This isn't a GCC-compatible compiler, we don't have __attribute__, + * or we do but we don't know of any better way with this instruction + * set to do unaligned loads, so do unaligned loads of big-endian + * quantities the hard way - fetch the bytes one at a time and + * assemble them. + */ +#define EXTRACT_16BITS(p) \ + ((uint16_t)(((uint16_t)(*((const uint8_t *)(p) + 0)) << 8) | \ + ((uint16_t)(*((const uint8_t *)(p) + 1)) << 0))) +#define EXTRACT_32BITS(p) \ + ((uint32_t)(((uint32_t)(*((const uint8_t *)(p) + 0)) << 24) | \ + ((uint32_t)(*((const uint8_t *)(p) + 1)) << 16) | \ + ((uint32_t)(*((const uint8_t *)(p) + 2)) << 8) | \ + ((uint32_t)(*((const uint8_t *)(p) + 3)) << 0))) +#define EXTRACT_64BITS(p) \ + ((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 56) | \ + ((uint64_t)(*((const uint8_t *)(p) + 1)) << 48) | \ + ((uint64_t)(*((const uint8_t *)(p) + 2)) << 40) | \ + ((uint64_t)(*((const uint8_t *)(p) + 3)) << 32) | \ + ((uint64_t)(*((const uint8_t *)(p) + 4)) << 24) | \ + ((uint64_t)(*((const uint8_t *)(p) + 5)) << 16) | \ + ((uint64_t)(*((const uint8_t *)(p) + 6)) << 8) | \ + ((uint64_t)(*((const uint8_t *)(p) + 7)) << 0))) +#endif /* must special-case unaligned accesses */ +#else /* LBL_ALIGN */ +/* + * The processor natively handles unaligned loads, so we can just + * cast the pointer and fetch through it. + */ +static inline uint16_t +EXTRACT_16BITS(const void *p) +{ + return ((uint16_t)ntohs(*(const uint16_t *)(p))); +} + +static inline uint32_t +EXTRACT_32BITS(const void *p) +{ + return ((uint32_t)ntohl(*(const uint32_t *)(p))); +} + +static inline uint64_t +EXTRACT_64BITS(const void *p) +{ + return ((uint64_t)(((uint64_t)ntohl(*((const uint32_t *)(p) + 0))) << 32 | \ + ((uint64_t)ntohl(*((const uint32_t *)(p) + 1))) << 0)); + +} + +#endif /* LBL_ALIGN */ + +#define EXTRACT_24BITS(p) \ + ((uint32_t)(((uint32_t)(*((const uint8_t *)(p) + 0)) << 16) | \ + ((uint32_t)(*((const uint8_t *)(p) + 1)) << 8) | \ + ((uint32_t)(*((const uint8_t *)(p) + 2)) << 0))) + +#define EXTRACT_40BITS(p) \ + ((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 32) | \ + ((uint64_t)(*((const uint8_t *)(p) + 1)) << 24) | \ + ((uint64_t)(*((const uint8_t *)(p) + 2)) << 16) | \ + ((uint64_t)(*((const uint8_t *)(p) + 3)) << 8) | \ + ((uint64_t)(*((const uint8_t *)(p) + 4)) << 0))) + +#define EXTRACT_48BITS(p) \ + ((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 40) | \ + ((uint64_t)(*((const uint8_t *)(p) + 1)) << 32) | \ + ((uint64_t)(*((const uint8_t *)(p) + 2)) << 24) | \ + ((uint64_t)(*((const uint8_t *)(p) + 3)) << 16) | \ + ((uint64_t)(*((const uint8_t *)(p) + 4)) << 8) | \ + ((uint64_t)(*((const uint8_t *)(p) + 5)) << 0))) + +#define EXTRACT_56BITS(p) \ + ((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 0)) << 48) | \ + ((uint64_t)(*((const uint8_t *)(p) + 1)) << 40) | \ + ((uint64_t)(*((const uint8_t *)(p) + 2)) << 32) | \ + ((uint64_t)(*((const uint8_t *)(p) + 3)) << 24) | \ + ((uint64_t)(*((const uint8_t *)(p) + 4)) << 16) | \ + ((uint64_t)(*((const uint8_t *)(p) + 5)) << 8) | \ + ((uint64_t)(*((const uint8_t *)(p) + 6)) << 0))) + +/* + * Macros to extract possibly-unaligned little-endian integral values. + * XXX - do loads on little-endian machines that support unaligned loads? + */ +#define EXTRACT_LE_8BITS(p) (*(p)) +#define EXTRACT_LE_16BITS(p) \ + ((uint16_t)(((uint16_t)(*((const uint8_t *)(p) + 1)) << 8) | \ + ((uint16_t)(*((const uint8_t *)(p) + 0)) << 0))) +#define EXTRACT_LE_32BITS(p) \ + ((uint32_t)(((uint32_t)(*((const uint8_t *)(p) + 3)) << 24) | \ + ((uint32_t)(*((const uint8_t *)(p) + 2)) << 16) | \ + ((uint32_t)(*((const uint8_t *)(p) + 1)) << 8) | \ + ((uint32_t)(*((const uint8_t *)(p) + 0)) << 0))) +#define EXTRACT_LE_24BITS(p) \ + ((uint32_t)(((uint32_t)(*((const uint8_t *)(p) + 2)) << 16) | \ + ((uint32_t)(*((const uint8_t *)(p) + 1)) << 8) | \ + ((uint32_t)(*((const uint8_t *)(p) + 0)) << 0))) +#define EXTRACT_LE_64BITS(p) \ + ((uint64_t)(((uint64_t)(*((const uint8_t *)(p) + 7)) << 56) | \ + ((uint64_t)(*((const uint8_t *)(p) + 6)) << 48) | \ + ((uint64_t)(*((const uint8_t *)(p) + 5)) << 40) | \ + ((uint64_t)(*((const uint8_t *)(p) + 4)) << 32) | \ + ((uint64_t)(*((const uint8_t *)(p) + 3)) << 24) | \ + ((uint64_t)(*((const uint8_t *)(p) + 2)) << 16) | \ + ((uint64_t)(*((const uint8_t *)(p) + 1)) << 8) | \ + ((uint64_t)(*((const uint8_t *)(p) + 0)) << 0))) diff --git a/libpcap/fad-getad.c b/libpcap/fad-getad.c index 6fd3360f7..b67b5cdcd 100644 --- a/libpcap/fad-getad.c +++ b/libpcap/fad-getad.c @@ -144,7 +144,8 @@ get_sa_len(struct sockaddr *addr) * could be opened. */ int -pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) +pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf, + int (*check_usable)(const char *)) { pcap_if_t *devlist = NULL; struct ifaddrs *ifap, *ifa; @@ -168,11 +169,50 @@ pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) * those. */ if (getifaddrs(&ifap) != 0) { - (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, + (void)pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "getifaddrs: %s", pcap_strerror(errno)); return (-1); } for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) { + /* + * If this entry has a colon followed by a number at + * the end, we assume it's a logical interface. Those + * are just the way you assign multiple IP addresses to + * a real interface on Linux, so an entry for a logical + * interface should be treated like the entry for the + * real interface; we do that by stripping off the ":" + * and the number. + * + * XXX - should we do this only on Linux? + */ + p = strchr(ifa->ifa_name, ':'); + if (p != NULL) { + /* + * We have a ":"; is it followed by a number? + */ + q = p + 1; + while (isdigit((unsigned char)*q)) + q++; + if (*q == '\0') { + /* + * All digits after the ":" until the end. + * Strip off the ":" and everything after + * it. + */ + *p = '\0'; + } + } + + /* + * Can we capture on this device? + */ + if (!(*check_usable)(ifa->ifa_name)) { + /* + * No. + */ + continue; + } + /* * "ifa_addr" was apparently null on at least one * interface on some system. Therefore, we supply @@ -222,40 +262,12 @@ pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) dstaddr_size = 0; } - /* - * If this entry has a colon followed by a number at - * the end, we assume it's a logical interface. Those - * are just the way you assign multiple IP addresses to - * a real interface on Linux, so an entry for a logical - * interface should be treated like the entry for the - * real interface; we do that by stripping off the ":" - * and the number. - * - * XXX - should we do this only on Linux? - */ - p = strchr(ifa->ifa_name, ':'); - if (p != NULL) { - /* - * We have a ":"; is it followed by a number? - */ - q = p + 1; - while (isdigit((unsigned char)*q)) - q++; - if (*q == '\0') { - /* - * All digits after the ":" until the end. - * Strip off the ":" and everything after - * it. - */ - *p = '\0'; - } - } - /* * Add information for this address to the list. */ if (add_addr_to_iflist(&devlist, ifa->ifa_name, - ifa->ifa_flags, addr, addr_size, netmask, addr_size, + if_flags_to_pcap_flags(ifa->ifa_name, ifa->ifa_flags), + addr, addr_size, netmask, addr_size, broadaddr, broadaddr_size, dstaddr, dstaddr_size, errbuf) < 0) { ret = -1; diff --git a/libpcap/fad-gifc.c b/libpcap/fad-gifc.c index b0a4105a8..1b24af292 100644 --- a/libpcap/fad-gifc.c +++ b/libpcap/fad-gifc.c @@ -132,12 +132,13 @@ struct rtentry; /* declarations in */ * we already have that. */ int -pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) +pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf, + int (*check_usable)(const char *)) { pcap_if_t *devlist = NULL; register int fd; register struct ifreq *ifrp, *ifend, *ifnext; - int n; + size_t n; struct ifconf ifc; char *buf = NULL; unsigned buf_size; @@ -154,7 +155,7 @@ pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) */ fd = socket(AF_INET, SOCK_DGRAM, 0); if (fd < 0) { - (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, + (void)pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "socket: %s", pcap_strerror(errno)); return (-1); } @@ -170,7 +171,7 @@ pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) for (;;) { buf = malloc(buf_size); if (buf == NULL) { - (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, + (void)pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "malloc: %s", pcap_strerror(errno)); (void)close(fd); return (-1); @@ -181,7 +182,7 @@ pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) memset(buf, 0, buf_size); if (ioctl(fd, SIOCGIFCONF, (char *)&ifc) < 0 && errno != EINVAL) { - (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, + (void)pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "SIOCGIFCONF: %s", pcap_strerror(errno)); (void)close(fd); free(buf); @@ -236,6 +237,16 @@ pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) if (strncmp(ifrp->ifr_name, "dummy", 5) == 0) continue; + /* + * Can we capture on this device? + */ + if (!(*check_usable)(ifrp->ifr_name)) { + /* + * No. + */ + continue; + } + /* * Get the flags for this interface. */ @@ -244,7 +255,7 @@ pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) if (ioctl(fd, SIOCGIFFLAGS, (char *)&ifrflags) < 0) { if (errno == ENXIO) continue; - (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, + (void)pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "SIOCGIFFLAGS: %.*s: %s", (int)sizeof(ifrflags.ifr_name), ifrflags.ifr_name, @@ -268,7 +279,7 @@ pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) netmask = NULL; netmask_size = 0; } else { - (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, + (void)pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "SIOCGIFNETMASK: %.*s: %s", (int)sizeof(ifrnetmask.ifr_name), ifrnetmask.ifr_name, @@ -299,7 +310,7 @@ pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) broadaddr = NULL; broadaddr_size = 0; } else { - (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, + (void)pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "SIOCGIFBRDADDR: %.*s: %s", (int)sizeof(ifrbroadaddr.ifr_name), ifrbroadaddr.ifr_name, @@ -338,7 +349,7 @@ pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) dstaddr = NULL; dstaddr_size = 0; } else { - (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, + (void)pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "SIOCGIFDSTADDR: %.*s: %s", (int)sizeof(ifrdstaddr.ifr_name), ifrdstaddr.ifr_name, @@ -391,10 +402,10 @@ pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) * Add information for this address to the list. */ if (add_addr_to_iflist(&devlist, ifrp->ifr_name, - ifrflags.ifr_flags, &ifrp->ifr_addr, - SA_LEN(&ifrp->ifr_addr), netmask, netmask_size, - broadaddr, broadaddr_size, dstaddr, dstaddr_size, - errbuf) < 0) { + if_flags_to_pcap_flags(ifrp->ifr_name, ifrflags.ifr_flags), + &ifrp->ifr_addr, SA_LEN(&ifrp->ifr_addr), + netmask, netmask_size, broadaddr, broadaddr_size, + dstaddr, dstaddr_size, errbuf) < 0) { ret = -1; break; } diff --git a/libpcap/fad-glifc.c b/libpcap/fad-glifc.c index 1a820ad90..511481cf9 100644 --- a/libpcap/fad-glifc.c +++ b/libpcap/fad-glifc.c @@ -75,7 +75,8 @@ struct rtentry; /* declarations in */ * SIOCGLIFCONF rather than SIOCGIFCONF in order to get IPv6 addresses.) */ int -pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) +pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf, + int (*check_usable)(const char *)) { pcap_if_t *devlist = NULL; register int fd4, fd6, fd; @@ -97,7 +98,7 @@ pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) */ fd4 = socket(AF_INET, SOCK_DGRAM, 0); if (fd4 < 0) { - (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, + (void)pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "socket: %s", pcap_strerror(errno)); return (-1); } @@ -107,7 +108,7 @@ pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) */ fd6 = socket(AF_INET6, SOCK_DGRAM, 0); if (fd6 < 0) { - (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, + (void)pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "socket: %s", pcap_strerror(errno)); (void)close(fd4); return (-1); @@ -120,7 +121,7 @@ pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) ifn.lifn_flags = 0; ifn.lifn_count = 0; if (ioctl(fd4, SIOCGLIFNUM, (char *)&ifn) < 0) { - (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, + (void)pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "SIOCGLIFNUM: %s", pcap_strerror(errno)); (void)close(fd6); (void)close(fd4); @@ -133,7 +134,7 @@ pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) buf_size = ifn.lifn_count * sizeof (struct lifreq); buf = malloc(buf_size); if (buf == NULL) { - (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, + (void)pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "malloc: %s", pcap_strerror(errno)); (void)close(fd6); (void)close(fd4); @@ -149,7 +150,7 @@ pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) ifc.lifc_flags = 0; memset(buf, 0, buf_size); if (ioctl(fd4, SIOCGLIFCONF, (char *)&ifc) < 0) { - (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, + (void)pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "SIOCGLIFCONF: %s", pcap_strerror(errno)); (void)close(fd6); (void)close(fd4); @@ -164,14 +165,6 @@ pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) ifend = (struct lifreq *)(buf + ifc.lifc_len); for (; ifrp < ifend; ifrp++) { - /* - * IPv6 or not? - */ - if (((struct sockaddr *)&ifrp->lifr_addr)->sa_family == AF_INET6) - fd = fd6; - else - fd = fd4; - /* * Skip entries that begin with "dummy". * XXX - what are these? Is this Linux-specific? @@ -180,27 +173,23 @@ pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) if (strncmp(ifrp->lifr_name, "dummy", 5) == 0) continue; -#ifdef HAVE_SOLARIS /* - * Skip entries that have a ":" followed by a number - * at the end - those are Solaris virtual interfaces - * on which you can't capture. + * Can we capture on this device? */ - p = strchr(ifrp->lifr_name, ':'); - if (p != NULL) { + if (!(*check_usable)(ifrp->lifr_name)) { /* - * We have a ":"; is it followed by a number? + * No. */ - while (isdigit((unsigned char)*p)) - p++; - if (*p == '\0') { - /* - * All digits after the ":" until the end. - */ - continue; - } + continue; } -#endif + + /* + * IPv6 or not? + */ + if (((struct sockaddr *)&ifrp->lifr_addr)->sa_family == AF_INET6) + fd = fd6; + else + fd = fd4; /* * Get the flags for this interface. @@ -210,7 +199,7 @@ pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) if (ioctl(fd, SIOCGLIFFLAGS, (char *)&ifrflags) < 0) { if (errno == ENXIO) continue; - (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, + (void)pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "SIOCGLIFFLAGS: %.*s: %s", (int)sizeof(ifrflags.lifr_name), ifrflags.lifr_name, @@ -233,7 +222,7 @@ pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) */ netmask = NULL; } else { - (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, + (void)pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "SIOCGLIFNETMASK: %.*s: %s", (int)sizeof(ifrnetmask.lifr_name), ifrnetmask.lifr_name, @@ -261,7 +250,7 @@ pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) */ broadaddr = NULL; } else { - (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, + (void)pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "SIOCGLIFBRDADDR: %.*s: %s", (int)sizeof(ifrbroadaddr.lifr_name), ifrbroadaddr.lifr_name, @@ -296,7 +285,7 @@ pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) */ dstaddr = NULL; } else { - (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, + (void)pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "SIOCGLIFDSTADDR: %.*s: %s", (int)sizeof(ifrdstaddr.lifr_name), ifrdstaddr.lifr_name, @@ -341,7 +330,8 @@ pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) * Add information for this address to the list. */ if (add_addr_to_iflist(&devlist, ifrp->lifr_name, - ifrflags.lifr_flags, (struct sockaddr *)&ifrp->lifr_addr, + if_flags_to_pcap_flags(ifrp->lifr_name, ifrflags.lifr_flags), + (struct sockaddr *)&ifrp->lifr_addr, sizeof (struct sockaddr_storage), netmask, sizeof (struct sockaddr_storage), broadaddr, sizeof (struct sockaddr_storage), diff --git a/libpcap/fad-helpers.c b/libpcap/fad-helpers.c new file mode 100644 index 000000000..4860bc55c --- /dev/null +++ b/libpcap/fad-helpers.c @@ -0,0 +1,884 @@ +/* -*- Mode: c; tab-width: 8; indent-tabs-mode: 1; c-basic-offset: 8; -*- */ +/* + * Copyright (c) 1994, 1995, 1996, 1997, 1998 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the Computer Systems + * Engineering Group at Lawrence Berkeley Laboratory. + * 4. Neither the name of the University nor of the Laboratory may be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef _WIN32 +#include +#else /* _WIN32 */ + +#include +#ifndef MSDOS +#include +#endif +#include +#include +#ifdef HAVE_SYS_SOCKIO_H +#include +#endif + +struct mbuf; /* Squelch compiler warnings on some platforms for */ +struct rtentry; /* declarations in */ +#include +#include +#endif /* _WIN32 */ + +#include +#include +#include +#include +#include +#include +#if !defined(_WIN32) && !defined(__BORLANDC__) +#include +#endif /* !_WIN32 && !__BORLANDC__ */ +#ifdef HAVE_LIMITS_H +#include +#else +#define INT_MAX 2147483647 +#endif + +#include "pcap-int.h" + +#ifdef HAVE_OS_PROTO_H +#include "os-proto.h" +#endif + +#ifndef _WIN32 +/* Not all systems have IFF_LOOPBACK */ +#ifdef IFF_LOOPBACK +#define ISLOOPBACK(name, flags) ((flags) & IFF_LOOPBACK) +#else +#define ISLOOPBACK(name, flags) ((name)[0] == 'l' && (name)[1] == 'o' && \ + (isdigit((unsigned char)((name)[2])) || (name)[2] == '\0')) +#endif + +#ifdef IFF_UP +#define ISUP(flags) ((flags) & IFF_UP) +#else +#define ISUP(flags) 0 +#endif + +#ifdef IFF_RUNNING +#define ISRUNNING(flags) ((flags) & IFF_RUNNING) +#else +#define ISRUNNING(flags) 0 +#endif + +/* + * Map UN*X-style interface flags to libpcap flags. + */ +bpf_u_int32 +if_flags_to_pcap_flags(const char *name _U_, u_int if_flags) +{ + bpf_u_int32 pcap_flags; + + pcap_flags = 0; + if (ISLOOPBACK(name, if_flags)) + pcap_flags |= PCAP_IF_LOOPBACK; + if (ISUP(if_flags)) + pcap_flags |= PCAP_IF_UP; + if (ISRUNNING(if_flags)) + pcap_flags |= PCAP_IF_RUNNING; + return (pcap_flags); +} +#endif + +static struct sockaddr * +dup_sockaddr(struct sockaddr *sa, size_t sa_length) +{ + struct sockaddr *newsa; + + if ((newsa = malloc(sa_length)) == NULL) + return (NULL); + return (memcpy(newsa, sa, sa_length)); +} + +/* + * Construct a "figure of merit" for an interface, for use when sorting + * the list of interfaces, in which interfaces that are up are superior + * to interfaces that aren't up, interfaces that are up and running are + * superior to interfaces that are up but not running, and non-loopback + * interfaces that are up and running are superior to loopback interfaces, + * and interfaces with the same flags have a figure of merit that's higher + * the lower the instance number. + * + * The goal is to try to put the interfaces most likely to be useful for + * capture at the beginning of the list. + * + * The figure of merit, which is lower the "better" the interface is, + * has the uppermost bit set if the interface isn't running, the bit + * below that set if the interface isn't up, the bit below that set + * if the interface is a loopback interface, and the interface index + * in the 29 bits below that. (Yes, we assume u_int is 32 bits.) + */ +static u_int +get_figure_of_merit(pcap_if_t *dev) +{ + const char *cp; + u_int n; + + if (strcmp(dev->name, "any") == 0) { + /* + * Give the "any" device an artificially high instance + * number, so it shows up after all other non-loopback + * interfaces. + */ + n = 0x1FFFFFFF; /* 29 all-1 bits */ + } else { + /* + * A number at the end of the device name string is + * assumed to be a unit number. + */ + cp = dev->name + strlen(dev->name) - 1; + while (cp-1 >= dev->name && *(cp-1) >= '0' && *(cp-1) <= '9') + cp--; + if (*cp >= '0' && *cp <= '9') + n = atoi(cp); + else + n = 0; + } + if (!(dev->flags & PCAP_IF_RUNNING)) + n |= 0x80000000; + if (!(dev->flags & PCAP_IF_UP)) + n |= 0x40000000; + if (dev->flags & PCAP_IF_LOOPBACK) + n |= 0x20000000; + return (n); +} + +/* + * Try to get a description for a given device. + * Returns a mallocated description if it could and NULL if it couldn't. + * + * XXX - on FreeBSDs that support it, should it get the sysctl named + * "dev.{adapter family name}.{adapter unit}.%desc" to get a description + * of the adapter? Note that "dev.an.0.%desc" is "Aironet PC4500/PC4800" + * with my Cisco 350 card, so the name isn't entirely descriptive. The + * "dev.an.0.%pnpinfo" has a better description, although one might argue + * that the problem is really a driver bug - if it can find out that it's + * a Cisco 340 or 350, rather than an old Aironet card, it should use + * that in the description. + * + * Do NetBSD, DragonflyBSD, or OpenBSD support this as well? FreeBSD + * and OpenBSD let you get a description, but it's not generated by the OS, + * it's set with another ioctl that ifconfig supports; we use that to get + * a description in FreeBSD and OpenBSD, but if there is no such + * description available, it still might be nice to get some description + * string based on the device type or something such as that. + * + * In OS X, the System Configuration framework can apparently return + * names in 10.4 and later. + * + * It also appears that freedesktop.org's HAL offers an "info.product" + * string, but the HAL specification says it "should not be used in any + * UI" and "subsystem/capability specific properties" should be used + * instead and, in any case, I think HAL is being deprecated in + * favor of other stuff such as DeviceKit. DeviceKit doesn't appear + * to have any obvious product information for devices, but maybe + * I haven't looked hard enough. + * + * Using the System Configuration framework, or HAL, or DeviceKit, or + * whatever, would require that libpcap applications be linked with + * the frameworks/libraries in question. That shouldn't be a problem + * for programs linking with the shared version of libpcap (unless + * you're running on AIX - which I think is the only UN*X that doesn't + * support linking a shared library with other libraries on which it + * depends, and having an executable linked only with the first shared + * library automatically pick up the other libraries when started - + * and using HAL or whatever). Programs linked with the static + * version of libpcap would have to use pcap-config with the --static + * flag in order to get the right linker flags in order to pick up + * the additional libraries/frameworks; those programs need that anyway + * for libpcap 1.1 and beyond on Linux, as, by default, it requires + * -lnl. + * + * Do any other UN*Xes, or desktop environments support getting a + * description? + */ +static char * +get_if_description(const char *name) +{ +#ifdef SIOCGIFDESCR + char *description = NULL; + int s; + struct ifreq ifrdesc; +#ifndef IFDESCRSIZE + size_t descrlen = 64; +#else + size_t descrlen = IFDESCRSIZE; +#endif /* IFDESCRSIZE */ + + /* + * Get the description for the interface. + */ + memset(&ifrdesc, 0, sizeof ifrdesc); + strlcpy(ifrdesc.ifr_name, name, sizeof ifrdesc.ifr_name); + s = socket(AF_INET, SOCK_DGRAM, 0); + if (s >= 0) { +#ifdef __FreeBSD__ + /* + * On FreeBSD, if the buffer isn't big enough for the + * description, the ioctl succeeds, but the description + * isn't copied, ifr_buffer.length is set to the description + * length, and ifr_buffer.buffer is set to NULL. + */ + for (;;) { + free(description); + if ((description = malloc(descrlen)) != NULL) { + ifrdesc.ifr_buffer.buffer = description; + ifrdesc.ifr_buffer.length = descrlen; + if (ioctl(s, SIOCGIFDESCR, &ifrdesc) == 0) { + if (ifrdesc.ifr_buffer.buffer == + description) + break; + else + descrlen = ifrdesc.ifr_buffer.length; + } else { + /* + * Failed to get interface description. + */ + free(description); + description = NULL; + break; + } + } else + break; + } +#else /* __FreeBSD__ */ + /* + * The only other OS that currently supports + * SIOCGIFDESCR is OpenBSD, and it has no way + * to get the description length - it's clamped + * to a maximum of IFDESCRSIZE. + */ + if ((description = malloc(descrlen)) != NULL) { + ifrdesc.ifr_data = (caddr_t)description; + if (ioctl(s, SIOCGIFDESCR, &ifrdesc) != 0) { + /* + * Failed to get interface description. + */ + free(description); + description = NULL; + } + } +#endif /* __FreeBSD__ */ + close(s); + if (description != NULL && strlen(description) == 0) { + /* + * Description is empty, so discard it. + */ + free(description); + description = NULL; + } + } + +#ifdef __FreeBSD__ + /* + * For FreeBSD, if we didn't get a description, and this is + * a device with a name of the form usbusN, label it as a USB + * bus. + */ + if (description == NULL) { + if (strncmp(name, "usbus", 5) == 0) { + /* + * OK, it begins with "usbus". + */ + long busnum; + char *p; + + errno = 0; + busnum = strtol(name + 5, &p, 10); + if (errno == 0 && p != name + 5 && *p == '\0' && + busnum >= 0 && busnum <= INT_MAX) { + /* + * OK, it's a valid number that's not + * bigger than INT_MAX. Construct + * a description from it. + */ + static const char descr_prefix[] = "USB bus number "; + size_t descr_size; + + /* + * Allow enough room for a 32-bit bus number. + * sizeof (descr_prefix) includes the + * terminating NUL. + */ + descr_size = sizeof (descr_prefix) + 10; + description = malloc(descr_size); + if (description != NULL) { + pcap_snprintf(description, descr_size, + "%s%ld", descr_prefix, busnum); + } + } + } + } +#endif + return (description); +#else /* SIOCGIFDESCR */ + return (NULL); +#endif /* SIOCGIFDESCR */ +} + +/* + * Look for a given device in the specified list of devices. + * + * If we find it, return 0 and set *curdev_ret to point to it. + * + * If we don't find it, check whether we can open it: + * + * If that fails with PCAP_ERROR_NO_SUCH_DEVICE or + * PCAP_ERROR_IFACE_NOT_UP, don't attempt to add an entry for + * it, as that probably means it exists but doesn't support + * packet capture. + * + * Otherwise, attempt to add an entry for it, with the specified + * ifnet flags and description, and, if that succeeds, return 0 + * and set *curdev_ret to point to the new entry, otherwise + * return PCAP_ERROR and set errbuf to an error message. If we + * weren't given a description, try to get one. + */ +int +add_or_find_if(pcap_if_t **curdev_ret, pcap_if_t **alldevs, const char *name, + bpf_u_int32 flags, const char *description, char *errbuf) +{ + pcap_t *p; + pcap_if_t *curdev, *prevdev, *nextdev; + u_int this_figure_of_merit, nextdev_figure_of_merit; + char open_errbuf[PCAP_ERRBUF_SIZE]; + int ret; + + /* + * Is there already an entry in the list for this interface? + */ + for (curdev = *alldevs; curdev != NULL; curdev = curdev->next) { + if (strcmp(name, curdev->name) == 0) + break; /* yes, we found it */ + } + + if (curdev == NULL) { + /* + * No, we didn't find it. + * + * Can we open this interface for live capture? + * + * We do this check so that interfaces that are + * supplied by the interface enumeration mechanism + * we're using but that don't support packet capture + * aren't included in the list. Loopback interfaces + * on Solaris are an example of this; we don't just + * omit loopback interfaces on all platforms because + * you *can* capture on loopback interfaces on some + * OSes. + * + * On OS X, we don't do this check if the device + * name begins with "wlt"; at least some versions + * of OS X offer monitor mode capturing by having + * a separate "monitor mode" device for each wireless + * adapter, rather than by implementing the ioctls + * that {Free,Net,Open,DragonFly}BSD provide. + * Opening that device puts the adapter into monitor + * mode, which, at least for some adapters, causes + * them to deassociate from the network with which + * they're associated. + * + * Instead, we try to open the corresponding "en" + * device (so that we don't end up with, for users + * without sufficient privilege to open capture + * devices, a list of adapters that only includes + * the wlt devices). + */ +#ifdef __APPLE__ + if (strncmp(name, "wlt", 3) == 0) { + char *en_name; + size_t en_name_len; + + /* + * Try to allocate a buffer for the "en" + * device's name. + */ + en_name_len = strlen(name) - 1; + en_name = malloc(en_name_len + 1); + if (en_name == NULL) { + (void)pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, + "malloc: %s", pcap_strerror(errno)); + return (-1); + } + strcpy(en_name, "en"); + strcat(en_name, name + 3); + p = pcap_create(en_name, open_errbuf); + free(en_name); + } else +#endif /* __APPLE */ + p = pcap_create(name, open_errbuf); + if (p == NULL) { + /* + * The attempt to create the pcap_t failed; + * that's probably an indication that we're + * out of memory. + * + * Don't bother including this interface, + * but don't treat it as an error. + */ + *curdev_ret = NULL; + return (0); + } + /* Small snaplen, so we don't try to allocate much memory. */ + pcap_set_snaplen(p, 68); + ret = pcap_activate(p); + pcap_close(p); + switch (ret) { + + case PCAP_ERROR_NO_SUCH_DEVICE: + case PCAP_ERROR_IFACE_NOT_UP: + /* + * We expect these two errors - they're the + * reason we try to open the device. + * + * PCAP_ERROR_NO_SUCH_DEVICE typically means + * "there's no such device *known to the + * OS's capture mechanism*", so, even though + * it might be a valid network interface, you + * can't capture on it (e.g., the loopback + * device in Solaris up to Solaris 10, or + * the vmnet devices in OS X with VMware + * Fusion). We don't include those devices + * in our list of devices, as there's no + * point in doing so - they're not available + * for capture. + * + * PCAP_ERROR_IFACE_NOT_UP means that the + * OS's capture mechanism doesn't work on + * interfaces not marked as up; some capture + * mechanisms *do* support that, so we no + * longer reject those interfaces out of hand, + * but we *do* want to reject them if they + * can't be opened for capture. + */ + *curdev_ret = NULL; + return (0); + } + + /* + * Yes, we can open it, or we can't, for some other + * reason. + * + * If we can open it, we want to offer it for + * capture, as you can capture on it. If we can't, + * we want to offer it for capture, so that, if + * the user tries to capture on it, they'll get + * an error and they'll know why they can't + * capture on it (e.g., insufficient permissions) + * or they'll report it as a problem (and then + * have the error message to provide as information). + * + * Allocate a new entry. + */ + curdev = malloc(sizeof(pcap_if_t)); + if (curdev == NULL) { + (void)pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, + "malloc: %s", pcap_strerror(errno)); + return (-1); + } + + /* + * Fill in the entry. + */ + curdev->next = NULL; + curdev->name = strdup(name); + if (curdev->name == NULL) { + (void)pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, + "malloc: %s", pcap_strerror(errno)); + free(curdev); + return (-1); + } + if (description == NULL) { + /* + * We weren't handed a description for the + * interface, so see if we can generate one + * ourselves. + */ + curdev->description = get_if_description(name); + } else { + /* + * We were handed a description; make a copy. + */ + curdev->description = strdup(description); + if (curdev->description == NULL) { + (void)pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, + "malloc: %s", pcap_strerror(errno)); + free(curdev->name); + free(curdev); + return (-1); + } + } + curdev->addresses = NULL; /* list starts out as empty */ + curdev->flags = flags; + + /* + * Add it to the list, in the appropriate location. + * First, get the "figure of merit" for this + * interface. + */ + this_figure_of_merit = get_figure_of_merit(curdev); + + /* + * Now look for the last interface with an figure of merit + * less than or equal to the new interface's figure of + * merit. + * + * We start with "prevdev" being NULL, meaning we're before + * the first element in the list. + */ + prevdev = NULL; + for (;;) { + /* + * Get the interface after this one. + */ + if (prevdev == NULL) { + /* + * The next element is the first element. + */ + nextdev = *alldevs; + } else + nextdev = prevdev->next; + + /* + * Are we at the end of the list? + */ + if (nextdev == NULL) { + /* + * Yes - we have to put the new entry + * after "prevdev". + */ + break; + } + + /* + * Is the new interface's figure of merit less + * than the next interface's figure of merit, + * meaning that the new interface is better + * than the next interface? + */ + nextdev_figure_of_merit = get_figure_of_merit(nextdev); + if (this_figure_of_merit < nextdev_figure_of_merit) { + /* + * Yes - we should put the new entry + * before "nextdev", i.e. after "prevdev". + */ + break; + } + + prevdev = nextdev; + } + + /* + * Insert before "nextdev". + */ + curdev->next = nextdev; + + /* + * Insert after "prevdev" - unless "prevdev" is null, + * in which case this is the first interface. + */ + if (prevdev == NULL) { + /* + * This is the first interface. Pass back a + * pointer to it, and put "curdev" before + * "nextdev". + */ + *alldevs = curdev; + } else + prevdev->next = curdev; + } + + *curdev_ret = curdev; + return (0); +} + +/* + * Try to get a description for a given device, and then look for that + * device in the specified list of devices. + * + * If we find it, then, if the specified address isn't null, add it to + * the list of addresses for the device and return 0. + * + * If we don't find it, check whether we can open it: + * + * If that fails with PCAP_ERROR_NO_SUCH_DEVICE or + * PCAP_ERROR_IFACE_NOT_UP, don't attempt to add an entry for + * it, as that probably means it exists but doesn't support + * packet capture. + * + * Otherwise, attempt to add an entry for it, with the specified + * ifnet flags, and, if that succeeds, add the specified address + * to its list of addresses if that address is non-null, set + * *curdev_ret to point to the new entry, and return 0, otherwise + * return PCAP_ERROR and set errbuf to an error message. + * + * (We can get called with a null address because we might get a list + * of interface name/address combinations from the underlying OS, with + * the address being absent in some cases, rather than a list of + * interfaces with each interface having a list of addresses, so this + * call may be the only call made to add to the list, and we want to + * add interfaces even if they have no addresses.) + */ +int +add_addr_to_iflist(pcap_if_t **alldevs, const char *name, bpf_u_int32 flags, + struct sockaddr *addr, size_t addr_size, + struct sockaddr *netmask, size_t netmask_size, + struct sockaddr *broadaddr, size_t broadaddr_size, + struct sockaddr *dstaddr, size_t dstaddr_size, + char *errbuf) +{ + pcap_if_t *curdev; + + if (add_or_find_if(&curdev, alldevs, name, flags, NULL, errbuf) == -1) { + /* + * Error - give up. + */ + return (-1); + } + if (curdev == NULL) { + /* + * Device wasn't added because it can't be opened. + * Not a fatal error. + */ + return (0); + } + + if (addr == NULL) { + /* + * There's no address to add; this entry just meant + * "here's a new interface". + */ + return (0); + } + + /* + * "curdev" is an entry for this interface, and we have an + * address for it; add an entry for that address to the + * interface's list of addresses. + * + * Allocate the new entry and fill it in. + */ + return (add_addr_to_dev(curdev, addr, addr_size, netmask, + netmask_size, broadaddr, broadaddr_size, dstaddr, + dstaddr_size, errbuf)); +} + +/* + * Add an entry to the list of addresses for an interface. + * "curdev" is the entry for that interface. + * If this is the first IP address added to the interface, move it + * in the list as appropriate. + */ +int +add_addr_to_dev(pcap_if_t *curdev, + struct sockaddr *addr, size_t addr_size, + struct sockaddr *netmask, size_t netmask_size, + struct sockaddr *broadaddr, size_t broadaddr_size, + struct sockaddr *dstaddr, size_t dstaddr_size, + char *errbuf) +{ + pcap_addr_t *curaddr, *prevaddr, *nextaddr; + + curaddr = malloc(sizeof(pcap_addr_t)); + if (curaddr == NULL) { + (void)pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, + "malloc: %s", pcap_strerror(errno)); + return (-1); + } + + curaddr->next = NULL; + if (addr != NULL) { + curaddr->addr = dup_sockaddr(addr, addr_size); + if (curaddr->addr == NULL) { + (void)pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, + "malloc: %s", pcap_strerror(errno)); + free(curaddr); + return (-1); + } + } else + curaddr->addr = NULL; + + if (netmask != NULL) { + curaddr->netmask = dup_sockaddr(netmask, netmask_size); + if (curaddr->netmask == NULL) { + (void)pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, + "malloc: %s", pcap_strerror(errno)); + if (curaddr->addr != NULL) + free(curaddr->addr); + free(curaddr); + return (-1); + } + } else + curaddr->netmask = NULL; + + if (broadaddr != NULL) { + curaddr->broadaddr = dup_sockaddr(broadaddr, broadaddr_size); + if (curaddr->broadaddr == NULL) { + (void)pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, + "malloc: %s", pcap_strerror(errno)); + if (curaddr->netmask != NULL) + free(curaddr->netmask); + if (curaddr->addr != NULL) + free(curaddr->addr); + free(curaddr); + return (-1); + } + } else + curaddr->broadaddr = NULL; + + if (dstaddr != NULL) { + curaddr->dstaddr = dup_sockaddr(dstaddr, dstaddr_size); + if (curaddr->dstaddr == NULL) { + (void)pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, + "malloc: %s", pcap_strerror(errno)); + if (curaddr->broadaddr != NULL) + free(curaddr->broadaddr); + if (curaddr->netmask != NULL) + free(curaddr->netmask); + if (curaddr->addr != NULL) + free(curaddr->addr); + free(curaddr); + return (-1); + } + } else + curaddr->dstaddr = NULL; + + /* + * Find the end of the list of addresses. + */ + for (prevaddr = curdev->addresses; prevaddr != NULL; prevaddr = nextaddr) { + nextaddr = prevaddr->next; + if (nextaddr == NULL) { + /* + * This is the end of the list. + */ + break; + } + } + + if (prevaddr == NULL) { + /* + * The list was empty; this is the first member. + */ + curdev->addresses = curaddr; + } else { + /* + * "prevaddr" is the last member of the list; append + * this member to it. + */ + prevaddr->next = curaddr; + } + + return (0); +} + +/* + * Look for a given device in the specified list of devices. + * + * If we find it, return 0. + * + * If we don't find it, check whether we can open it: + * + * If that fails with PCAP_ERROR_NO_SUCH_DEVICE or + * PCAP_ERROR_IFACE_NOT_UP, don't attempt to add an entry for + * it, as that probably means it exists but doesn't support + * packet capture. + * + * Otherwise, attempt to add an entry for it, with the specified + * ifnet flags and description, and, if that succeeds, return 0 + * and set *curdev_ret to point to the new entry, otherwise + * return PCAP_ERROR and set errbuf to an error message. + */ +int +pcap_add_if(pcap_if_t **devlist, const char *name, u_int flags, + const char *description, char *errbuf) +{ + pcap_if_t *curdev; + + return (add_or_find_if(&curdev, devlist, name, flags, description, + errbuf)); +} + + +/* + * Free a list of interfaces. + */ +void +pcap_freealldevs(pcap_if_t *alldevs) +{ + pcap_if_t *curdev, *nextdev; + pcap_addr_t *curaddr, *nextaddr; + + for (curdev = alldevs; curdev != NULL; curdev = nextdev) { + nextdev = curdev->next; + + /* + * Free all addresses. + */ + for (curaddr = curdev->addresses; curaddr != NULL; curaddr = nextaddr) { + nextaddr = curaddr->next; + if (curaddr->addr) + free(curaddr->addr); + if (curaddr->netmask) + free(curaddr->netmask); + if (curaddr->broadaddr) + free(curaddr->broadaddr); + if (curaddr->dstaddr) + free(curaddr->dstaddr); + free(curaddr); + } + + /* + * Free the name string. + */ + free(curdev->name); + + /* + * Free the description string, if any. + */ + if (curdev->description != NULL) + free(curdev->description); + + /* + * Free the interface. + */ + free(curdev); + } +} diff --git a/libpcap/fad-sita.c b/libpcap/fad-sita.c deleted file mode 100644 index 34ddf1d85..000000000 --- a/libpcap/fad-sita.c +++ /dev/null @@ -1,59 +0,0 @@ -/* - * fad-sita.c: Packet capture interface additions for SITA ACN devices - * - * Copyright (c) 2007 Fulko Hew, SITA INC Canada, Inc - * - * License: BSD - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. The names of the authors may not be used to endorse or promote - * products derived from this software without specific prior - * written permission. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include "pcap-int.h" - -#include "pcap-sita.h" - -extern pcap_if_t *acn_if_list; /* pcap's list of available interfaces */ - -int pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) { - - //printf("pcap_findalldevs()\n"); // fulko - - *alldevsp = 0; /* initialize the returned variables before we do anything */ - strcpy(errbuf, ""); - if (acn_parse_hosts_file(errbuf)) /* scan the hosts file for potential IOPs */ - { - //printf("pcap_findalldevs() returning BAD after parsehosts\n"); // fulko - return -1; - } - //printf("pcap_findalldevs() got hostlist now finding devs\n"); // fulko - if (acn_findalldevs(errbuf)) /* then ask the IOPs for their monitorable devices */ - { - //printf("pcap_findalldevs() returning BAD after findalldevs\n"); // fulko - return -1; - } - *alldevsp = acn_if_list; - acn_if_list = 0; /* then forget our list head, because someone will call pcap_freealldevs() to empty the malloc'ed stuff */ - //printf("pcap_findalldevs() returning ZERO OK\n"); // fulko - return 0; -} diff --git a/libpcap/fad-win32.c b/libpcap/fad-win32.c deleted file mode 100644 index f849d4093..000000000 --- a/libpcap/fad-win32.c +++ /dev/null @@ -1,283 +0,0 @@ -/* - * Copyright (c) 2002 - 2005 NetGroup, Politecnico di Torino (Italy) - * Copyright (c) 2005 - 2006 CACE Technologies, Davis (California) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Politecnico di Torino, CACE Technologies - * nor the names of its contributors may be used to endorse or promote - * products derived from this software without specific prior written - * permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include - -#include - -static int -pcap_add_if_win32(pcap_if_t **devlist, char *name, const char *desc, - char *errbuf) -{ - pcap_if_t *curdev; - npf_if_addr if_addrs[MAX_NETWORK_ADDRESSES]; - LONG if_addr_size; - int res = 0; - HANDLE pcapMutex; - DWORD wait; - - if_addr_size = MAX_NETWORK_ADDRESSES; - - /* - * Add an entry for this interface, with no addresses. - */ - if (add_or_find_if(&curdev, devlist, name, 0, desc, errbuf) == -1) { - /* - * Failure. - */ - return (-1); - } - - /* - * Get the list of addresses for the interface. - */ - pcapMutex = CreateMutex(NULL, 0, "Global\\DnetPcapHangAvoidanceMutex"); - wait = WaitForSingleObject(pcapMutex, INFINITE); - if (!PacketGetNetInfoEx((void *)name, if_addrs, &if_addr_size)) { - /* - * Failure. - * - * We don't return an error, because this can happen with - * NdisWan interfaces, and we want to supply them even - * if we can't supply their addresses. - * - * We return an entry with an empty address list. - */ - if (wait == WAIT_ABANDONED || wait == WAIT_OBJECT_0) { - ReleaseMutex(pcapMutex); - } - CloseHandle(pcapMutex); - return (0); - } - if (wait == WAIT_ABANDONED || wait == WAIT_OBJECT_0) { - ReleaseMutex(pcapMutex); - } - CloseHandle(pcapMutex); - - /* - * Now add the addresses. - */ - while (if_addr_size-- > 0) { - /* - * "curdev" is an entry for this interface; add an entry for - * this address to its list of addresses. - */ - if(curdev == NULL) - break; - res = add_addr_to_dev(curdev, - (struct sockaddr *)&if_addrs[if_addr_size].IPAddress, - sizeof (struct sockaddr_storage), - (struct sockaddr *)&if_addrs[if_addr_size].SubnetMask, - sizeof (struct sockaddr_storage), - (struct sockaddr *)&if_addrs[if_addr_size].Broadcast, - sizeof (struct sockaddr_storage), - NULL, - 0, - errbuf); - if (res == -1) { - /* - * Failure. - */ - break; - } - } - - return (res); -} - - -/* - * Get a list of all interfaces that are up and that we can open. - * Returns -1 on error, 0 otherwise. - * The list, as returned through "alldevsp", may be null if no interfaces - * were up and could be opened. - * - * Win32 implementation, based on WinPcap - */ -int -pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) -{ - pcap_if_t *devlist = NULL; - int ret = 0; - const char *desc; - char *AdaptersName; - ULONG NameLength; - char *name; - HANDLE pcapMutex; - DWORD wait; - - pcapMutex = CreateMutex(NULL, 0, "Global\\DnetPcapHangAvoidanceMutex"); - wait = WaitForSingleObject(pcapMutex, INFINITE); - - /* - * Find out how big a buffer we need. - * - * This call should always return FALSE; if the error is - * ERROR_INSUFFICIENT_BUFFER, NameLength will be set to - * the size of the buffer we need, otherwise there's a - * problem, and NameLength should be set to 0. - * - * It shouldn't require NameLength to be set, but, - * at least as of WinPcap 4.1.3, it checks whether - * NameLength is big enough before it checks for a - * NULL buffer argument, so, while it'll still do - * the right thing if NameLength is uninitialized and - * whatever junk happens to be there is big enough - * (because the pointer argument will be null), it's - * still reading an uninitialized variable. - */ - NameLength = 0; - if (!PacketGetAdapterNames(NULL, &NameLength)) - { - DWORD last_error = GetLastError(); - if (wait == WAIT_ABANDONED || wait == WAIT_OBJECT_0) { - ReleaseMutex(pcapMutex); - } - CloseHandle(pcapMutex); - - if (last_error != ERROR_INSUFFICIENT_BUFFER) - { - snprintf(errbuf, PCAP_ERRBUF_SIZE, - "PacketGetAdapterNames: %s", - pcap_win32strerror()); - return (-1); - } - } - if (wait == WAIT_ABANDONED || wait == WAIT_OBJECT_0) { - ReleaseMutex(pcapMutex); - } - CloseHandle(pcapMutex); - - if (NameLength > 0) - AdaptersName = (char*) malloc(NameLength); - else - { - *alldevsp = NULL; - return 0; - } - if (AdaptersName == NULL) - { - snprintf(errbuf, PCAP_ERRBUF_SIZE, "Cannot allocate enough memory to list the adapters."); - return (-1); - } - - pcapMutex = CreateMutex(NULL, 0, "Global\\DnetPcapHangAvoidanceMutex"); - wait = WaitForSingleObject(pcapMutex, INFINITE); - if (!PacketGetAdapterNames(AdaptersName, &NameLength)) { - snprintf(errbuf, PCAP_ERRBUF_SIZE, - "PacketGetAdapterNames: %s", - pcap_win32strerror()); - free(AdaptersName); - if (wait == WAIT_ABANDONED || wait == WAIT_OBJECT_0) { - ReleaseMutex(pcapMutex); - } - CloseHandle(pcapMutex); - return (-1); - } - if (wait == WAIT_ABANDONED || wait == WAIT_OBJECT_0) { - ReleaseMutex(pcapMutex); - } - CloseHandle(pcapMutex); - - /* - * "PacketGetAdapterNames()" returned a list of - * null-terminated ASCII interface name strings, - * terminated by a null string, followed by a list - * of null-terminated ASCII interface description - * strings, terminated by a null string. - * This means there are two ASCII nulls at the end - * of the first list. - * - * Find the end of the first list; that's the - * beginning of the second list. - */ - desc = &AdaptersName[0]; - while (*desc != '\0' || *(desc + 1) != '\0') - desc++; - - /* - * Found it - "desc" points to the first of the two - * nulls at the end of the list of names, so the - * first byte of the list of descriptions is two bytes - * after it. - */ - desc += 2; - - /* - * Loop over the elements in the first list. - */ - name = &AdaptersName[0]; - while (*name != '\0') { - /* - * Add an entry for this interface. - */ - if (pcap_add_if_win32(&devlist, name, desc, errbuf) == -1) { - /* - * Failure. - */ - ret = -1; - break; - } - name += strlen(name) + 1; - desc += strlen(desc) + 1; - } - - if (ret != -1) { - /* - * We haven't had any errors yet; do any platform-specific - * operations to add devices. - */ - if (pcap_platform_finddevs(&devlist, errbuf) < 0) - ret = -1; - } - - if (ret == -1) { - /* - * We had an error; free the list we've been constructing. - */ - if (devlist != NULL) { - pcap_freealldevs(devlist); - devlist = NULL; - } - } - - *alldevsp = devlist; - free(AdaptersName); - return (ret); -} diff --git a/libpcap/gen_version_c.sh b/libpcap/gen_version_c.sh new file mode 100755 index 000000000..d5a5e75bf --- /dev/null +++ b/libpcap/gen_version_c.sh @@ -0,0 +1,11 @@ +#! /bin/sh +echo '#include ' > "$2" +echo 'PCAP_API_DEF' >> "$2" +if grep GIT "$1" >/dev/null; then + read ver <"$1" + echo $ver | tr -d '\012' + date +_%Y_%m_%d +else + cat "$1" +fi | sed -e 's/.*/char pcap_version[] = "&";/' >> "$2" + diff --git a/libpcap/gen_version_header.sh b/libpcap/gen_version_header.sh new file mode 100755 index 000000000..6b4b82da1 --- /dev/null +++ b/libpcap/gen_version_header.sh @@ -0,0 +1,19 @@ +#! /bin/sh +print_version_string() +{ + if grep GIT "$1" >/dev/null + then + read ver <"$1" + echo $ver | tr -d '\012' + date +_%Y_%m_%d + else + cat "$1" + fi +} +if test $# != 3 +then + echo "Usage: gen_version_header.sh