summaryrefslogtreecommitdiff
path: root/media/pluginManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'media/pluginManager.cpp')
-rw-r--r--media/pluginManager.cpp25
1 files changed, 23 insertions, 2 deletions
diff --git a/media/pluginManager.cpp b/media/pluginManager.cpp
index 38be5d4..cd31be3 100644
--- a/media/pluginManager.cpp
+++ b/media/pluginManager.cpp
@@ -312,9 +312,13 @@ void cUPnPResourceProvider::OnContainerUpdate(const string& uri, long int cUID,
void cUPnPResourceProvider::Action(){}
upnp::cPluginManager::cPluginManager()
+: selfhandle(NULL)
{}
-upnp::cPluginManager::~cPluginManager(){}
+upnp::cPluginManager::~cPluginManager(){
+ if(selfhandle)
+ dlclose(selfhandle);
+}
const cPluginManager::ProfilerList& upnp::cPluginManager::GetProfilers() const {
return profilers;
@@ -338,10 +342,27 @@ cUPnPResourceProvider* upnp::cPluginManager::CreateProvider(const string& schema
#define UPNPPLUGIN_PREFIX "libupnp-"
#define SO_INDICATOR ".so."
-bool upnp::cPluginManager::LoadPlugins(const string& directory){
+bool upnp::cPluginManager::LoadPlugins(){
+
+ Dl_info info;
+ static int marker=0;
+ if(!dladdr((void *)&marker,&info)) {
+ esyslog("UPnP\tError while getting information about myself: %s", dlerror());
+ return false;
+ }
+
+ selfhandle = dlopen(info.dli_fname,RTLD_NOW|RTLD_GLOBAL);
+ if(!selfhandle) {
+ esyslog("Error while opening myself: %s",dlerror());
+ return false;
+ }
DIR* dirHandle;
struct dirent* dirEntry;
+ string library = info.dli_fname;
+ string directory = library.substr(0, library.find_last_of('/'));
+
+ dsyslog("UPnP\tScanning %s for plugins.", directory.c_str());
if((dirHandle = opendir(directory.c_str())) == NULL){
return false;