Enabling the plugin loader to be able to load plugins without explicitly loading a shared object file first.

This commit is contained in:
Tobias Brunner 2010-03-01 16:07:07 +01:00
parent 3372ad144b
commit 3724668b3d
1 changed files with 37 additions and 0 deletions

View File

@ -67,6 +67,40 @@ static char* sanitize(char *str)
return str;
}
#ifdef MONOLITHIC
/**
* load a single plugin in monolithic mode
*/
static plugin_t* load_plugin(private_plugin_loader_t *this,
char *path, char *name)
{
char create[128];
plugin_t *plugin;
plugin_constructor_t constructor;
if (snprintf(create, sizeof(create), "%s_plugin_create",
name) >= sizeof(create))
{
return NULL;
}
sanitize(create);
constructor = dlsym(RTLD_DEFAULT, create);
if (constructor == NULL)
{
DBG1("plugin '%s': failed to load - %s not found", name, create);
return NULL;
}
plugin = constructor();
if (plugin == NULL)
{
DBG1("plugin '%s': failed to load - %s returned NULL", name, create);
return NULL;
}
DBG2("plugin '%s': loaded successfully", name);
return plugin;
}
#else
/**
* load a single plugin
*/
@ -131,6 +165,7 @@ static plugin_t* load_plugin(private_plugin_loader_t *this,
* the modules to keep loaded until leak report */
return plugin;
}
#endif
/**
* Implementation of plugin_loader_t.load_plugins.
@ -141,10 +176,12 @@ static bool load(private_plugin_loader_t *this, char *path, char *list)
char *token;
bool critical_failed = FALSE;
#ifndef MONOLITHIC
if (path == NULL)
{
path = PLUGINDIR;
}
#endif
enumerator = enumerator_create_token(list, " ", " ");
while (!critical_failed && enumerator->enumerate(enumerator, &token))