bool loaded = fSoResolver->ensure_loaded();
if (loaded) {
- //auto dcm_backend_context_deleter = [&resolver](dcm_backend_context *dcmBackendContext) {
- // resolver.invoke<void, dcm_backend_context&>(
- // nullptr,
- // "dcm_backend_free_key_context",
- // *dcmBackendContext
- // );
- //};
- //fBackendContext = std::unique_ptr<dcm_backend_context, decltype(dcm_backend_context_deleter)>
- // (new dcm_backend_context, dcm_backend_context_deleter);
fBackendContext = std::unique_ptr<dcm_backend_context>(new dcm_backend_context);
fSoResolver->invoke<void, dcm_backend_context&, const std::string&>(
- nullptr,
"dcm_backend_create_key_context",
*fBackendContext,
message.key_type()
);
CryptoKeyType crypto_key_type = fSoResolver->invoke<CryptoKeyType, dcm_backend_context&>(
- nullptr,
"dcm_backend_key_type",
*fBackendContext
);
contextResponse->set_key_type(crypto_key_type);
unsigned int crypto_key_length = fSoResolver->invoke<unsigned int, dcm_backend_context&>(
- nullptr,
"dcm_backend_key_length",
*fBackendContext
);
bool loaded = fSoResolver->ensure_loaded();
if (loaded) {
error = fSoResolver->invoke<int, dcm_backend_context&, std::string&>(
- nullptr,
"dcm_backend_request_certificate_chain",
*fBackendContext,
cert_chain
bool loaded = fSoResolver->ensure_loaded();
if (loaded) {
error = fSoResolver->invoke<int, dcm_backend_context&, MessageDigestType, const std::string&, std::string&>(
- nullptr,
"dcm_backend_sign_crypto_data",
*fBackendContext,
message.digest_type(),
}
}
-void * so_resolver::resolve_function(const int * key_ptr, const char * name) noexcept
+void * so_resolver::resolve_function(const std::string& name) noexcept
{
BOOST_LOG_FUNCTION();
-
+
std::unique_lock<std::mutex> locker(fCacheLock);
-
- if(key_ptr) {
- auto it = fCache.find(key_ptr);
-
- if(it != fCache.end())
- return it->second;
- }
-
+ auto it = fCache.find(name);
+
+ if(it != fCache.end())
+ return it->second;
+
void * handle = fLibraryHandle.load(std::memory_order_relaxed);
if(handle) {
BOOST_LOG_SEV(dcm_logger::get(), log_severity::debug) << "Resolving symbol " << name << " from " << fLibraryName;
- void * sym = dlsym(handle, name);
+ void * sym = dlsym(handle, name.c_str());
if(!sym) {
BOOST_LOG_SEV(dcm_logger::get(), log_severity::error) << "Unable to resolve symbol " << name << " from " <<
fLibraryName << ": Error is " << dlerror();
} else {
try {
- if(key_ptr) {
- fCache.emplace(key_ptr, sym);
- }
+ fCache.emplace(name, sym);
} catch(...) {
}
}
bool so_resolver::ensure_loaded() noexcept
{
BOOST_LOG_FUNCTION();
-
+
std::unique_lock<std::mutex> locker(fCacheLock);
-
+
void * handle = fLibraryHandle.load(std::memory_order_acquire);
if(handle)
#include <stdexcept>
#include <map>
#include <mutex>
+#include <string>
class so_resolver : public boost::noncopyable {
public:
~so_resolver();
bool ensure_loaded() noexcept;
- void * resolve_function(const int * key_ptr, const char * name) noexcept;
+ void * resolve_function(const std::string& name) noexcept;
- template<typename ReturnValue, typename... Args> ReturnValue invoke(const int * __key_ptr, const char * name, Args... args) {
+ template<typename ReturnValue, typename... Args> ReturnValue invoke(const std::string& name, Args... args) {
typedef ReturnValue (* function_t)(Args...);
- function_t func = (function_t)resolve_function(__key_ptr, name);
+ function_t func = (function_t)resolve_function(name);
if(!func) {
throw std::runtime_error("Trying to call unresolved function");
}
std::string fLibraryName;
std::atomic<void *> fLibraryHandle;
std::mutex fCacheLock;
- std::map<const int *, void *> fCache;
+ std::map<std::string, void *> fCache;
};
#endif /* DCM_DAEMON_SORESOLVER_H_ */