summaryrefslogtreecommitdiffstats
path: root/utils.cpp
diff options
context:
space:
mode:
authorPatrick Venture <venture@google.com>2018-11-14 14:01:36 -0800
committerPatrick Venture <venture@google.com>2018-11-14 16:17:02 -0800
commit6c415c67011532fc0fb7c3051a4cf657ea93dfe0 (patch)
tree109191a7715367eb5c7dd40ddd479b29825a5139 /utils.cpp
parentdf209fa4ebac387417fc617511a199f7484bd103 (diff)
downloadphosphor-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.cpp33
1 files changed, 32 insertions, 1 deletions
diff --git a/utils.cpp b/utils.cpp
index 5253c1c..2395a2e 100644
--- a/utils.cpp
+++ b/utils.cpp
@@ -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));
}
}
OpenPOWER on IntegriCloud