]> git.stg.codes - stg.git/blob - projects/sgauthstress/store_loader.cpp
[NY Flight] Improved socket reading for sgconf.
[stg.git] / projects / sgauthstress / store_loader.cpp
1 /*
2  *    This program is free software; you can redistribute it and/or modify
3  *    it under the terms of the GNU General Public License as published by
4  *    the Free Software Foundation; either version 2 of the License, or
5  *    (at your option) any later version.
6  *
7  *    This program is distributed in the hope that it will be useful,
8  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
9  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  *    GNU General Public License for more details.
11  *
12  *    You should have received a copy of the GNU General Public License
13  *    along with this program; if not, write to the Free Software
14  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
15  */
16
17 /*
18  *    Author : Maxim Mamontov <faust@stargazer.dp.ua>
19  */
20
21 /*
22  $Revision: 1.6 $
23  $Date: 2010/03/04 12:24:19 $
24  $Author: faust $
25  */
26
27 /*
28  *  An implementation of RAII store plugin loader
29  */
30
31 #include <dlfcn.h>
32
33 #include "stg/common.h"
34 #include "stg/module_settings.h"
35 #include "stg/store.h"
36 #include "store_loader.h"
37
38 STORE_LOADER::STORE_LOADER(const std::string & modulesPath,
39                            const MODULE_SETTINGS & settings)
40     : isLoaded(false),
41       handle(NULL),
42       plugin(NULL),
43       errorStr(),
44       storeSettings(settings),
45       pluginFileName(modulesPath + "/mod_" + storeSettings.moduleName + ".so")
46 {
47 }
48
49 STORE_LOADER::~STORE_LOADER()
50 {
51 Unload();
52 }
53
54 bool STORE_LOADER::Load()
55 {
56 if (isLoaded)
57     {
58     errorStr = "Store plugin '" + pluginFileName + "' was already loaded!";
59     printfd(__FILE__, "STORE_LOADER::Load() - %s\n", errorStr.c_str());
60     return false;
61     }
62
63 if (pluginFileName.empty())
64     {
65     errorStr = "Empty store plugin filename";
66     printfd(__FILE__, "STORE_LOADER::Load() - %s\n", errorStr.c_str());
67     return true;
68     }
69
70 handle = dlopen(pluginFileName.c_str(), RTLD_NOW);
71
72 if (!handle)
73     {
74     errorStr = "Error loading plugin '"
75         + pluginFileName + "': '" + dlerror() + "'";
76     printfd(__FILE__, "STORE_LOADER::Load() - %s\n", errorStr.c_str());
77     return true;
78     }
79
80 isLoaded = true;
81
82 STORE * (*GetStore)();
83 GetStore = (STORE * (*)())dlsym(handle, "GetStore");
84 if (!GetStore)
85     {
86     errorStr = std::string("GetStore() not found! ") + dlerror();
87     printfd(__FILE__, "STORE_LOADER::Load() - %s\n", errorStr.c_str());
88     return true;
89     }
90
91 plugin = GetStore();
92
93 if (!plugin)
94     {
95     errorStr = "Plugin was not created!";
96     printfd(__FILE__, "STORE_LOADER::Load() - %s\n");
97     return true;
98     }
99
100 plugin->SetSettings(storeSettings);
101 if (plugin->ParseSettings())
102     {
103     errorStr = plugin->GetStrError();
104     printfd(__FILE__, "STORE_LOADER::Load() - Failed to parse settings. Plugin reports: '%s'\n", errorStr.c_str());
105     return true;
106     }
107
108 return false;
109 }
110
111 bool STORE_LOADER::Unload()
112 {
113 if (!isLoaded)
114     {
115     return true;
116     }
117
118 printfd(__FILE__, "STORE_LOADER::Unload()\n");
119
120 if (dlclose(handle))
121     {
122     errorStr = "Failed to unload plugin '";
123     errorStr += pluginFileName + "': ";
124     errorStr += dlerror();
125     printfd(__FILE__, "STORE_LOADER::Unload() - %s\n", errorStr.c_str());
126     return true;
127     }
128
129 isLoaded = false;
130
131 return false;
132 }