24 #include <utils/system/dynamic_module/module.h>
25 #include <utils/system/file.h>
57 const char *Module::FILE_EXTENSION = SOEXT;
93 std::string full_filename =
"";
94 full_filename = filename_;
96 if (full_filename.find(
"." SOEXT, 0) != (full_filename.length() - 1 - strlen(FILE_EXTENSION))) {
98 full_filename +=
"." SOEXT;
102 tflags |= ((flags_ & MODULE_BIND_LAZY) != 0) ? RTLD_LAZY : RTLD_NOW;
103 tflags |= ((flags_ & MODULE_BIND_NOW) != 0) ? RTLD_NOW : 0;
104 tflags |= ((flags_ & MODULE_BIND_LOCAL) != 0) ? RTLD_LOCAL : 0;
105 tflags |= ((flags_ & MODULE_BIND_GLOBAL) != 0) ? RTLD_GLOBAL : 0;
106 tflags |= ((flags_ & MODULE_NODELETE) != 0) ? RTLD_NODELETE : 0;
108 tflags |= ((flags_ & MODULE_BIND_DEEP) != 0) ? RTLD_DEEPBIND : 0;
111 if (full_filename ==
"") {
112 handle_ = dlopen(NULL, tflags);
119 if (File::is_regular(full_filename.c_str())) {
121 handle_ = dlopen(full_filename.c_str(), tflags);
123 if (NULL == handle_) {
124 const char *err = dlerror();
126 throw ModuleOpenException(
"dlopen failed with an unknown error");
128 ModuleOpenException e(
"dlopen failed");
129 e.append(
"dlerror: %s", err);
133 is_resident_ =
false;
137 ModuleOpenException e(
"Cannot open module");
138 e.append(
"File '%s' does not exist", full_filename.c_str());
156 if ((ref_count_ == 0) && !is_resident_) {
157 if (dlclose(handle_) != 0) {
178 if (ref_count_ > 0) {
190 return (ref_count_ == 0);
197 Module::get_ref_count()
208 Module::operator==(
const Module &cmod)
210 return (filename_ == cmod.filename_);
223 Module::has_symbol(
const char *symbol_name)
225 if (symbol_name == NULL) {
228 if (handle_ == NULL) {
232 return (dlsym(handle_, symbol_name) != NULL);
245 Module::get_symbol(
const char *symbol_name)
247 if (symbol_name == NULL)
252 return dlsym(handle_, symbol_name);
261 Module::get_file_extension()
263 return FILE_EXTENSION;
270 Module::get_filename()
280 Module::get_base_filename()
282 if (filename_.find(
"/", 0) != std::string::npos) {
284 filename_.substr(filename_.rfind(
"/", filename_.length()) + 1, filename_.length());
287 return filename_.c_str();