/*
* Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
- * Author : Maxim Mamontov <faust@stargazer.dp.ua>
+ * Author : Maksym Mamontov <stg@madf.info>
*/
#include "plugin_runner.h"
//-----------------------------------------------------------------------------
PLUGIN_RUNNER::PLUGIN_RUNNER(const std::string & fileName,
+ const std::string & name,
const MODULE_SETTINGS & ms,
ADMINS & admins,
TARIFFS & tariffs,
STORE & store,
const SETTINGS & settings)
: pluginFileName(fileName),
+ pluginName(name),
libHandle(NULL),
m_plugin(Load(ms, admins, tariffs, users, services, corporations,
traffcounter, store, settings))
//-----------------------------------------------------------------------------
PLUGIN_RUNNER::~PLUGIN_RUNNER()
{
+delete &m_plugin;
if (dlclose(libHandle))
{
errorStr = "Failed to unload plugin '" + pluginFileName + "': " + dlerror();
return res;
}
//-----------------------------------------------------------------------------
-int PLUGIN_RUNNER::Reload()
+int PLUGIN_RUNNER::Reload(const MODULE_SETTINGS & ms)
{
-int res = m_plugin.Reload();
+int res = m_plugin.Reload(ms);
errorStr = m_plugin.GetStrError();
return res;
}
{
if (pluginFileName.empty())
{
- errorStr = "Empty plugin file name.";
- printfd(__FILE__, "PLUGIN_RUNNER::Load() - %s\n", errorStr.c_str());
- throw Error(errorStr);
+ const std::string msg = "Empty plugin file name.";
+ printfd(__FILE__, "PLUGIN_RUNNER::Load() - %s\n", msg.c_str());
+ throw Error(msg);
+ }
+
+if (access(pluginFileName.c_str(), R_OK))
+ {
+ const std::string msg = "Plugin file '" + pluginFileName + "' is missing or inaccessible.";
+ printfd(__FILE__, "PLUGIN_RUNNER::Load() - %s\n", msg.c_str());
+ throw Error(msg);
}
libHandle = dlopen(pluginFileName.c_str(), RTLD_NOW);
if (!libHandle)
{
- errorStr = "Error loading plugin '" + pluginFileName + "': '" + dlerror() + "'";
- printfd(__FILE__, "PLUGIN_RUNNER::Load() - %s\n", errorStr.c_str());
- throw Error(errorStr);
+ std::string msg = "Error loading plugin '" + pluginFileName + "'";
+ const char* error = dlerror();
+ if (error)
+ msg = msg + ": '" + error + "'";
+ printfd(__FILE__, "PLUGIN_RUNNER::Load() - %s\n", msg.c_str());
+ throw Error(msg);
}
PLUGIN * (*GetPlugin)();
GetPlugin = (PLUGIN * (*)())dlsym(libHandle, "GetPlugin");
if (!GetPlugin)
{
- errorStr = "Plugin '" + pluginFileName + "' does not have GetPlugin() function. " + dlerror();
- printfd(__FILE__, "PLUGIN_RUNNER::Load() - %s\n", errorStr.c_str());
- throw Error(errorStr);
+ const std::string msg = "Plugin '" + pluginFileName + "' does not have GetPlugin() function. ";
+ printfd(__FILE__, "PLUGIN_RUNNER::Load() - %s\n", msg.c_str());
+ throw Error(msg);
}
PLUGIN * plugin = GetPlugin();
if (!plugin)
{
- errorStr = "Failed to create an instance of plugin '" + pluginFileName + "'.";
- printfd(__FILE__, "PLUGIN_RUNNER::Load() - %s\n", errorStr.c_str());
- throw Error(errorStr);
+ const std::string msg = "Failed to create an instance of plugin '" + pluginFileName + "'.";
+ printfd(__FILE__, "PLUGIN_RUNNER::Load() - %s\n", msg.c_str());
+ throw Error(msg);
}
plugin->SetSettings(ms);
if (plugin->ParseSettings())
{
- errorStr = "Plugin '" + pluginFileName + "' is unable to parse settings. " + plugin->GetStrError();
- printfd(__FILE__, "PLUGIN_RUNNER::Load() - %s\n", errorStr.c_str());
- throw Error(errorStr);
+ const std::string msg = "Plugin '" + pluginFileName + "' is unable to parse settings. " + plugin->GetStrError();
+ printfd(__FILE__, "PLUGIN_RUNNER::Load() - %s\n", msg.c_str());
+ throw Error(msg);
}
return *plugin;