diff options
author | Patrick Venture <venture@google.com> | 2018-11-14 14:01:36 -0800 |
---|---|---|
committer | Patrick Venture <venture@google.com> | 2018-11-14 16:17:02 -0800 |
commit | 6c415c67011532fc0fb7c3051a4cf657ea93dfe0 (patch) | |
tree | 109191a7715367eb5c7dd40ddd479b29825a5139 /utils.cpp | |
parent | df209fa4ebac387417fc617511a199f7484bd103 (diff) | |
download | phosphor-ipmi-blobs-6c415c67011532fc0fb7c3051a4cf657ea93dfe0.tar.gz phosphor-ipmi-blobs-6c415c67011532fc0fb7c3051a4cf657ea93dfe0.zip |
bugfix: load handlers and use factory symbol
Use a predefined factory symbol to build each handler after loading the
library.
Change-Id: I0369c6e46a57c2e8533409d8b06eb74a3962434c
Signed-off-by: Patrick Venture <venture@google.com>
Diffstat (limited to 'utils.cpp')
-rw-r--r-- | utils.cpp | 33 |
1 files changed, 32 insertions, 1 deletions
@@ -2,7 +2,9 @@ #include <dlfcn.h> +#include <blobs-ipmid/manager.hpp> #include <experimental/filesystem> +#include <memory> #include <phosphor-logging/log.hpp> #include <regex> @@ -12,9 +14,13 @@ namespace blobs namespace fs = std::experimental::filesystem; using namespace phosphor::logging; +using HandlerFactory = std::unique_ptr<GenericBlobInterface> (*)(); + void loadLibraries(const std::string& path) { void* libHandle = NULL; + HandlerFactory factory; + auto* manager = getBlobManager(); for (const auto& p : fs::recursive_directory_iterator(path)) { @@ -30,12 +36,37 @@ void loadLibraries(const std::string& path) continue; } - libHandle = dlopen(ps.c_str(), RTLD_NOW); + libHandle = dlopen(ps.c_str(), RTLD_NOW | RTLD_GLOBAL); if (!libHandle) { log<level::ERR>("ERROR opening", entry("HANDLER=%s", ps.c_str()), entry("ERROR=%s", dlerror())); + continue; } + + dlerror(); /* Clear any previous error. */ + + factory = + reinterpret_cast<HandlerFactory>(dlsym(libHandle, "createHandler")); + + const char* error = dlerror(); + if (error) + { + log<level::ERR>("ERROR loading symbol", + entry("HANDLER=%s", ps.c_str()), + entry("ERROR=%s", error)); + continue; + } + + std::unique_ptr<GenericBlobInterface> result = factory(); + if (!result) + { + log<level::ERR>("Unable to create handler", + entry("HANDLER=%s", ps.c_str())); + continue; + } + + manager->registerHandler(std::move(result)); } } |