27 #include <boost/filesystem.hpp>
29 #include <drizzled/plugin.h>
31 #include <drizzled/error.h>
32 #include <drizzled/errmsg_print.h>
33 #include <drizzled/module/library.h>
36 namespace fs=boost::filesystem;
41 module::Library::Library(
const std::string &name_arg,
43 const Manifest *manifest_arg)
44 : name(name_arg), handle(handle_arg), manifest(manifest_arg)
56 const fs::path module::Library::getLibraryPath(
const string &plugin_name)
58 string plugin_lib_name(
"lib");
59 plugin_lib_name.append(plugin_name);
60 plugin_lib_name.append(
"_plugin");
61 #if defined(TARGET_OS_OSX)
62 plugin_lib_name.append(
".dylib");
64 plugin_lib_name.append(
".so");
68 return plugin_dir / plugin_lib_name;
71 module::Library *module::Library::loadLibrary(
const string &plugin_name,
bool builtin)
78 size_t found= plugin_name.find(FN_LIBCHAR);
79 if (found != string::npos)
81 errmsg_printf(error::ERROR,
"%s",ER(ER_PLUGIN_NO_PATHS));
85 void *dl_handle= NULL;
91 dl_handle= dlopen(NULL, RTLD_NOW|RTLD_LOCAL);
92 if (dl_handle == NULL)
94 const char *errmsg= dlerror();
95 errmsg_printf(error::ERROR, ER(ER_CANT_OPEN_LIBRARY),
96 dlpath.c_str(), errno, errmsg);
105 dlpath= Library::getLibraryPath(plugin_name).file_string();
106 dl_handle= dlopen(dlpath.c_str(), RTLD_NOW|RTLD_GLOBAL);
107 if (dl_handle == NULL)
109 const char *errmsg= dlerror();
110 uint32_t dlpathlen= dlpath.length();
111 if (not dlpath.compare(0, dlpathlen, errmsg))
114 if (*errmsg ==
':') errmsg++;
115 if (*errmsg ==
' ') errmsg++;
117 errmsg_printf(error::ERROR, ER(ER_CANT_OPEN_LIBRARY),
118 dlpath.c_str(), errno, errmsg);
128 string plugin_decl_sym(
"_drizzled_");
129 plugin_decl_sym.append(plugin_name);
130 plugin_decl_sym.append(
"_plugin_");
133 void *sym= dlsym(dl_handle, plugin_decl_sym.c_str());
136 const char* errmsg= dlerror();
137 errmsg_printf(error::ERROR,
"%s", errmsg);
138 errmsg_printf(error::ERROR, ER(ER_CANT_FIND_DL_ENTRY),
139 plugin_decl_sym.c_str(), dlpath.c_str());
145 const Manifest *module_manifest=
static_cast<module::Manifest *
>(sym);
146 if (module_manifest->drizzle_version != DRIZZLE_VERSION_ID)
148 errmsg_printf(error::ERROR,
149 _(
"Plugin module %s was compiled for version %" PRIu64
", "
150 "which does not match the current running version of "
151 "Drizzle: %" PRIu64
"."),
152 dlpath.c_str(), module_manifest->drizzle_version,
153 static_cast<uint64_t
>(DRIZZLE_VERSION_ID));
157 return new module::Library(plugin_name, dl_handle, module_manifest);