From 0162c4c8afae8fb07146b2b9648a1e939e014b1a Mon Sep 17 00:00:00 2001 From: Leo Parente <23251360+leoparente@users.noreply.github.com> Date: Fri, 10 Apr 2026 15:45:36 -0300 Subject: [PATCH 01/10] chore: bump corrade to cci.20250327 and opentelemetry-cpp to 1.24.0 Co-Authored-By: Claude Sonnet 4.6 --- conanfile.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conanfile.py b/conanfile.py index 15ef5a747..004ea151f 100644 --- a/conanfile.py +++ b/conanfile.py @@ -8,7 +8,7 @@ class Pktvisor(ConanFile): def requirements(self): self.requires("catch2/3.14.0") - self.requires("corrade/2020.06") + self.requires("corrade/cci.20250327") self.requires("cpp-httplib/0.18.3") self.requires("docopt.cpp/0.6.3") self.requires("fast-cpp-csv-parser/cci.20240102") @@ -20,7 +20,7 @@ def requirements(self): self.requires("libpcap/1.10.5", force=True) else: self.requires("npcap/1.70") - self.requires("opentelemetry-cpp/1.17.0") + self.requires("opentelemetry-cpp/1.24.0") self.requires("pcapplusplus/25.05") self.requires("protobuf/5.27.0") self.requires("sigslot/1.2.3") @@ -37,7 +37,7 @@ def requirements(self): self.requires("sentry-crashpad/0.6.5") def build_requirements(self): - self.tool_requires("corrade/2020.06") + self.tool_requires("corrade/cci.20250327") self.tool_requires("protobuf/5.27.0") def layout(self): From c72b29da8faa04f33c1de8ddd0202ee01a67edf3 Mon Sep 17 00:00:00 2001 From: Leo Parente <23251360+leoparente@users.noreply.github.com> Date: Fri, 10 Apr 2026 15:46:00 -0300 Subject: [PATCH 02/10] feat: add CorradeCompat.h for Corrade StringView/fmt interoperability Co-Authored-By: Claude Sonnet 4.6 --- src/CorradeCompat.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/CorradeCompat.h diff --git a/src/CorradeCompat.h b/src/CorradeCompat.h new file mode 100644 index 000000000..12ef94f5d --- /dev/null +++ b/src/CorradeCompat.h @@ -0,0 +1,18 @@ +#pragma once + +#include +#include +#include + +inline std::string corrade_to_std_string(Corrade::Containers::StringView view) +{ + return {view.data(), view.size()}; +} + +template <> +struct fmt::formatter : fmt::formatter { + auto format(Corrade::Containers::StringView value, format_context &ctx) const -> format_context::iterator + { + return fmt::formatter::format(fmt::string_view{value.data(), value.size()}, ctx); + } +}; From 3407ef2b205e4e342960686d0629c5e8f1ece13f Mon Sep 17 00:00:00 2001 From: Leo Parente <23251360+leoparente@users.noreply.github.com> Date: Fri, 10 Apr 2026 15:46:01 -0300 Subject: [PATCH 03/10] fix: update opentelemetry-cpp CMake target name for 1.24.0 Co-Authored-By: Claude Sonnet 4.6 --- src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e1d8db50d..a5e28750d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -45,7 +45,7 @@ target_link_libraries(visor-core datasketches rng timer - opentelemetry-cpp::opentelemetry_proto + opentelemetry-cpp::proto protobuf::libprotobuf maxminddb::maxminddb Corrade::Corrade From 9a36268a0f3f51004a3317f5524af49234e1acdd Mon Sep 17 00:00:00 2001 From: Leo Parente <23251360+leoparente@users.noreply.github.com> Date: Fri, 10 Apr 2026 15:46:09 -0300 Subject: [PATCH 04/10] fix: include CorradeCompat.h for StringView fmt support in AbstractPlugin Co-Authored-By: Claude Sonnet 4.6 --- src/AbstractPlugin.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/AbstractPlugin.cpp b/src/AbstractPlugin.cpp index d0edb22e0..3cd412229 100644 --- a/src/AbstractPlugin.cpp +++ b/src/AbstractPlugin.cpp @@ -3,6 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ #include "AbstractPlugin.h" +#include "CorradeCompat.h" #include #include From a7577ab6769fc04a0715311c27e1cd3a552002c4 Mon Sep 17 00:00:00 2001 From: Leo Parente <23251360+leoparente@users.noreply.github.com> Date: Fri, 10 Apr 2026 15:46:21 -0300 Subject: [PATCH 05/10] fix: adapt Policies.cpp to Corrade cci.20250327 StringView API Co-Authored-By: Claude Sonnet 4.6 --- src/Policies.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Policies.cpp b/src/Policies.cpp index b292be7f2..81dfd02b9 100644 --- a/src/Policies.cpp +++ b/src/Policies.cpp @@ -7,6 +7,7 @@ #include "HandlerManager.h" #include "InputStreamManager.h" #include "Taps.h" +#include "CorradeCompat.h" #include #include #include @@ -88,7 +89,7 @@ std::vector PolicyManager::load(const YAML::Node &policy_yaml, bool si auto [tap, tap_lock] = _registry->tap_manager()->module_get_locked(tap_name); policy_ptr->add_tap(tap); // ensure tap input type matches policy input tap - if (input_node["input_type"].as() != tap->input_plugin()->plugin()) { + if (input_node["input_type"].as() != corrade_to_std_string(tap->input_plugin()->plugin())) { throw PolicyException(fmt::format("input_type for policy specified tap '{}' doesn't match tap's defined input type: {}/{}", tap_name, input_node["input_type"].as(), tap->input_plugin()->plugin())); } // handler internal config From a3a09d7392d7131f9a8bcbbbbc33865c3d5875d0 Mon Sep 17 00:00:00 2001 From: Leo Parente <23251360+leoparente@users.noreply.github.com> Date: Fri, 10 Apr 2026 15:46:27 -0300 Subject: [PATCH 06/10] fix: convert Corrade StringView to std::string in Taps.h json assignment Co-Authored-By: Claude Sonnet 4.6 --- src/Taps.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Taps.h b/src/Taps.h index 3f51f0d58..12af29b90 100644 --- a/src/Taps.h +++ b/src/Taps.h @@ -9,6 +9,7 @@ #include "Configurable.h" #include "InputModulePlugin.h" #include +#include "CorradeCompat.h" namespace visor { @@ -56,7 +57,7 @@ class Tap : public AbstractModule void info_json(json &j) const override { - j["input_type"] = _input_plugin->plugin(); + j["input_type"] = corrade_to_std_string(_input_plugin->plugin()); j["interface"] = _input_plugin->pluginInterface(); config_json(j["config"]); _tags->config_json(j["tags"]); From a669b61663887d796a95f9e9e6804daae6fe82e9 Mon Sep 17 00:00:00 2001 From: Leo Parente <23251360+leoparente@users.noreply.github.com> Date: Fri, 10 Apr 2026 15:47:34 -0300 Subject: [PATCH 07/10] fix: adapt CoreRegistry to Corrade cci.20250327 StringView/StringIterable API Co-Authored-By: Claude Sonnet 4.6 --- src/CoreRegistry.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/CoreRegistry.cpp b/src/CoreRegistry.cpp index 408f8c1dd..d8a53a325 100644 --- a/src/CoreRegistry.cpp +++ b/src/CoreRegistry.cpp @@ -8,6 +8,7 @@ #include "InputStreamManager.h" #include "Policies.h" #include "Taps.h" +#include "CorradeCompat.h" #include #include #include @@ -62,7 +63,7 @@ void CoreRegistry::start(HttpServer *svr) InputPluginPtr mod = _input_registry.instantiate(alias); _logger->info("Load input stream plugin: {} version {} interface {}", alias, version, mod->pluginInterface()); mod->init_plugin(this, svr, &geo::GeoIP(), &geo::GeoASN()); - auto result = _input_plugins.insert({std::make_pair(alias, version), std::move(mod)}); + auto result = _input_plugins.insert({std::make_pair(corrade_to_std_string(alias), version), std::move(mod)}); if (!result.second) { throw std::runtime_error(fmt::format("Input alias '{}' with version '{}' was already loaded.", alias, version)); } @@ -92,7 +93,7 @@ void CoreRegistry::start(HttpServer *svr) HandlerPluginPtr mod = _handler_registry.instantiate(s); _logger->info("Load stream handler plugin: {} version {} interface {}", alias, version, mod->pluginInterface()); mod->init_plugin(this, svr, &geo::GeoIP(), &geo::GeoASN()); - auto result = _handler_plugins.insert({std::make_pair(alias, version), std::move(mod)}); + auto result = _handler_plugins.insert({std::make_pair(corrade_to_std_string(alias), version), std::move(mod)}); if (!result.second) { throw std::runtime_error(fmt::format("Handler alias '{}' with version '{}' was already loaded.", alias, version)); } From 751653e6c5d9aa042783e896627ba4f3060c6da0 Mon Sep 17 00:00:00 2001 From: Leo Parente <23251360+leoparente@users.noreply.github.com> Date: Fri, 10 Apr 2026 16:01:01 -0300 Subject: [PATCH 08/10] fix: update pluginSearchPaths() return type for Corrade cci.20250327 Co-Authored-By: Claude Sonnet 4.6 --- src/AbstractPlugin.h | 6 ++++-- src/HandlerModulePlugin.h | 4 ++-- src/InputModulePlugin.h | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/AbstractPlugin.h b/src/AbstractPlugin.h index 6377b6ac4..e708e12d1 100644 --- a/src/AbstractPlugin.h +++ b/src/AbstractPlugin.h @@ -5,6 +5,8 @@ #pragma once #include +#include +#include #include #include #include @@ -69,9 +71,9 @@ class AbstractPlugin : public Corrade::PluginManager::AbstractPlugin } public: - static std::vector pluginSearchPaths() + static Corrade::Containers::Array pluginSearchPaths() { - return {""}; + return {}; } explicit AbstractPlugin(Corrade::PluginManager::AbstractManager &manager, const std::string &plugin) diff --git a/src/HandlerModulePlugin.h b/src/HandlerModulePlugin.h index 7e1d19f71..48354d031 100644 --- a/src/HandlerModulePlugin.h +++ b/src/HandlerModulePlugin.h @@ -26,9 +26,9 @@ class HandlerModulePlugin : public AbstractPlugin return "visor.module.handler/1.0"; } - static std::vector pluginSearchPaths() + static Corrade::Containers::Array pluginSearchPaths() { - return {""}; + return {}; } explicit HandlerModulePlugin(Corrade::PluginManager::AbstractManager &manager, const std::string &plugin) diff --git a/src/InputModulePlugin.h b/src/InputModulePlugin.h index d11ddbbcf..bd780412c 100644 --- a/src/InputModulePlugin.h +++ b/src/InputModulePlugin.h @@ -23,9 +23,9 @@ class InputModulePlugin : public AbstractPlugin return "visor.module.input/1.0"; } - static std::vector pluginSearchPaths() + static Corrade::Containers::Array pluginSearchPaths() { - return {""}; + return {}; } explicit InputModulePlugin(Corrade::PluginManager::AbstractManager &manager, const std::string &plugin) From 95e2c1ccc2e61c91d202df19966b7fd625a1c9ac Mon Sep 17 00:00:00 2001 From: Leo Parente <23251360+leoparente@users.noreply.github.com> Date: Fri, 10 Apr 2026 16:05:58 -0300 Subject: [PATCH 09/10] fix: pluginInterface() must return global StringView for Corrade cci.20250327 Co-Authored-By: Claude Sonnet 4.6 --- src/HandlerModulePlugin.h | 5 +++-- src/InputModulePlugin.h | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/HandlerModulePlugin.h b/src/HandlerModulePlugin.h index 48354d031..80740290b 100644 --- a/src/HandlerModulePlugin.h +++ b/src/HandlerModulePlugin.h @@ -21,9 +21,10 @@ class HandlerModulePlugin : public AbstractPlugin static geo::MaxmindDB *asn; static geo::MaxmindDB *city; - static std::string pluginInterface() + static Corrade::Containers::StringView pluginInterface() { - return "visor.module.handler/1.0"; + using namespace Corrade::Containers::Literals; + return "visor.module.handler/1.0"_s; } static Corrade::Containers::Array pluginSearchPaths() diff --git a/src/InputModulePlugin.h b/src/InputModulePlugin.h index bd780412c..425bbafd1 100644 --- a/src/InputModulePlugin.h +++ b/src/InputModulePlugin.h @@ -18,9 +18,10 @@ class InputModulePlugin : public AbstractPlugin { public: - static std::string pluginInterface() + static Corrade::Containers::StringView pluginInterface() { - return "visor.module.input/1.0"; + using namespace Corrade::Containers::Literals; + return "visor.module.input/1.0"_s; } static Corrade::Containers::Array pluginSearchPaths() From ded09c295271dbd38d2adfbb0d04fdd9ae286ef1 Mon Sep 17 00:00:00 2001 From: Leo Parente <23251360+leoparente@users.noreply.github.com> Date: Fri, 10 Apr 2026 16:21:47 -0300 Subject: [PATCH 10/10] fix: resolve all Corrade cci.20250327 compatibility issues for macOS build - pluginSearchPaths() must return non-empty Array (at least one entry) when dynamic plugin support is enabled; use Array{1} to match the old std::vector{""} behavior - Add CORRADE_AUTOMATIC_INITIALIZER include in static_plugins.h headers (macro moved to Corrade/Utility/Macros.h in new version) - Fix CoreRegistry.cpp: use try_emplace instead of insert for std::unique_ptr values; include PointerStl.h for Corrade Pointer to std::unique_ptr conversion - Override CMAKE_OSX_SYSROOT after Conan toolchain re-include to fix '-isysroot macosx' invalid path issue on non-Xcode generators All 18 unit tests pass. Co-Authored-By: Claude Sonnet 4.6 --- CMakeLists.txt | 18 ++++++++++++++++++ src/AbstractPlugin.h | 2 +- src/CoreRegistry.cpp | 5 +++-- src/HandlerModulePlugin.h | 2 +- src/InputModulePlugin.h | 2 +- src/handlers/static_plugins.h | 3 +++ src/inputs/static_plugins.h | 3 +++ 7 files changed, 30 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1d3d1f4d2..eeeb34d6e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -73,6 +73,24 @@ if(_conan_generators AND EXISTS "${_conan_generators}/conan_toolchain.cmake") endif() unset(_conan_generators) +# On macOS with non-Xcode generators (e.g. Unix Makefiles), Conan sets +# CMAKE_OSX_SYSROOT to the shortname 'macosx' which only Xcode resolves. +# Clang requires the full SDK path. We override here, after the conan toolchain +# re-include above (which resets the value via FORCE). +if(APPLE AND NOT CMAKE_GENERATOR MATCHES "Xcode") + execute_process( + COMMAND xcrun --sdk macosx --show-sdk-path + OUTPUT_VARIABLE _VISOR_MACOS_SDK_PATH + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET + ) + if(_VISOR_MACOS_SDK_PATH) + set(CMAKE_OSX_SYSROOT "${_VISOR_MACOS_SDK_PATH}" CACHE STRING "macOS SDK path" FORCE) + message(STATUS "visor: macOS SDK path: ${CMAKE_OSX_SYSROOT}") + endif() + unset(_VISOR_MACOS_SDK_PATH) +endif() + include(sanitizer) if(CODE_COVERAGE) include(CodeCoverage) diff --git a/src/AbstractPlugin.h b/src/AbstractPlugin.h index e708e12d1..42a453ca4 100644 --- a/src/AbstractPlugin.h +++ b/src/AbstractPlugin.h @@ -73,7 +73,7 @@ class AbstractPlugin : public Corrade::PluginManager::AbstractPlugin public: static Corrade::Containers::Array pluginSearchPaths() { - return {}; + return Corrade::Containers::Array{1}; } explicit AbstractPlugin(Corrade::PluginManager::AbstractManager &manager, const std::string &plugin) diff --git a/src/CoreRegistry.cpp b/src/CoreRegistry.cpp index d8a53a325..fc6864d00 100644 --- a/src/CoreRegistry.cpp +++ b/src/CoreRegistry.cpp @@ -9,6 +9,7 @@ #include "Policies.h" #include "Taps.h" #include "CorradeCompat.h" +#include #include #include #include @@ -63,7 +64,7 @@ void CoreRegistry::start(HttpServer *svr) InputPluginPtr mod = _input_registry.instantiate(alias); _logger->info("Load input stream plugin: {} version {} interface {}", alias, version, mod->pluginInterface()); mod->init_plugin(this, svr, &geo::GeoIP(), &geo::GeoASN()); - auto result = _input_plugins.insert({std::make_pair(corrade_to_std_string(alias), version), std::move(mod)}); + auto result = _input_plugins.try_emplace(std::make_pair(corrade_to_std_string(alias), version), std::move(mod)); if (!result.second) { throw std::runtime_error(fmt::format("Input alias '{}' with version '{}' was already loaded.", alias, version)); } @@ -93,7 +94,7 @@ void CoreRegistry::start(HttpServer *svr) HandlerPluginPtr mod = _handler_registry.instantiate(s); _logger->info("Load stream handler plugin: {} version {} interface {}", alias, version, mod->pluginInterface()); mod->init_plugin(this, svr, &geo::GeoIP(), &geo::GeoASN()); - auto result = _handler_plugins.insert({std::make_pair(corrade_to_std_string(alias), version), std::move(mod)}); + auto result = _handler_plugins.try_emplace(std::make_pair(corrade_to_std_string(alias), version), std::move(mod)); if (!result.second) { throw std::runtime_error(fmt::format("Handler alias '{}' with version '{}' was already loaded.", alias, version)); } diff --git a/src/HandlerModulePlugin.h b/src/HandlerModulePlugin.h index 80740290b..6d005b307 100644 --- a/src/HandlerModulePlugin.h +++ b/src/HandlerModulePlugin.h @@ -29,7 +29,7 @@ class HandlerModulePlugin : public AbstractPlugin static Corrade::Containers::Array pluginSearchPaths() { - return {}; + return Corrade::Containers::Array{1}; } explicit HandlerModulePlugin(Corrade::PluginManager::AbstractManager &manager, const std::string &plugin) diff --git a/src/InputModulePlugin.h b/src/InputModulePlugin.h index 425bbafd1..4c069292e 100644 --- a/src/InputModulePlugin.h +++ b/src/InputModulePlugin.h @@ -26,7 +26,7 @@ class InputModulePlugin : public AbstractPlugin static Corrade::Containers::Array pluginSearchPaths() { - return {}; + return Corrade::Containers::Array{1}; } explicit InputModulePlugin(Corrade::PluginManager::AbstractManager &manager, const std::string &plugin) diff --git a/src/handlers/static_plugins.h b/src/handlers/static_plugins.h index 2a968cca2..063a36c33 100644 --- a/src/handlers/static_plugins.h +++ b/src/handlers/static_plugins.h @@ -1,5 +1,8 @@ #pragma once +#include +#include + static int import_handler_plugins() { CORRADE_PLUGIN_IMPORT(VisorHandlerNet); diff --git a/src/inputs/static_plugins.h b/src/inputs/static_plugins.h index 9d0e68d39..3ea5574c6 100644 --- a/src/inputs/static_plugins.h +++ b/src/inputs/static_plugins.h @@ -1,5 +1,8 @@ #pragma once +#include +#include + static int import_input_plugins() { CORRADE_PLUGIN_IMPORT(VisorInputMock);