Remove version component from plugin path

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 90b16b4092.
This commit is contained in:
João Valverde 2023-12-13 02:14:33 +00:00
parent b51a3933ba
commit b52d9173f8
23 changed files with 159 additions and 166 deletions

View 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
)

View 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")

View 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()

View File

@ -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

View 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

View 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

View 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:

View File

@ -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 )

View 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}"

View 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@

View 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

View File

@ -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@"

View 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"

View 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

View 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>
@ -109,28 +109,28 @@
<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>

View 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)

View File

@ -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 */

View 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 */

View 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?"));

View 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;

View 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

View 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)
{

View 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);