diff --git a/CMakeLists.txt b/CMakeLists.txt index 51a5d577bc..c7749e3b3f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1609,24 +1609,6 @@ else() endif() set(EXTCAP_INSTALL_FULL_LIBDIR "${CMAKE_INSTALL_PREFIX}/${EXTCAP_INSTALL_LIBDIR}") -if(APPLE) - # - # As https://developer.apple.com/library/archive/technotes/tn2206/_index.html - # says, - # - # "Note that a location where code is expected to reside cannot generally - # contain directories full of nested code, because those directories tend - # to be interpreted as bundles. So this occasional practice is not - # recommended and not officially supported. If you do do this, do not use - # periods in the directory names. The code signing machinery interprets - # directories with periods in their names as code bundles and will reject - # them if they don't conform to the expected code bundle layout." - # - set(PLUGIN_PATH_ID "${PROJECT_MAJOR_VERSION}-${PROJECT_MINOR_VERSION}") -else() - set(PLUGIN_PATH_ID "${PROJECT_MAJOR_VERSION}.${PROJECT_MINOR_VERSION}") -endif() - # Directory where plugins and Lua dissectors can be found. if(WIN32 AND NOT USE_MSYSTEM) set(PLUGIN_INSTALL_LIBDIR "plugins" CACHE INTERNAL "The plugin dir") @@ -1634,8 +1616,6 @@ else() set(PLUGIN_INSTALL_LIBDIR "${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/plugins" CACHE INTERNAL "The plugin dir") endif() set(PLUGIN_INSTALL_FULL_LIBDIR "${CMAKE_INSTALL_PREFIX}/${PLUGIN_INSTALL_LIBDIR}") -set(PLUGIN_INSTALL_VERSION_LIBDIR "${PLUGIN_INSTALL_LIBDIR}/${PLUGIN_PATH_ID}") -set(PLUGIN_VERSION_DIR "plugins/${PLUGIN_PATH_ID}") add_subdirectory( capture ) add_subdirectory( doc ) @@ -1788,22 +1768,22 @@ endif() if(ENABLE_APPLICATION_BUNDLE) if(CMAKE_CFG_INTDIR STREQUAL ".") - set(_plugin_dir "${CMAKE_BINARY_DIR}/run/Wireshark.app/Contents/PlugIns/wireshark/${PLUGIN_PATH_ID}") + set(_plugin_dir "${CMAKE_BINARY_DIR}/run/Wireshark.app/Contents/PlugIns/wireshark") else() # Xcode - set(_plugin_dir "${CMAKE_BINARY_DIR}/run/$/Wireshark.app/Contents/PlugIns/wireshark/${PLUGIN_PATH_ID}") + set(_plugin_dir "${CMAKE_BINARY_DIR}/run/$/Wireshark.app/Contents/PlugIns/wireshark") endif() if(CMAKE_CFG_INTDIR STREQUAL ".") - set(_logray_plugin_dir "${CMAKE_BINARY_DIR}/run/Logray.app/Contents/PlugIns/logray/${PLUGIN_PATH_ID}") + set(_logray_plugin_dir "${CMAKE_BINARY_DIR}/run/Logray.app/Contents/PlugIns/logray") else() # Xcode - set(_logray_plugin_dir "${CMAKE_BINARY_DIR}/run/$/Logray.app/Contents/PlugIns/logray/${PLUGIN_PATH_ID}") + set(_logray_plugin_dir "${CMAKE_BINARY_DIR}/run/$/Logray.app/Contents/PlugIns/logray") endif() elseif(MSVC AND NOT CMAKE_CFG_INTDIR STREQUAL ".") - set(_plugin_dir "${CMAKE_BINARY_DIR}/run/$/${PLUGIN_VERSION_DIR}") + set(_plugin_dir "${CMAKE_BINARY_DIR}/run/$/plugins") set(_logray_plugin_dir ${_plugin_dir}) else() - set(_plugin_dir "${DATAFILE_DIR}/${PLUGIN_VERSION_DIR}") + set(_plugin_dir "${DATAFILE_DIR}/plugins") set(_logray_plugin_dir ${_plugin_dir}) endif() set (PLUGIN_DIR ${_plugin_dir} CACHE INTERNAL "Build time plugin location.") @@ -4103,7 +4083,7 @@ configure_package_config_file(WiresharkConfig.cmake.in PATH_VARS CMAKE_INSTALL_LIBDIR CMAKE_INSTALL_INCLUDEDIR - PLUGIN_INSTALL_VERSION_LIBDIR + PLUGIN_INSTALL_LIBDIR EXTCAP_INSTALL_LIBDIR ) diff --git a/WiresharkConfig.cmake.in b/WiresharkConfig.cmake.in index d8981b8b2f..3e432690d4 100644 --- a/WiresharkConfig.cmake.in +++ b/WiresharkConfig.cmake.in @@ -3,8 +3,15 @@ set(Wireshark_MINOR_VERSION @PROJECT_MINOR_VERSION@) set(Wireshark_PATCH_VERSION @PROJECT_PATCH_VERSION@) set(Wireshark_VERSION "@PROJECT_VERSION@") +set(Wireshark_ABI_VERSION_EPAN @PROJECT_ABI_VERSION_EPAN@) +set(Wireshark_ABI_VERSION_WIRETAP @PROJECT_ABI_VERSION_WIRETAP@) +set(Wireshark_ABI_VERSION_CODEC @PROJECT_ABI_VERSION_CODEC@) + set(Wireshark_PLUGINS_ENABLED @HAVE_PLUGINS@) -set(Wireshark_PLUGIN_LIBDIR "@PLUGIN_INSTALL_VERSION_LIBDIR@") +set(Wireshark_PLUGIN_SUFFIX_EPAN "${CMAKE_SHARED_MODULE_SUFFIX}.${Wireshark_ABI_VERSION_EPAN}") +set(Wireshark_PLUGIN_SUFFIX_WIRETAP "${CMAKE_SHARED_MODULE_SUFFIX}.${Wireshark_ABI_VERSION_WIRETAP}") +set(Wireshark_PLUGIN_SUFFIX_CODEC "${CMAKE_SHARED_MODULE_SUFFIX}.${Wireshark_ABI_VERSION_CODEC}") +set(Wireshark_PLUGIN_LIBDIR "@PLUGIN_INSTALL_LIBDIR@") @PACKAGE_INIT@ @@ -18,9 +25,7 @@ set_and_check(Wireshark_INCLUDE_DIR "@PACKAGE_CMAKE_INSTALL_INCLUDEDIR@/w # which is not helpful because the variable is correct, it's just that the empty directories # were not created (also correctly, empty directories are just noise). # -if(Wireshark_PLUGINS_ENABLED) - set(Wireshark_PLUGIN_INSTALL_DIR "@PACKAGE_PLUGIN_INSTALL_VERSION_LIBDIR@") -endif() +set(Wireshark_PLUGIN_INSTALL_DIR "@PACKAGE_PLUGIN_INSTALL_LIBDIR@") set(Wireshark_EXTCAP_INSTALL_DIR "@PACKAGE_EXTCAP_INSTALL_LIBDIR@") include("${CMAKE_CURRENT_LIST_DIR}/WiresharkTargets.cmake") diff --git a/cmake/modules/WiresharkPlugin.cmake b/cmake/modules/WiresharkPlugin.cmake index b8975d3989..4d8cd7a9f8 100644 --- a/cmake/modules/WiresharkPlugin.cmake +++ b/cmake/modules/WiresharkPlugin.cmake @@ -28,7 +28,7 @@ macro(SET_MODULE_INFO _plugin _ver_major _ver_minor _ver_micro _ver_extra) add_definitions(-DPLUGIN_VERSION=\"${PLUGIN_VERSION}\") endmacro() -macro(ADD_PLUGIN_LIBRARY _plugin _output_dir) +macro(ADD_PLUGIN_LIBRARY _plugin _output_dir _abi_version) add_library(${_plugin} MODULE ${PLUGIN_FILES} ${PLUGIN_RC_FILE} @@ -38,6 +38,7 @@ macro(ADD_PLUGIN_LIBRARY _plugin _output_dir) set_target_properties(${_plugin} PROPERTIES PREFIX "" + SUFFIX "${CMAKE_SHARED_MODULE_SUFFIX}.${_abi_version}" LINK_FLAGS "${WS_LINK_FLAGS}" FOLDER "Plugins" LIBRARY_OUTPUT_DIRECTORY ${_output_dir} @@ -51,25 +52,25 @@ macro(ADD_PLUGIN_LIBRARY _plugin _output_dir) endmacro() macro(ADD_WIRESHARK_EPAN_PLUGIN_LIBRARY _plugin) - ADD_PLUGIN_LIBRARY(${_plugin} "${PLUGIN_DIR}/epan") + ADD_PLUGIN_LIBRARY(${_plugin} "${PLUGIN_DIR}/epan" ${PROJECT_ABI_VERSION_EPAN}) endmacro() macro(ADD_WIRESHARK_WIRETAP_PLUGIN_LIBRARY _plugin) - ADD_PLUGIN_LIBRARY(${_plugin} "${PLUGIN_DIR}/wiretap") + ADD_PLUGIN_LIBRARY(${_plugin} "${PLUGIN_DIR}/wiretap" ${PROJECT_ABI_VERSION_WIRETAP}) endmacro() macro(ADD_WIRESHARK_CODEC_PLUGIN_LIBRARY _plugin) - ADD_PLUGIN_LIBRARY(${_plugin} "${PLUGIN_DIR}/codecs") + ADD_PLUGIN_LIBRARY(${_plugin} "${PLUGIN_DIR}/codecs" ${PROJECT_ABI_VERSION_CODEC}) endmacro() macro(ADD_LOGRAY_EPAN_PLUGIN_LIBRARY _plugin) - ADD_PLUGIN_LIBRARY(${_plugin} "${LOGRAY_PLUGIN_DIR}/epan") + ADD_PLUGIN_LIBRARY(${_plugin} "${LOGRAY_PLUGIN_DIR}/epan" ${PROJECT_ABI_VERSION_EPAN}) endmacro() macro(INSTALL_PLUGIN _plugin _subfolder) install(TARGETS ${_plugin} - LIBRARY DESTINATION ${PLUGIN_INSTALL_VERSION_LIBDIR}/${_subfolder} NAMELINK_SKIP - RUNTIME DESTINATION ${PLUGIN_INSTALL_VERSION_LIBDIR} - ARCHIVE DESTINATION ${PLUGIN_INSTALL_VERSION_LIBDIR} + LIBRARY DESTINATION ${PLUGIN_INSTALL_LIBDIR}/${_subfolder} NAMELINK_SKIP + RUNTIME DESTINATION ${PLUGIN_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${PLUGIN_INSTALL_LIBDIR} ) endmacro() diff --git a/cmakeconfig.h.in b/cmakeconfig.h.in index e1e8548be8..61f44adc1b 100644 --- a/cmakeconfig.h.in +++ b/cmakeconfig.h.in @@ -19,9 +19,10 @@ /* Version number of Logray and associated utilities */ #define LOG_VERSION "${LOG_PROJECT_VERSION}${VERSION_EXTRA}" -#define PLUGIN_PATH_ID "${PLUGIN_PATH_ID}" #define VERSION_FLAVOR "${VERSION_FLAVOR}" +#define SHARED_MODULE_SUFFIX "${CMAKE_SHARED_MODULE_SUFFIX}" + /* Build wsutil with SIMD optimization */ #cmakedefine HAVE_SSE4_2 1 diff --git a/doc/plugins.example/CMakeLists.txt b/doc/plugins.example/CMakeLists.txt index 26e3ad25c9..a685ab37a2 100644 --- a/doc/plugins.example/CMakeLists.txt +++ b/doc/plugins.example/CMakeLists.txt @@ -39,7 +39,11 @@ add_compile_definitions( ) add_library(hello MODULE hello.c) -set_target_properties(hello PROPERTIES PREFIX "" DEFINE_SYMBOL "") +set_target_properties(hello PROPERTIES + PREFIX "" + SUFFIX "${Wireshark_PLUGIN_SUFFIX_EPAN}" + DEFINE_SYMBOL "" +) target_link_libraries(hello epan) # This is the normal installation target to CMAKE_INSTALL_PREFIX. It is relocatable diff --git a/doc/release-notes.adoc b/doc/release-notes.adoc index c4ba04679a..0752e2f563 100644 --- a/doc/release-notes.adoc +++ b/doc/release-notes.adoc @@ -111,6 +111,9 @@ The following features are new (or have been significantly updated) since versio * The personal binary plugins folder now has higher priority than the global folder. +* The binary plugins folder path no longer uses an X.Y version component. Plugins + are required to add the ABI version to the file name. + //=== Removed Features and Support // === Removed Dissectors diff --git a/docbook/wsug_src/wsug_files.adoc b/docbook/wsug_src/wsug_files.adoc index 3c4364bbce..c64162530b 100644 --- a/docbook/wsug_src/wsug_files.adoc +++ b/docbook/wsug_src/wsug_files.adoc @@ -551,12 +551,16 @@ machine code. Wireshark looks for plugins in both a personal plugin folder and a global plugin folder. Lua plugins are stored in the plugin folders; compiled plugins are stored in subfolders of the plugin folders, with -the subfolder name being the Wireshark minor version number (X.Y). There is -another hierarchical level for each Wireshark plugin type (libwireshark, -libwiretap and codecs). So for example the location for a libwireshark plugin -_foo.so_ (_foo.dll_ on Windows) would be _PLUGINDIR/X.Y/epan_ -(libwireshark used to be called libepan; the other folder names are _codecs_ -and _wiretap_). +the subfolder name being the plugin binary type. Each Wireshark binary plugin +has one of three distinct types (libwireshark, libwiretap and codecs). +So for example the location for a libwireshark plugin +_foo.so_ (_foo.dll_ on Windows) would be _PLUGINDIR/epan_ +(libwireshark used to be called libepan), for libwiretap it would be +_PLUGINDIR/wiretap_ and for codecs _PLUGINDIR/codecs_. + +Plugins should come with the ABI version appended to the filename, so the +complete example for an epan binary plugin would be _PLUGINDIR/epan_/foo.so.1_ +for epan ABI version 1. On Windows: diff --git a/packaging/macosx/osx-app.sh.in b/packaging/macosx/osx-app.sh.in index 0bd0b9323a..fa146e52ad 100755 --- a/packaging/macosx/osx-app.sh.in +++ b/packaging/macosx/osx-app.sh.in @@ -145,7 +145,7 @@ app_lower=$(echo "$app_name" | tr '[:upper:]' '[:lower:]') pkgexec="$bundle/Contents/MacOS" #pkgres="$bundle/Contents/Resources" pkglib="$bundle/Contents/Frameworks" -pkgplugin="$bundle/Contents/PlugIns/$app_lower/@PLUGIN_PATH_ID@" +pkgplugin="$bundle/Contents/PlugIns/$app_lower" # Set the 'macosx' directory, usually the current directory. #resdir=$( pwd ) diff --git a/packaging/nsis/custom_plugins.txt b/packaging/nsis/custom_plugins.txt index 12338056e7..6c71b57dc5 100644 --- a/packaging/nsis/custom_plugins.txt +++ b/packaging/nsis/custom_plugins.txt @@ -1,3 +1,3 @@ ;Add your custom plugins directives here ; Example: -;File "${STAGING_DIR}\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\epan\foo.dll" +;File "${STAGING_DIR}\plugins\epan\foo.dll.${ABI_VERSION_EPAN}" diff --git a/packaging/nsis/logray-config.nsh.in b/packaging/nsis/logray-config.nsh.in index 484ed0568a..c881483bc9 100644 --- a/packaging/nsis/logray-config.nsh.in +++ b/packaging/nsis/logray-config.nsh.in @@ -11,6 +11,9 @@ #define EXTRA_INSTALLER_DIR "@EXTRA_INSTALLER_DIR@" #define VERSION @LOG_PROJECT_VERSION@ #define PRODUCT_VERSION @LOG_PRODUCT_VERSION@ +#define ABI_VERSION_EPAN @PROJECT_ABI_VERSION_EPAN@ +#define ABI_VERSION_WIRETAP @PROJECT_ABI_VERSION_WIRETAP@ +#define ABI_VERSION_CODEC @PROJECT_ABI_VERSION_CODEC@ # Plugins #define MAJOR_VERSION @PROJECT_MAJOR_VERSION@ #define MINOR_VERSION @PROJECT_MINOR_VERSION@ diff --git a/packaging/nsis/logray.nsi b/packaging/nsis/logray.nsi index db54521779..e59e1992d3 100644 --- a/packaging/nsis/logray.nsi +++ b/packaging/nsis/logray.nsi @@ -890,23 +890,23 @@ SectionGroup "Plugins & Extensions" SecPluginsGroup Section "Dissector Plugins" SecPlugins ;------------------------------------------- -SetOutPath '$INSTDIR\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\epan' -File "${STAGING_DIR}\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\epan\falco-bridge.dll" -SetOutPath '$INSTDIR\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\falco' -File "${STAGING_DIR}\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\falco\cloudtrail.dll" +SetOutPath '$INSTDIR\plugins\epan' +File "${STAGING_DIR}\plugins\epan\falco-bridge.dll.${ABI_VERSION_EPAN}" +SetOutPath '$INSTDIR\plugins\falco' +File "${STAGING_DIR}\plugins\falco\cloudtrail.dll.${ABI_VERSION_EPAN}" !include "custom_plugins.txt" SectionEnd Section "Tree Statistics Plugin" SecStatsTree ;------------------------------------------- -SetOutPath '$INSTDIR\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\epan' -File "${STAGING_DIR}\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\epan\stats_tree.dll" +SetOutPath '$INSTDIR\plugins\epan' +File "${STAGING_DIR}\plugins\epan\stats_tree.dll.${ABI_VERSION_EPAN}" SectionEnd Section "Mate - Meta Analysis and Tracing Engine" SecMate ;------------------------------------------- -SetOutPath '$INSTDIR\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\epan' -File "${STAGING_DIR}\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\epan\mate.dll" +SetOutPath '$INSTDIR\plugins\epan' +File "${STAGING_DIR}\plugins\epan\mate.dll.${ABI_VERSION_EPAN}" SectionEnd Section "Configuration Profiles" SecProfiles diff --git a/packaging/nsis/wireshark-config.nsh.in b/packaging/nsis/wireshark-config.nsh.in index 10485cca03..0e3b0b13ab 100644 --- a/packaging/nsis/wireshark-config.nsh.in +++ b/packaging/nsis/wireshark-config.nsh.in @@ -16,6 +16,10 @@ #define MINOR_VERSION @PROJECT_MINOR_VERSION@ #define PRODUCT_VERSION @PRODUCT_VERSION@ +#define ABI_VERSION_EPAN @PROJECT_ABI_VERSION_EPAN@ +#define ABI_VERSION_WIRETAP @PROJECT_ABI_VERSION_WIRETAP@ +#define ABI_VERSION_CODEC @PROJECT_ABI_VERSION_CODEC@ + #define VCREDIST_DIR "@VCREDIST_DIR@" #define VCREDIST_EXE "@VCREDIST_EXE@" diff --git a/packaging/nsis/wireshark.nsi b/packaging/nsis/wireshark.nsi index 75c104117b..46f9534e74 100644 --- a/packaging/nsis/wireshark.nsi +++ b/packaging/nsis/wireshark.nsi @@ -1039,24 +1039,24 @@ SectionEnd Section "-Plugins & Extensions" -SetOutPath '$INSTDIR\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\codecs' -File "${STAGING_DIR}\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\codecs\g711.dll" +SetOutPath '$INSTDIR\plugins\codecs' +File "${STAGING_DIR}\plugins\codecs\g711.dll.${ABI_VERSION_CODEC}" !ifdef SPANDSP_FOUND -File "${STAGING_DIR}\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\codecs\g722.dll" -File "${STAGING_DIR}\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\codecs\g726.dll" +File "${STAGING_DIR}\plugins\codecs\g722.dll.${ABI_VERSION_CODEC}" +File "${STAGING_DIR}\plugins\codecs\g726.dll.${ABI_VERSION_CODEC}" !endif !ifdef BCG729_FOUND -File "${STAGING_DIR}\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\codecs\g729.dll" +File "${STAGING_DIR}\plugins\codecs\g729.dll.${ABI_VERSION_CODEC}" !endif -File "${STAGING_DIR}\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\codecs\l16mono.dll" +File "${STAGING_DIR}\plugins\codecs\l16mono.dll.${ABI_VERSION_CODEC}" !ifdef SBC_FOUND -File "${STAGING_DIR}\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\codecs\sbc.dll" +File "${STAGING_DIR}\plugins\codecs\sbc.dll.${ABI_VERSION_CODEC}" !endif !ifdef ILBC_FOUND -File "${STAGING_DIR}\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\codecs\ilbc.dll" +File "${STAGING_DIR}\plugins\codecs\ilbc.dll.${ABI_VERSION_CODEC}" !endif !ifdef OPUS_FOUND -File "${STAGING_DIR}\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\codecs\opus_dec.dll" +File "${STAGING_DIR}\plugins\codecs\opus_dec.dll.${ABI_VERSION_CODEC}" !endif ; This should be a function or macro @@ -1068,23 +1068,23 @@ File "${STAGING_DIR}\profiles\Classic\colorfilters" SetOutPath '$INSTDIR\profiles\No Reassembly' File "${STAGING_DIR}\profiles\No Reassembly\preferences" -SetOutPath '$INSTDIR\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\epan' -File "${STAGING_DIR}\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\epan\ethercat.dll" -File "${STAGING_DIR}\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\epan\gryphon.dll" -File "${STAGING_DIR}\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\epan\irda.dll" -File "${STAGING_DIR}\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\epan\opcua.dll" -File "${STAGING_DIR}\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\epan\profinet.dll" -File "${STAGING_DIR}\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\epan\unistim.dll" -File "${STAGING_DIR}\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\epan\wimax.dll" -File "${STAGING_DIR}\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\epan\wimaxasncp.dll" -File "${STAGING_DIR}\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\epan\wimaxmacphy.dll" +SetOutPath '$INSTDIR\plugins\epan' +File "${STAGING_DIR}\plugins\epan\ethercat.dll.${ABI_VERSION_EPAN}" +File "${STAGING_DIR}\plugins\epan\gryphon.dll.${ABI_VERSION_EPAN}" +File "${STAGING_DIR}\plugins\epan\irda.dll.${ABI_VERSION_EPAN}" +File "${STAGING_DIR}\plugins\epan\opcua.dll.${ABI_VERSION_EPAN}" +File "${STAGING_DIR}\plugins\epan\profinet.dll.${ABI_VERSION_EPAN}" +File "${STAGING_DIR}\plugins\epan\unistim.dll.${ABI_VERSION_EPAN}" +File "${STAGING_DIR}\plugins\epan\wimax.dll.${ABI_VERSION_EPAN}" +File "${STAGING_DIR}\plugins\epan\wimaxasncp.dll.${ABI_VERSION_EPAN}" +File "${STAGING_DIR}\plugins\epan\wimaxmacphy.dll.${ABI_VERSION_EPAN}" !include "custom_plugins.txt" -SetOutPath '$INSTDIR\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\wiretap' -File "${STAGING_DIR}\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\wiretap\usbdump.dll" +SetOutPath '$INSTDIR\plugins\wiretap' +File "${STAGING_DIR}\plugins\wiretap\usbdump.dll.${ABI_VERSION_WIRETAP}" -SetOutPath '$INSTDIR\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\epan' -File "${STAGING_DIR}\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\epan\mate.dll" +SetOutPath '$INSTDIR\plugins\epan' +File "${STAGING_DIR}\plugins\epan\mate.dll.${ABI_VERSION_EPAN}" !ifdef SMI_DIR SetOutPath '$INSTDIR\snmp\mibs' @@ -1097,11 +1097,11 @@ File "${SMI_DIR}\share\yang\*.yang" !include "custom_mibs.txt" !endif -SetOutPath '$INSTDIR\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\epan' -File "${STAGING_DIR}\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\epan\transum.dll" +SetOutPath '$INSTDIR\plugins\epan' +File "${STAGING_DIR}\plugins\epan\transum.dll.${ABI_VERSION_EPAN}" -SetOutPath '$INSTDIR\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\epan' -File "${STAGING_DIR}\plugins\${MAJOR_VERSION}.${MINOR_VERSION}\epan\stats_tree.dll" +SetOutPath '$INSTDIR\plugins\epan' +File "${STAGING_DIR}\plugins\epan\stats_tree.dll.${ABI_VERSION_EPAN}" SectionEnd ; "Plugins / Extensions" diff --git a/packaging/wix/CMakeLists.txt b/packaging/wix/CMakeLists.txt index 0c74fba863..60178a2655 100644 --- a/packaging/wix/CMakeLists.txt +++ b/packaging/wix/CMakeLists.txt @@ -188,8 +188,9 @@ set(WIX_CANDLE_DEFINES -dPlatform=${WIRESHARK_TARGET_PLATFORM} -dWiresharkName=${CMAKE_PROJECT_NAME} -dWiresharkVersion=${PRODUCT_VERSION} - -dWiresharkMajorVersion=${PROJECT_MAJOR_VERSION} - -dWiresharkMinorVersion=${PROJECT_MINOR_VERSION} + -dWiresharkAbiVersionEpan=${PROJECT_ABI_VERSION_EPAN} + -dWiresharkAbiVersionWtap=${PROJECT_ABI_VERSION_WIRETAP} + -dWiresharkAbiVersionCodec=${PROJECT_ABI_VERSION_CODEC} -dAssetDir=${CMAKE_SOURCE_DIR}/packaging/wix -dBuildOutputDir=${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR} -dDiameterDir=${ARCHIVE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}/diameter diff --git a/packaging/wix/Plugins.wxi b/packaging/wix/Plugins.wxi index 0b53cf485a..594603a777 100644 --- a/packaging/wix/Plugins.wxi +++ b/packaging/wix/Plugins.wxi @@ -5,31 +5,31 @@ - + - + - + - + - + - + - + - + - + @@ -53,7 +53,7 @@ - + @@ -67,7 +67,7 @@ - + @@ -81,7 +81,7 @@ - + @@ -95,7 +95,7 @@ - + @@ -109,28 +109,28 @@ - + - + - + - + - + - + - + - + diff --git a/resources/wireshark.pc.in b/resources/wireshark.pc.in index 212d4ec311..4287aca639 100644 --- a/resources/wireshark.pc.in +++ b/resources/wireshark.pc.in @@ -3,7 +3,7 @@ exec_prefix=${prefix} libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@ includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@ sharedlibdir=${libdir} -plugindir=${libdir}/wireshark/@PLUGIN_VERSION_DIR@ +plugindir=${libdir}/wireshark/plugins Name: Wireshark Description: Network Protocol Analyzer (Packet Dissection Library) diff --git a/tshark.c b/tshark.c index f668891dbb..5b2aa984aa 100644 --- a/tshark.c +++ b/tshark.c @@ -797,13 +797,13 @@ about_folders(void) constpath = get_progfile_dir(); printf("%-21s\t%s\n", "Program:", constpath); -#ifdef HAVE_PLUGINS - /* pers plugins */ - printf("%-21s\t%s\n", "Personal Plugins:", get_plugins_pers_dir_with_version()); + if (plugins_supported()) { + /* pers plugins */ + printf("%-21s\t%s\n", "Personal Plugins:", get_plugins_pers_dir()); - /* global plugins */ - printf("%-21s\t%s\n", "Global Plugins:", get_plugins_dir_with_version()); -#endif + /* global plugins */ + printf("%-21s\t%s\n", "Global Plugins:", get_plugins_dir()); + } #ifdef HAVE_LUA /* pers lua plugins */ diff --git a/ui/qt/about_dialog.cpp b/ui/qt/about_dialog.cpp index 47eab5ea24..3b9fafd269 100644 --- a/ui/qt/about_dialog.cpp +++ b/ui/qt/about_dialog.cpp @@ -267,13 +267,13 @@ FolderListModel::FolderListModel(QObject * parent): /* program */ appendRow(QStringList() << tr("Program") << get_progfile_dir() << tr("program files")); -#ifdef HAVE_PLUGINS - /* pers plugins */ - appendRow(QStringList() << tr("Personal Plugins") << get_plugins_pers_dir_with_version() << tr("binary plugins")); + if (plugins_supported()) { + /* pers plugins */ + appendRow(QStringList() << tr("Personal Plugins") << get_plugins_pers_dir() << tr("binary plugins")); - /* global plugins */ - appendRow(QStringList() << tr("Global Plugins") << get_plugins_dir_with_version() << tr("binary plugins")); -#endif + /* global plugins */ + appendRow(QStringList() << tr("Global Plugins") << get_plugins_dir() << tr("binary plugins")); + } #ifdef HAVE_LUA /* pers plugins */ diff --git a/ui/qt/wireshark_main_window.cpp b/ui/qt/wireshark_main_window.cpp index e7b6bb1c28..275fd7eb5f 100644 --- a/ui/qt/wireshark_main_window.cpp +++ b/ui/qt/wireshark_main_window.cpp @@ -3301,7 +3301,7 @@ void WiresharkMainWindow::installPersonalBinaryPlugin() QString caption = mainApp->windowTitleString(tr("Install plugin")); // Get the plugin file path to install - QString plugin_filter = tr("Binary plugin (*%1)").arg(WS_PLUGIN_MODULE_SUFFIX); + QString plugin_filter = tr("Binary plugin (*%1 *%1.[0-9]*)").arg(WS_PLUGIN_MODULE_SUFFIX); QString src_path = WiresharkFileDialog::getOpenFileName(this, caption, "", plugin_filter); if (src_path.isEmpty()) { return; @@ -3341,6 +3341,10 @@ void WiresharkMainWindow::installPersonalBinaryPlugin() // a way to load and unload plugins without having to restart the program. QFileInfo file_info(src_path); QString file_name = file_info.fileName(); + if (file_name.endsWith(WS_PLUGIN_MODULE_SUFFIX)) { + // Append the version to our destination name + file_name = QString("%1.%2").arg(file_name).arg(plugins_abi_version(have_type)); + } if (type_dir.exists(file_name)) { reply = QMessageBox::question(this, caption, tr("The file already exists. Do you want to overwrite it?")); diff --git a/wsutil/filesystem.c b/wsutil/filesystem.c index 065cdd3ccf..1514222885 100644 --- a/wsutil/filesystem.c +++ b/wsutil/filesystem.c @@ -1139,9 +1139,7 @@ get_doc_dir(void) * configure script. */ static char *plugin_dir = NULL; -static char *plugin_dir_with_version = NULL; static char *plugin_pers_dir = NULL; -static char *plugin_pers_dir_with_version = NULL; static char *extcap_pers_dir = NULL; static void @@ -1252,16 +1250,6 @@ get_plugins_dir(void) return plugin_dir; } -const char * -get_plugins_dir_with_version(void) -{ - if (!plugin_dir) - init_plugin_dir(); - if (plugin_dir && !plugin_dir_with_version) - plugin_dir_with_version = g_build_filename(plugin_dir, PLUGIN_PATH_ID, (char *)NULL); - return plugin_dir_with_version; -} - /* Get the personal plugin dir */ const char * get_plugins_pers_dir(void) @@ -1271,16 +1259,6 @@ get_plugins_pers_dir(void) return plugin_pers_dir; } -const char * -get_plugins_pers_dir_with_version(void) -{ - if (!plugin_pers_dir) - init_plugin_pers_dir(); - if (plugin_pers_dir && !plugin_pers_dir_with_version) - plugin_pers_dir_with_version = g_build_filename(plugin_pers_dir, PLUGIN_PATH_ID, (char *)NULL); - return plugin_pers_dir_with_version; -} - /* * Find the directory where the extcap hooks are stored. * @@ -2695,12 +2673,8 @@ free_progdirs(void) #if defined(HAVE_PLUGINS) || defined(HAVE_LUA) g_free(plugin_dir); plugin_dir = NULL; - g_free(plugin_dir_with_version); - plugin_dir_with_version = NULL; g_free(plugin_pers_dir); plugin_pers_dir = NULL; - g_free(plugin_pers_dir_with_version); - plugin_pers_dir_with_version = NULL; #endif g_free(extcap_dir); extcap_dir = NULL; diff --git a/wsutil/filesystem.h b/wsutil/filesystem.h index fd3e3ebca0..4f15a9c8ef 100644 --- a/wsutil/filesystem.h +++ b/wsutil/filesystem.h @@ -80,21 +80,11 @@ WS_DLL_PUBLIC char *get_executable_path(const char *filename); */ WS_DLL_PUBLIC const char *get_plugins_dir(void); -/* - * Append VERSION_MAJOR.VERSION_MINOR to the plugin dir. - */ -WS_DLL_PUBLIC const char *get_plugins_dir_with_version(void); - /* * Get the personal plugin dir. */ WS_DLL_PUBLIC const char *get_plugins_pers_dir(void); -/* - * Append VERSION_MAJOR.VERSION_MINOR to the plugin personal dir. - */ -WS_DLL_PUBLIC const char *get_plugins_pers_dir_with_version(void); - /* * Get the directory in which extcap hooks are stored; this must not be called * before configuration_init() is called, as they might be stored in a diff --git a/wsutil/plugins.c b/wsutil/plugins.c index 088df2050b..6e9b5eff29 100644 --- a/wsutil/plugins.c +++ b/wsutil/plugins.c @@ -130,12 +130,14 @@ scan_plugins_dir(GHashTable *plugins_module, const char *dirpath, const char *name; /* current file name */ char *plugin_folder; char *plugin_file; /* current file full path */ + char *plugin_ext; /* plugin file extension */ GModule *handle; /* handle returned by g_module_open */ void *symbol; plugin *new_plug; plugin_type_e have_type; int abi_version; struct ws_module *module; + char *s; plugin_folder = g_build_filename(dirpath, type_to_dir(type), (char *)NULL); @@ -145,11 +147,13 @@ scan_plugins_dir(GHashTable *plugins_module, const char *dirpath, return; } - ws_debug("Scanning plugins folder \"%s\"", plugin_folder); + plugin_ext = plugins_file_suffix(type); + + ws_debug("Scanning plugins folder \"%s\" for *%s", plugin_folder, plugin_ext); while ((name = g_dir_read_name(dir)) != NULL) { /* Skip anything but files with .dll or .so. */ - if (!g_str_has_suffix(name, WS_PLUGIN_MODULE_SUFFIX)) + if (!g_str_has_suffix(name, plugin_ext)) continue; plugin_file = g_build_filename(plugin_folder, name, (char *)NULL); @@ -219,14 +223,20 @@ DIAG_ON_PEDANTIC new_plug->module = module; new_plug->scope = scope; + // Strip version from plugin display name + s = strrchr(new_plug->name, '.'); + if (s != NULL && g_ascii_isdigit(*(s+1))) + *s = '\0'; + /* Add it to the list of plugins. */ - g_hash_table_replace(plugins_module, new_plug->name, new_plug); + g_hash_table_replace(plugins_module, g_strdup(name), new_plug); ws_info("Registered plugin: %s (%s)", new_plug->name, plugin_file); ws_debug("plugin '%s' meta data: version = %s, flags = 0x%"PRIu32", spdx = %s, blurb = %s", name, module->version, module->flags, module->spdx_id, module->blurb); g_free(plugin_file); } ws_dir_close(dir); + wmem_free(NULL, plugin_ext); g_free(plugin_folder); } @@ -239,7 +249,7 @@ plugins_init(plugin_type_e type) if (!plugins_supported()) return NULL; /* nothing to do */ - GHashTable *plugins_module = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, free_plugin); + GHashTable *plugins_module = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, free_plugin); /* Scan the users plugins directory first, giving it priority over the * global plugins folder. Only scan it if we weren't started with special @@ -249,7 +259,7 @@ plugins_init(plugin_type_e type) * if we need privileges to start capturing, we'd need to * reclaim them before each time we start capturing.) */ - const char *user_dir = get_plugins_pers_dir_with_version(); + const char *user_dir = get_plugins_pers_dir(); if (!started_with_special_privs()) { scan_plugins_dir(plugins_module, user_dir, type, WS_PLUGIN_SCOPE_USER); } @@ -262,7 +272,7 @@ plugins_init(plugin_type_e type) * Scan the global plugin directory. Make sure we don't scan the same directory * twice (under some unusual install configurations). */ - const char *global_dir = get_plugins_dir_with_version(); + const char *global_dir = get_plugins_dir(); if (strcmp(global_dir, user_dir) != 0) { scan_plugins_dir(plugins_module, global_dir, type, WS_PLUGIN_SCOPE_GLOBAL); } @@ -392,10 +402,16 @@ DIAG_ON_PEDANTIC char * plugins_pers_type_folder(plugin_type_e type) { - return g_build_filename(get_plugins_pers_dir_with_version(), + return g_build_filename(get_plugins_pers_dir(), type_to_dir(type), (const char *)NULL); } +char * +plugins_file_suffix(plugin_type_e type) +{ + return ws_strdup_printf("%s.%d", WS_PLUGIN_MODULE_SUFFIX, plugins_abi_version(type)); +} + int plugins_abi_version(plugin_type_e type) { diff --git a/wsutil/plugins.h b/wsutil/plugins.h index f9d7003e5d..fcd1a436bf 100644 --- a/wsutil/plugins.h +++ b/wsutil/plugins.h @@ -41,8 +41,9 @@ typedef enum { #define WS_PLUGIN_DESC_TAP_LISTENER (1UL << 4) #define WS_PLUGIN_DESC_DFUNCTION (1UL << 5) -// GLib and Qt allow ".dylib" and ".so" on macOS. Should we do the same? -#ifdef _WIN32 +#if defined(SHARED_MODULE_SUFFIX) +#define WS_PLUGIN_MODULE_SUFFIX SHARED_MODULE_SUFFIX +#elif defined(_WIN32) #define WS_PLUGIN_MODULE_SUFFIX ".dll" #else #define WS_PLUGIN_MODULE_SUFFIX ".so" @@ -91,6 +92,8 @@ WS_DLL_PUBLIC plugin_type_e plugins_check_file(const char *path); WS_DLL_PUBLIC char *plugins_pers_type_folder(plugin_type_e type); +WS_DLL_PUBLIC char *plugins_file_suffix(plugin_type_e type); + WS_DLL_PUBLIC int plugins_abi_version(plugin_type_e type);