summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKarel Klic <kklic@redhat.com>2010-02-04 18:11:00 +0100
committerKarel Klic <kklic@redhat.com>2010-02-04 18:11:00 +0100
commit3007949d04ec13ecf2ef0473b2d487f68b0d068f (patch)
tree5ee9c68b664c301f722f5873558458476ac91515 /src
parentad55daf143dcf6f00f2c5000d0ab6c752e8ff323 (diff)
parent0f261310a1e6dc6284fc147df9eed44816bc7572 (diff)
downloadabrt-3007949d04ec13ecf2ef0473b2d487f68b0d068f.tar.gz
abrt-3007949d04ec13ecf2ef0473b2d487f68b0d068f.tar.xz
abrt-3007949d04ec13ecf2ef0473b2d487f68b0d068f.zip
Merge branch 'master' of ssh://git.fedorahosted.org/git/abrt
Diffstat (limited to 'src')
-rw-r--r--src/Daemon/ABRTPlugin.cpp46
-rw-r--r--src/Daemon/ABRTPlugin.h161
-rw-r--r--src/Daemon/Makefile.am1
-rw-r--r--src/Daemon/PluginManager.cpp63
-rw-r--r--src/Daemon/PluginManager.h3
5 files changed, 58 insertions, 216 deletions
diff --git a/src/Daemon/ABRTPlugin.cpp b/src/Daemon/ABRTPlugin.cpp
deleted file mode 100644
index eb0b50d9..00000000
--- a/src/Daemon/ABRTPlugin.cpp
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- ABRTPlugin.cpp
-
- Copyright (C) 2009 Zdenek Prikryl (zprikryl@redhat.com)
- Copyright (C) 2009 RedHat inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "abrtlib.h"
-#include "ABRTPlugin.h"
-#include <dlfcn.h>
-
-CLoadedModule::CLoadedModule(const char* pLibPath)
-{
- /* All errors are fatal */
- m_pHandle = dlopen(pLibPath, RTLD_NOW);
- if (!m_pHandle)
- error_msg_and_die("can't load '%s': %s", pLibPath, dlerror());
-
-#define LOADSYM(fp, handle, name) do { \
- fp = (typeof(fp)) (dlsym(handle, name)); \
- if (!fp) \
- error_msg_and_die("'%s' has no %s entry", pLibPath, name); \
-} while (0)
-
- LOADSYM(m_pPluginInfo, m_pHandle, "plugin_info");
- LOADSYM(m_pFnPluginNew, m_pHandle, "plugin_new");
-}
-
-CLoadedModule::~CLoadedModule()
-{
- dlclose(m_pHandle);
-}
diff --git a/src/Daemon/ABRTPlugin.h b/src/Daemon/ABRTPlugin.h
deleted file mode 100644
index 57d87f05..00000000
--- a/src/Daemon/ABRTPlugin.h
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- ABRTPlugin.h - header file for abrt plugin.
-
- Copyright (C) 2009 Zdenek Prikryl (zprikryl@redhat.com)
- Copyright (C) 2009 RedHat inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-
-#ifndef ABRTPLUGIN_H_
-#define ABRTPLUGIN_H_
-
-#include <string>
-#include "Plugin.h"
-
-/**
- * CLoadedModule class. A class which contains a loaded plugin.
- */
-class CLoadedModule
-{
- private:
- /**
- * dlopen'ed library
- */
- void* m_pHandle;
- /**
- * A pointer to struc containing information about plugin.
- */
- const plugin_info_t* m_pPluginInfo;
- /**
- * A pointer to function, which creates new instances of plugin.
- */
- CPlugin* (*m_pFnPluginNew)();
-
- public:
- /**
- * A constructor.
- * The constructor loads a plugin
- * @param pLibPath a path to a plugin
- */
- CLoadedModule(const char* pLibPath);
- /**
- * A destructor.
- */
- ~CLoadedModule();
- /**
- * It is used for getting loaded plugin's version.
- * @return plugin version
- */
- const char* GetVersion();
- /**
- * It is used for getting loaded plugin's magic number.
- * @return magic number
- */
- int GetMagicNumber();
- /**
- * It is used for getting loaded plugin's name.
- * @return magic number
- */
- const char* GetName();
- /**
- * It is used for getting loaded plugin's description.
- * @return magic number
- */
- const char* GetDescription();
- /**
- * It is used for getting an author email of loaded plugin.
- * @return description
- */
- const char* GetEmail();
- /**
- * It is used for getting a home page of loaded plugin.
- * @return home page
- */
- const char* GetWWW();
- /**
- * It is used for getting a path to gui description.
- * @return home page
- */
- const char* GetGTKBuilder();
- /**
- * It is used for getting loaded plugin's type.
- * @return type
- */
- plugin_type_t GetType();
- /**
- * It is used fot getting of a new instance of loaded plugin
- * @return pointer to new allocated instance of plugin. A caller
- * has to delete it.
- */
- CPlugin* PluginNew();
-};
-
-inline
-const char* CLoadedModule::GetVersion()
-{
- return m_pPluginInfo->m_sVersion;
-}
-
-inline
-int CLoadedModule::GetMagicNumber()
-{
- return m_pPluginInfo->m_nMagicNumber;
-}
-
-inline
-const char* CLoadedModule::GetName()
-{
- return m_pPluginInfo->m_sName;
-}
-
-inline
-const char* CLoadedModule::GetDescription()
-{
- return m_pPluginInfo->m_sDescription;
-}
-
-inline
-const char* CLoadedModule::GetEmail()
-{
- return m_pPluginInfo->m_sEmail;
-}
-
-inline
-const char* CLoadedModule::GetWWW()
-{
- return m_pPluginInfo->m_sWWW;
-}
-
-inline
-const char* CLoadedModule::GetGTKBuilder()
-{
- return m_pPluginInfo->m_sGTKBuilder;
-}
-
-inline
-plugin_type_t CLoadedModule::GetType()
-{
- return m_pPluginInfo->m_Type;
-}
-
-inline
-CPlugin* CLoadedModule::PluginNew()
-{
- return m_pFnPluginNew();
-}
-
-#endif /*ABRTPLUGIN_H_*/
diff --git a/src/Daemon/Makefile.am b/src/Daemon/Makefile.am
index 235b01b9..cb440277 100644
--- a/src/Daemon/Makefile.am
+++ b/src/Daemon/Makefile.am
@@ -4,7 +4,6 @@ sbin_PROGRAMS = abrtd
# disabled: CommLayerServerSocket.h CommLayerServerSocket.cpp
abrtd_SOURCES = \
- ABRTPlugin.h ABRTPlugin.cpp \
PluginManager.h PluginManager.cpp \
RPM.h RPM.cpp \
MiddleWare.h MiddleWare.cpp \
diff --git a/src/Daemon/PluginManager.cpp b/src/Daemon/PluginManager.cpp
index 15e9bee8..5166c6a4 100644
--- a/src/Daemon/PluginManager.cpp
+++ b/src/Daemon/PluginManager.cpp
@@ -21,6 +21,7 @@
#include <fstream>
#include <iostream>
+#include <dlfcn.h>
#include "abrtlib.h"
#include "ABRTException.h"
#include "CommLayerInner.h"
@@ -29,6 +30,48 @@
using namespace std;
+
+/**
+ * CLoadedModule class. A class which contains a loaded plugin.
+ */
+class CLoadedModule
+{
+ private:
+ /* dlopen'ed library */
+ void *m_pHandle;
+ const plugin_info_t *m_pPluginInfo;
+ CPlugin* (*m_pFnPluginNew)();
+
+ public:
+ CLoadedModule(void *handle, const char *mod_name);
+ ~CLoadedModule() { dlclose(m_pHandle); }
+ int GetMagicNumber() { return m_pPluginInfo->m_nMagicNumber; }
+ const char *GetVersion() { return m_pPluginInfo->m_sVersion; }
+ const char *GetName() { return m_pPluginInfo->m_sName; }
+ const char *GetDescription() { return m_pPluginInfo->m_sDescription; }
+ const char *GetEmail() { return m_pPluginInfo->m_sEmail; }
+ const char *GetWWW() { return m_pPluginInfo->m_sWWW; }
+ const char *GetGTKBuilder() { return m_pPluginInfo->m_sGTKBuilder; }
+ plugin_type_t GetType() { return m_pPluginInfo->m_Type; }
+ CPlugin *PluginNew() { return m_pFnPluginNew(); }
+};
+CLoadedModule::CLoadedModule(void *handle, const char *mod_name)
+{
+ m_pHandle = handle;
+ /* All errors are fatal */
+#define LOADSYM(fp, handle, name) \
+ do { \
+ fp = (typeof(fp)) (dlsym(handle, name)); \
+ if (!fp) \
+ error_msg_and_die("'%s' has no %s entry", mod_name, name); \
+ } while (0)
+
+ LOADSYM(m_pPluginInfo, handle, "plugin_info");
+ LOADSYM(m_pFnPluginNew, handle, "plugin_new");
+#undef LOADSYM
+}
+
+
/**
* Text representation of plugin types.
*/
@@ -200,7 +243,13 @@ CPlugin* CPluginManager::LoadPlugin(const char *pName, bool enabled_only)
}
string libPath = ssprintf(PLUGINS_LIB_DIR"/"PLUGINS_LIB_PREFIX"%s."PLUGINS_LIB_EXTENSION, pName);
- CLoadedModule* module = new CLoadedModule(libPath.c_str());
+ void *handle = dlopen(libPath.c_str(), RTLD_NOW);
+ if (!handle)
+ {
+ error_msg("Can't load '%s': %s", libPath.c_str(), dlerror());
+ return NULL; /* error */
+ }
+ CLoadedModule *module = new CLoadedModule(handle, pName);
if (module->GetMagicNumber() != PLUGINS_MAGIC_NUMBER
|| module->GetType() < 0
|| module->GetType() > MAX_PLUGIN_TYPE
@@ -214,7 +263,7 @@ CPlugin* CPluginManager::LoadPlugin(const char *pName, bool enabled_only)
}
VERB3 log("Loaded plugin %s v.%s", pName, module->GetVersion());
- CPlugin* plugin = NULL;
+ CPlugin *plugin = NULL;
try
{
plugin = module->PluginNew();
@@ -297,7 +346,7 @@ void CPluginManager::UnRegisterPluginDBUS(const char *pName, const char *pDBUSSe
CAnalyzer* CPluginManager::GetAnalyzer(const char *pName)
{
- CPlugin* plugin = LoadPlugin(pName);
+ CPlugin *plugin = LoadPlugin(pName);
if (!plugin)
{
error_msg("Plugin '%s' is not registered", pName);
@@ -313,7 +362,7 @@ CAnalyzer* CPluginManager::GetAnalyzer(const char *pName)
CReporter* CPluginManager::GetReporter(const char *pName)
{
- CPlugin* plugin = LoadPlugin(pName);
+ CPlugin *plugin = LoadPlugin(pName);
if (!plugin)
{
error_msg("Plugin '%s' is not registered", pName);
@@ -329,7 +378,7 @@ CReporter* CPluginManager::GetReporter(const char *pName)
CAction* CPluginManager::GetAction(const char *pName, bool silent)
{
- CPlugin* plugin = LoadPlugin(pName);
+ CPlugin *plugin = LoadPlugin(pName);
if (!plugin)
{
error_msg("Plugin '%s' is not registered", pName);
@@ -346,7 +395,7 @@ CAction* CPluginManager::GetAction(const char *pName, bool silent)
CDatabase* CPluginManager::GetDatabase(const char *pName)
{
- CPlugin* plugin = LoadPlugin(pName);
+ CPlugin *plugin = LoadPlugin(pName);
if (!plugin)
{
throw CABRTException(EXCEP_PLUGIN, "Plugin '%s' is not registered", pName);
@@ -360,7 +409,7 @@ CDatabase* CPluginManager::GetDatabase(const char *pName)
plugin_type_t CPluginManager::GetPluginType(const char *pName)
{
- CPlugin* plugin = LoadPlugin(pName);
+ CPlugin *plugin = LoadPlugin(pName);
if (!plugin)
{
throw CABRTException(EXCEP_PLUGIN, "Plugin '%s' is not registered", pName);
diff --git a/src/Daemon/PluginManager.h b/src/Daemon/PluginManager.h
index 22cc387b..8eebe7da 100644
--- a/src/Daemon/PluginManager.h
+++ b/src/Daemon/PluginManager.h
@@ -24,13 +24,14 @@
#define PLUGINMANAGER_H_
#include "abrt_types.h"
-#include "ABRTPlugin.h"
#include "Plugin.h"
#include "Analyzer.h"
#include "Reporter.h"
#include "Database.h"
#include "Action.h"
+class CLoadedModule; /* opaque */
+
/**
* A class. It takes care of loading, registering and manipulating with
* plugins. When a plugin is loaded, its library is opened, but no plugin