Remove version component from plugin path
authorJoão Valverde <j@v6e.pt>
Wed, 13 Dec 2023 02:14:33 +0000 (02:14 +0000)
committerJoão Valverde <j@v6e.pt>
Thu, 14 Dec 2023 14:28:30 +0000 (14:28 +0000)
Remove the major.minor version from the plugin path, i.e:
    lib/plugins/X.Y/{epan,wiretap,codecs}
and use an unversioned path:
    lib/plugins/{epan,wiretap,codecs}

Introduce a new naming policy for plugins that requires
name.so.ABI_VERSION.

This is a simplified filesystem layoutfor plugins some
important benefits such as:

 * improves compatibility between Wireshark versions, because
a plugin that wasn't recompiled will be automatically picked
up, but only if it has a compatible ABI version in the file name.
 * does not clash with Apple guidelines
 * simpler for users to understand and apply
 * just overall simpler and easier to maintain, removes a lot
of complexity from CMake code

It does impose more requirements on the plugin naming scheme
but this should be handled completely transparently
by the build system.

It would also be possible to add support for unversioned *.so file
extensions at the same time, although in ths case it is not possible
to support multiple Wireshark ABI versions with only *.so, of course.
This wasn't done here but it may or may not be a useful enhancement
in the future.

Follow-up to 90b16b40921b737aadf9186685d866fd80e37ee6.

23 files changed:
CMakeLists.txt
WiresharkConfig.cmake.in
cmake/modules/WiresharkPlugin.cmake
cmakeconfig.h.in
doc/plugins.example/CMakeLists.txt
doc/release-notes.adoc
docbook/wsug_src/wsug_files.adoc
packaging/macosx/osx-app.sh.in
packaging/nsis/custom_plugins.txt
packaging/nsis/logray-config.nsh.in
packaging/nsis/logray.nsi
packaging/nsis/wireshark-config.nsh.in
packaging/nsis/wireshark.nsi
packaging/wix/CMakeLists.txt
packaging/wix/Plugins.wxi
resources/wireshark.pc.in
tshark.c
ui/qt/about_dialog.cpp
ui/qt/wireshark_main_window.cpp
wsutil/filesystem.c
wsutil/filesystem.h
wsutil/plugins.c
wsutil/plugins.h

index 51a5d577bcd54fba88768f6e105af884a7140ca3..c7749e3b3f3a72c6448e16d36869e7d0fe750432 100644 (file)
@@ -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/$<CONFIG>/Wireshark.app/Contents/PlugIns/wireshark/${PLUGIN_PATH_ID}")
+               set(_plugin_dir "${CMAKE_BINARY_DIR}/run/$<CONFIG>/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/$<CONFIG>/Logray.app/Contents/PlugIns/logray/${PLUGIN_PATH_ID}")
+               set(_logray_plugin_dir "${CMAKE_BINARY_DIR}/run/$<CONFIG>/Logray.app/Contents/PlugIns/logray")
        endif()
 elseif(MSVC AND NOT CMAKE_CFG_INTDIR STREQUAL ".")
-       set(_plugin_dir "${CMAKE_BINARY_DIR}/run/$<CONFIG>/${PLUGIN_VERSION_DIR}")
+       set(_plugin_dir "${CMAKE_BINARY_DIR}/run/$<CONFIG>/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
 )
 
