utils: add methods for finding and loading handlers

This module provides a couple basic methods for enumerating and then
loading handlers.

Change-Id: I4f58be313190c48de25c2b9578b7c622afefc656
Signed-off-by: Patrick Venture <venture@google.com>
diff --git a/utils.cpp b/utils.cpp
new file mode 100644
index 0000000..1daa3c9
--- /dev/null
+++ b/utils.cpp
@@ -0,0 +1,37 @@
+#include "utils.hpp"
+
+#include <dlfcn.h>
+
+#include <experimental/filesystem>
+#include <phosphor-logging/log.hpp>
+#include <regex>
+
+namespace blobs
+{
+
+namespace fs = std::experimental::filesystem;
+using namespace phosphor::logging;
+
+void loadLibraries(const std::string& path)
+{
+    void* libHandle = NULL;
+
+    for (const auto& p : fs::recursive_directory_iterator(path))
+    {
+        auto ps = p.path().string();
+
+        if (!std::regex_match(ps, std::regex(".+\\.so$")))
+        {
+            continue;
+        }
+
+        libHandle = dlopen(ps.c_str(), RTLD_NOW);
+        if (!libHandle)
+        {
+            log<level::ERR>("ERROR opening", entry("HANDLER=%s", ps.c_str()),
+                            entry("ERROR=%s", dlerror()));
+        }
+    }
+}
+
+} // namespace blobs