Mercurial > irccd
changeset 707:48afa8c41f50
Irccd: verify dynlib_plugin major version too
While here, fix the dynlib_plugin test that was not updated at that time.
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sat, 07 Jul 2018 08:56:25 +0200 |
parents | bd7feaa002cb |
children | 0dd4fb9dfcc8 |
files | cmake/internal/sysconfig.hpp.in libirccd/irccd/daemon/dynlib_plugin.cpp plugins/links/links.cpp tests/src/libirccd/dynlib-plugin/test_plugin.cpp |
diffstat | 4 files changed, 31 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/cmake/internal/sysconfig.hpp.in Fri Jul 06 19:32:54 2018 +0200 +++ b/cmake/internal/sysconfig.hpp.in Sat Jul 07 08:56:25 2018 +0200 @@ -93,4 +93,14 @@ #cmakedefine HAVE_STD_PUT_TIME #cmakedefine HAVE_SYSLOG +/** + * \brief Describe irccd version. + */ +struct version { + unsigned major{IRCCD_VERSION_MAJOR}; //!< major + unsigned minor{IRCCD_VERSION_MINOR}; //!< minor + unsigned patch{IRCCD_VERSION_PATCH}; //!< patch + unsigned abi{IRCCD_VERSION_SHLIB}; //!< ABI compatibility +}; + #endif // !IRCCD_SYSCONFIG_HPP
--- a/libirccd/irccd/daemon/dynlib_plugin.cpp Fri Jul 06 19:32:54 2018 +0200 +++ b/libirccd/irccd/daemon/dynlib_plugin.cpp Sat Jul 07 08:56:25 2018 +0200 @@ -70,13 +70,16 @@ { const auto [ abisym, initsym ] = symbol(path); - using abisym_func_type = unsigned (); + using abisym_func_type = version (); using initsym_func_type = std::unique_ptr<plugin> (); const auto abi = boost::dll::import<abisym_func_type>(path, abisym); const auto init = boost::dll::import<initsym_func_type>(path, initsym); - if (abi() != IRCCD_VERSION_SHLIB) + // The abi version is reset after new major version, check for both. + const version current; + + if (current.major != abi().major || current.abi != abi().abi) throw plugin_error(plugin_error::exec_error, id, "incompatible version"); auto plg = init();
--- a/plugins/links/links.cpp Fri Jul 06 19:32:54 2018 +0200 +++ b/plugins/links/links.cpp Sat Jul 07 08:56:25 2018 +0200 @@ -427,9 +427,9 @@ extern "C" { BOOST_SYMBOL_EXPORT -auto irccd_abi_links() -> unsigned +auto irccd_abi_links() -> version { - return IRCCD_VERSION_SHLIB; + return version(); } BOOST_SYMBOL_EXPORT
--- a/tests/src/libirccd/dynlib-plugin/test_plugin.cpp Fri Jul 06 19:32:54 2018 +0200 +++ b/tests/src/libirccd/dynlib-plugin/test_plugin.cpp Sat Jul 07 08:56:25 2018 +0200 @@ -120,8 +120,20 @@ } }; -extern "C" BOOST_SYMBOL_EXPORT test_plugin irccd_plugin_test_plugin; +extern "C" { + +BOOST_SYMBOL_EXPORT +auto irccd_abi_test_plugin() -> version +{ + return version(); +} -test_plugin irccd_plugin_test_plugin("test", ""); +BOOST_SYMBOL_EXPORT +auto irccd_init_test_plugin() -> std::unique_ptr<plugin> +{ + return std::make_unique<test_plugin>("testplugin", ""); +} + +} // !C } // !irccd