index d8981b8b2ffc23fbd790dd6512159e460e4ae854..3e432690d4332efd2660f11aa8a954b0d1ca28b0 100644 (file)
@@ -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")
index b8975d39899cb3a2d77062997c6703049a87890d..4d8cd7a9f835eff0bb3d85b1b4ae6e43d57a46a0 100644 (file)
@@ -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()
index e1e8548be8c1ee6bc14229e222af279a89790ae2..61f44adc1bafef44597f203369dbe26d3f63696c 100644 (file)
 /* 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
 
index 26e3ad25c9b82fca6f9359183023ea4f0802fecf..a685ab37a2f9898e054d25d437a9d60f324aaf15 100644 (file)
@@ -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
index c4ba04679a9273745e93bd2a50c15e2605b13b18..0752e2f5635f47e2873750522a19cae0bfbb7f8d 100644 (file)
@@ -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
index 3c4364bbcee395abaa9a8fe78b8fda0c6c93feb4..c64162530b362940cb426589500af47e82a0d580 100644 (file)
@@ -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:
 
index 0bd0b9323a69e9eaee96eb103f371caf05bf42d5..fa146e52ad4f7c95824257bee0f99d3f31120d3c 100755 (executable)
@@ -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 )
index 12338056e7dee8b840c523d1a6ebd129d3e6c73c..6c71b57dc54895c84354176d1de17adff419256c 100644 (file)
@@ -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}"
index 484ed0568a09b2d8dd55bf428aa9375c7c9a2eeb..c881483bc9531c7c7227953fe783fa70a85de8e7 100644 (file)
@@ -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@
index db5452177988a567f24d72afc7dbff266858c050..e59e1992d3e04c90035fd11e0a33020a898decde 100644 (file)
@@ -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
index 10485cca031c2b8ac7f12f742d6c1b13c5f23e3e..0e3b0b13abc5e648d27e8d30a79526585df01d95 100644 (file)
 #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@"
 
index 75c104117b9a8e5b544f287ccc62615de2907849..46f9534e74c3e5e329c3b21be511a40a4c5140f0 100644 (file)
@@ -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"
 
index 0c74fba863e68d6bbf966bdc8117d12ea936ad08..60178a2655cb023fb3c2a5174199d96989cbc146 100644 (file)
@@ -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
index 0b53cf485ae7fbf21346130ce57a2f496ce67ef6..594603a777eab8f3bb3c6b34403d193b96f419d6 100644 (file)
@@ -5,31 +5,31 @@
     <Fragment>
         <DirectoryRef Id="dirPluginsVersionEpan">
             <Component Id="cmpEthercat_dll" Guid="*">
-                <File Id="filEthercat_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\$(var.WiresharkMajorVersion).$(var.WiresharkMinorVersion)\epan\ethercat.dll" />
+                <File Id="filEthercat_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\epan\ethercat.dll.$(var.WiresharkAbiVersionEpan)" />
             </Component>
             <Component Id="cmpGryphon_dll" Guid="*">
-                <File Id="filGryphon_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\$(var.WiresharkMajorVersion).$(var.WiresharkMinorVersion)\epan\gryphon.dll" />
+                <File Id="filGryphon_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\epan\gryphon.dll.$(var.WiresharkAbiVersionEpan)" />
             </Component>
             <Component Id="cmpIrda_dll" Guid="*">
-                <File Id="filIrda_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\$(var.WiresharkMajorVersion).$(var.WiresharkMinorVersion)\epan\irda.dll" />
+                <File Id="filIrda_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\epan\irda.dll.$(var.WiresharkAbiVersionEpan)" />
             </Component>
             <Component Id="cmpOpcua_dll" Guid="*">
-                <File Id="filOpcua_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\$(var.WiresharkMajorVersion).$(var.WiresharkMinorVersion)\epan\opcua.dll" />
+                <File Id="filOpcua_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\epan\opcua.dll.$(var.WiresharkAbiVersionEpan)" />
             </Component>
             <Component Id="cmpProfinet_dll" Guid="*">
-                <File Id="filProfinet_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\$(var.WiresharkMajorVersion).$(var.WiresharkMinorVersion)\epan\profinet.dll" />
+                <File Id="filProfinet_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\epan\profinet.dll.$(var.WiresharkAbiVersionEpan)" />
             </Component>
             <Component Id="cmpUnistim_dll" Guid="*">
-                <File Id="filUnistim_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\$(var.WiresharkMajorVersion).$(var.WiresharkMinorVersion)\epan\unistim.dll" />
+                <File Id="filUnistim_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\epan\unistim.dll.$(var.WiresharkAbiVersionEpan)" />
             </Component>
             <Component Id="cmpWimax_dll" Guid="*">
-                <File Id="filWimax_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\$(var.WiresharkMajorVersion).$(var.WiresharkMinorVersion)\epan\wimax.dll" />
+                <File Id="filWimax_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\epan\wimax.dll.$(var.WiresharkAbiVersionEpan)" />
             </Component>
             <Component Id="cmpWimaxasmcp_dll" Guid="*">
-                <File Id="filWimaxasmcp_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\$(var.WiresharkMajorVersion).$(var.WiresharkMinorVersion)\epan\wimaxasncp.dll" />
+                <File Id="filWimaxasmcp_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\epan\wimaxasncp.dll.$(var.WiresharkAbiVersionEpan)" />
             </Component>
             <Component Id="cmpWimaxmacphy_dll" Guid="*">
-                <File Id="filWimaxmacphy_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\$(var.WiresharkMajorVersion).$(var.WiresharkMinorVersion)\epan\wimaxmacphy.dll" />
+                <File Id="filWimaxmacphy_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\epan\wimaxmacphy.dll.$(var.WiresharkAbiVersionEpan)" />
             </Component>
           <!-- Add custom plugin Components here -->
         </DirectoryRef>
@@ -53,7 +53,7 @@
     <Fragment>
         <DirectoryRef Id="dirPluginsVersionEpan">
           <Component Id="cmpStatsTree_dll" Guid="*">
-            <File Id="filStatsTree_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\$(var.WiresharkMajorVersion).$(var.WiresharkMinorVersion)\epan\stats_tree.dll" />
+            <File Id="filStatsTree_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\epan\stats_tree.dll.$(var.WiresharkAbiVersionEpan)" />
           </Component>
         </DirectoryRef>
     </Fragment>
@@ -67,7 +67,7 @@
   <Fragment>
     <DirectoryRef Id="dirPluginsVersionEpan">
       <Component Id="cmpMate_dll" Guid="*">
-        <File Id="filMate_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\$(var.WiresharkMajorVersion).$(var.WiresharkMinorVersion)\epan\mate.dll" />
+        <File Id="filMate_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\epan\mate.dll.$(var.WiresharkAbiVersionEpan)" />
       </Component>
     </DirectoryRef>
   </Fragment>
@@ -81,7 +81,7 @@
   <Fragment>
     <DirectoryRef Id="dirPluginsVersionEpan">
       <Component Id="cmpTransum_dll" Guid="*">
-        <File Id="filTransum_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\$(var.WiresharkMajorVersion).$(var.WiresharkMinorVersion)\epan\transum.dll" />
+        <File Id="filTransum_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\epan\transum.dll.$(var.WiresharkAbiVersionEpan)" />
       </Component>
     </DirectoryRef>
   </Fragment>
@@ -95,7 +95,7 @@
     <Fragment>
         <DirectoryRef Id="dirPluginsVersionWtap">
             <Component Id="cmpUsbdump_dll" Guid="*">
-                <File Id="filUsbdump_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\$(var.WiresharkMajorVersion).$(var.WiresharkMinorVersion)\wiretap\usbdump.dll" />
+                <File Id="filUsbdump_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\wiretap\usbdump.dll.$(var.WiresharkAbiVersionWtap)" />
             </Component>
         </DirectoryRef>
     </Fragment>
     <Fragment>
         <DirectoryRef Id="dirPluginsVersionCodecs">
             <Component Id="cmpG711_dll" Guid="*">
-                <File Id="filG711_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\$(var.WiresharkMajorVersion).$(var.WiresharkMinorVersion)\codecs\g711.dll" />
+                <File Id="filG711_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\codecs\g711.dll.$(var.WiresharkAbiVersionCodec)" />
             </Component>
             <Component Id="cmpG722_dll" Guid="*">
-                <File Id="filG722_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\$(var.WiresharkMajorVersion).$(var.WiresharkMinorVersion)\codecs\g722.dll" />
+                <File Id="filG722_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\codecs\g722.dll.$(var.WiresharkAbiVersionCodec)" />
             </Component>
             <Component Id="cmpG726_dll" Guid="*">
-                <File Id="filG726_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\$(var.WiresharkMajorVersion).$(var.WiresharkMinorVersion)\codecs\g726.dll" />
+                <File Id="filG726_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\codecs\g726.dll.$(var.WiresharkAbiVersionCodec)" />
             </Component>
             <Component Id="cmpG729_dll" Guid="*">
-                <File Id="filG729_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\$(var.WiresharkMajorVersion).$(var.WiresharkMinorVersion)\codecs\g729.dll" />
+                <File Id="filG729_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\codecs\g729.dll.$(var.WiresharkAbiVersionCodec)" />
             </Component>
             <Component Id="cmpL16mono_dll" Guid="*">
-                <File Id="filL16mono_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\$(var.WiresharkMajorVersion).$(var.WiresharkMinorVersion)\codecs\l16mono.dll" />
+                <File Id="filL16mono_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\codecs\l16mono.dll.$(var.WiresharkAbiVersionCodec)" />
             </Component>
             <Component Id="cmpSBC_dll" Guid="*">
-                <File Id="filSBC_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\$(var.WiresharkMajorVersion).$(var.WiresharkMinorVersion)\codecs\sbc.dll" />
+                <File Id="filSBC_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\codecs\sbc.dll.$(var.WiresharkAbiVersionCodec)" />
             </Component>
             <Component Id="cmpILBC_dll" Guid="*">
-                <File Id="filILBC_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\$(var.WiresharkMajorVersion).$(var.WiresharkMinorVersion)\codecs\ilbc.dll" />
+                <File Id="filILBC_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\codecs\ilbc.dll.$(var.WiresharkAbiVersionCodec)" />
             </Component>
             <Component Id="cmpOPUS_dll" Guid="*">
-                <File Id="filOPUS_dec_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\$(var.WiresharkMajorVersion).$(var.WiresharkMinorVersion)\codecs\opus_dec.dll" />
+                <File Id="filOPUS_dec_dll" KeyPath="yes" Source="$(var.Plugins.Dir)\codecs\opus_dec.dll.$(var.WiresharkAbiVersionCodec)" />
             </Component>
         </DirectoryRef>
     </Fragment>
index 212d4ec311c2a8c5218c602cc1abfb8fcd8631b0..4287aca639b6f8a1ea73e04fcba37f2192586550 100644 (file)
@@ -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)
index f668891dbb60a91e08bb3427bc8f5a55f89d7ae9..5b2aa984aa6623fb759b65f3c935ef7c2a5ef341 100644 (file)
--- 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 */
index 47eab5ea24cf371f309cf17e043c3da020da2ded..3b9fafd2692d00fd365520f8724d3afc5686f4aa 100644 (file)
@@ -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 */
index e7b6bb1c2855713fa79b793c6e90f1638e83c5b4..275fd7eb5ffabdf06bcb1babdc371ec833914500 100644 (file)
@@ -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?"));
index 065cdd3ccfd55d44a8bfef4a9818660bf292c6ad..1514222885b10cc8130332c7e926dd1a133101e0 100644 (file)
@@ -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;
index fd3e3ebca088789564cbef9878bd435d1b69aa67..4f15a9c8eff13846d392c17bb640a7a413620a13 100644 (file)
@@ -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
index 088df2050bdeeca2ce1f7471685058d9439c6d5a..6e9b5eff29260ae2f6840e33e392251a56331ad3 100644 (file)
@@ -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)
 {
index f9d7003e5d57db8fdaaf5317372da2d42bb300e6..fcd1a436bf81150cbc9ace86253ae7deebae19d7 100644 (file)
@@ -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);