1
0
mirror of https://github.com/anope/anope.git synced 2026-07-07 17:03:13 +02:00

Remove static variables from functions in modules which causes them to be marked as gnu unique objects, which breaks dlclose()/dlopen() on g++ 4.5+

This commit is contained in:
Adam
2013-09-16 06:28:48 -04:00
parent 8cbaf7e990
commit e3c05efe5e
7 changed files with 74 additions and 59 deletions
+31 -7
View File
@@ -62,7 +62,7 @@
#define FOREACH_MOD(ename, args) \
if (true) \
{ \
static std::vector<Module *> &_modules = ModuleManager::GetEventHandlers(#ename); \
std::vector<Module *> &_modules = ModuleManager::EventHandlers[I_ ## ename]; \
for (std::vector<Module *>::iterator _i = _modules.begin(); _i != _modules.end();) \
{ \
try \
@@ -96,7 +96,7 @@ else \
if (true) \
{ \
ret = EVENT_CONTINUE; \
static std::vector<Module *> &_modules = ModuleManager::GetEventHandlers(#ename); \
std::vector<Module *> &_modules = ModuleManager::EventHandlers[I_ ## ename]; \
for (std::vector<Module *>::iterator _i = _modules.begin(); _i != _modules.end();) \
{ \
try \
@@ -1084,15 +1084,41 @@ class CoreExport Module : public Extensible
virtual EventReturn OnNickValidate(User *u, NickAlias *na) { throw NotImplementedException(); }
};
enum Implementation
{
I_OnPreUserKicked, I_OnUserKicked, I_OnReload, I_OnPreBotAssign, I_OnBotAssign, I_OnBotUnAssign, I_OnUserConnect,
I_OnNewServer, I_OnUserNickChange, I_OnPreHelp, I_OnPostHelp, I_OnPreCommand, I_OnPostCommand, I_OnSaveDatabase,
I_OnLoadDatabase, I_OnEncrypt, I_OnDecrypt, I_OnBotFantasy, I_OnBotNoFantasyAccess, I_OnBotBan, I_OnBadWordAdd,
I_OnBadWordDel, I_OnCreateBot, I_OnDelBot, I_OnBotKick, I_OnPrePartChannel, I_OnPartChannel, I_OnLeaveChannel,
I_OnJoinChannel, I_OnTopicUpdated, I_OnPreChanExpire, I_OnChanExpire, I_OnPreServerConnect, I_OnServerConnect,
I_OnPreUplinkSync, I_OnServerDisconnect, I_OnRestart, I_OnShutdown, I_OnPreNickExpire, I_OnNickExpire, I_OnDefconLevel,
I_OnExceptionAdd, I_OnExceptionDel, I_OnAddXLine, I_OnDelXLine, I_IsServicesOper, I_OnServerQuit, I_OnUserQuit,
I_OnPreUserLogoff, I_OnPostUserLogoff, I_OnBotCreate, I_OnBotChange, I_OnBotDelete, I_OnAccessDel, I_OnAccessAdd,
I_OnAccessClear, I_OnLevelChange, I_OnChanDrop, I_OnChanRegistered, I_OnChanSuspend, I_OnChanUnsuspend,
I_OnCreateChan, I_OnDelChan, I_OnChannelCreate, I_OnChannelDelete, I_OnAkickAdd, I_OnAkickDel, I_OnCheckKick,
I_OnChanInfo, I_OnCheckPriv, I_OnGroupCheckPriv, I_OnNickDrop, I_OnNickForbidden, I_OnNickGroup, I_OnNickIdentify,
I_OnUserLogin, I_OnNickLogout, I_OnNickRegister, I_OnNickSuspend, I_OnNickUnsuspended, I_OnDelNick, I_OnNickCoreCreate,
I_OnDelCore, I_OnChangeCoreDisplay, I_OnNickClearAccess, I_OnNickAddAccess, I_OnNickEraseAccess, I_OnNickClearCert,
I_OnNickAddCert, I_OnNickEraseCert, I_OnNickInfo, I_OnBotInfo, I_OnCheckAuthentication, I_OnNickUpdate,
I_OnFingerprint, I_OnUserAway, I_OnInvite, I_OnDeleteVhost, I_OnSetVhost, I_OnMemoSend, I_OnMemoDel,
I_OnChannelModeSet, I_OnChannelModeUnset, I_OnUserModeSet, I_OnUserModeUnset, I_OnChannelModeAdd, I_OnUserModeAdd,
I_OnMLock, I_OnUnMLock, I_OnModuleLoad, I_OnModuleUnload, I_OnServerSync, I_OnUplinkSync, I_OnBotPrivmsg, I_OnBotNotice,
I_OnPrivmsg, I_OnLog, I_OnLogMessage, I_OnDnsRequest, I_OnCheckModes, I_OnChannelSync, I_OnSetCorrectModes,
I_OnSerializeCheck, I_OnSerializableConstruct, I_OnSerializableDestruct, I_OnSerializableUpdate,
I_OnSerializeTypeCreate, I_OnSetChannelOption, I_OnSetNickOption, I_OnMessage, I_OnCanSet, I_OnCheckDelete,
I_OnExpireTick, I_OnNickValidate,
I_SIZE
};
/** Used to manage modules.
*/
class CoreExport ModuleManager
{
public:
/** Event handler hooks.
*/
static std::map<Anope::string, std::vector<Module *> > EventHandlers;
static std::vector<Module *> EventHandlers[I_SIZE];
public:
/** List of all modules loaded in Anope
*/
static std::list<Module *> Modules;
@@ -1103,8 +1129,6 @@ class CoreExport ModuleManager
static void CleanupRuntimeDirectory();
#endif
static std::vector<Module *> &GetEventHandlers(const Anope::string &name);
/** Loads a given module.
* @param m the module to load
* @param u the user who loaded it, NULL for auto-load
@@ -1154,7 +1178,7 @@ class CoreExport ModuleManager
* @param sz The number of modules being passed for PRIO_BEFORE and PRIO_AFTER. Defaults to 1, as most of the time you will only want to prioritize your module
* to be before or after one other module.
*/
static bool SetPriority(Module *mod, const Anope::string &event, Priority s, Module **modules = NULL, size_t sz = 1);
static bool SetPriority(Module *mod, Implementation i, Priority s, Module **modules = NULL, size_t sz = 1);
/** Change the priority of all events in a module.
* @param mod The module to set the priority of
+4 -2
View File
@@ -663,9 +663,12 @@ class ModuleDNS : public Module
bool remove_split_servers;
bool readd_connected_servers;
time_t last_warn;
public:
ModuleDNS(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, EXTRA | VENDOR),
zone_type("DNSZone", DNSZone::Unserialize), dns_type("DNSServer", DNSServer::Unserialize), commandosdns(this)
zone_type("DNSZone", DNSZone::Unserialize), dns_type("DNSServer", DNSServer::Unserialize), commandosdns(this),
last_warn(0)
{
@@ -840,7 +843,6 @@ class ModuleDNS : public Module
if (packet->answers.size() == answer_size)
{
static time_t last_warn = 0;
if (last_warn + 60 < Anope::CurTime)
{
last_warn = Anope::CurTime;
+2 -1
View File
@@ -325,6 +325,8 @@ class CommandOSRandomNews : public NewsBase
}
};
static unsigned cur_rand_news = 0;
class OSNews : public Module
{
Serialize::Type newsitem_type;
@@ -356,7 +358,6 @@ class OSNews : public Module
else if (Type == NEWS_RANDOM)
msg = _("[\002Random News\002 - %s] %s");
static unsigned cur_rand_news = 0;
unsigned displayed = 0, news_count = Config->GetModule(this)->Get<unsigned>("newscount", "3");
for (unsigned i = 0, end = newsList.size(); i < end; ++i)
{
+2 -2
View File
@@ -80,7 +80,7 @@ class LDAPService : public LDAPProvider, public Thread, public Condition
int i = ldap_initialize(&this->con, this->server.c_str());
if (i != LDAP_SUCCESS)
throw LDAPException("Unable to connect to LDAP service " + this->name + ": " + ldap_err2string(i));
static const int version = LDAP_VERSION3;
const int version = LDAP_VERSION3;
i = ldap_set_option(this->con, LDAP_OPT_PROTOCOL_VERSION, &version);
if (i != LDAP_OPT_SUCCESS)
throw LDAPException("Unable to set protocol version for " + this->name + ": " + ldap_err2string(i));
@@ -269,7 +269,7 @@ class LDAPService : public LDAPProvider, public Thread, public Condition
break;
}
static struct timeval tv = { 1, 0 };
struct timeval tv = { 1, 0 };
LDAPMessage *result;
int rtype = ldap_result(this->con, LDAP_RES_ANY, 1, &tv, &result);
if (rtype <= 0 || this->GetExitState())
+22 -22
View File
@@ -3,6 +3,28 @@
#include "modules/xmlrpc.h"
#include "modules/httpd.h"
static struct special_chars
{
Anope::string character;
Anope::string replace;
special_chars(const Anope::string &c, const Anope::string &r) : character(c), replace(r) { }
}
special[] = {
special_chars("&", "&amp;"),
special_chars("\"", "&quot;"),
special_chars("<", "&lt;"),
special_chars(">", "&qt;"),
special_chars("'", "&#39;"),
special_chars("\n", "&#xA;"),
special_chars("\002", ""), // bold
special_chars("\003", ""), // color
special_chars("\035", ""), // italics
special_chars("\037", ""), // underline
special_chars("\026", ""), // reverses
special_chars("", "")
};
class MyXMLRPCServiceInterface : public XMLRPCServiceInterface, public HTTPPage
{
std::deque<XMLRPCEvent *> events;
@@ -25,28 +47,6 @@ class MyXMLRPCServiceInterface : public XMLRPCServiceInterface, public HTTPPage
Anope::string Sanitize(const Anope::string &string) anope_override
{
static struct special_chars
{
Anope::string character;
Anope::string replace;
special_chars(const Anope::string &c, const Anope::string &r) : character(c), replace(r) { }
}
special[] = {
special_chars("&", "&amp;"),
special_chars("\"", "&quot;"),
special_chars("<", "&lt;"),
special_chars(">", "&qt;"),
special_chars("'", "&#39;"),
special_chars("\n", "&#xA;"),
special_chars("\002", ""), // bold
special_chars("\003", ""), // color
special_chars("\035", ""), // italics
special_chars("\037", ""), // underline
special_chars("\026", ""), // reverses
special_chars("", "")
};
Anope::string ret = string;
for (int i = 0; special[i].character.empty() == false; ++i)
ret = ret.replace_all_cs(special[i].character, special[i].replace);
+5 -4
View File
@@ -281,7 +281,7 @@ class Packet : public Query
if (q.name.find(':') != Anope::string::npos)
{
static const char *const hex = "0123456789abcdef";
const char *const hex = "0123456789abcdef";
char reverse_ip[128];
unsigned reverse_ip_count = 0;
for (int j = 15; j >= 0; --j)
@@ -662,7 +662,8 @@ class MyManager : public Manager, public Timer
public:
std::map<unsigned short, Request *> requests;
MyManager(Module *creator) : Manager(creator), Timer(300, Anope::CurTime, true), serial(Anope::CurTime), tcpsock(NULL), udpsock(NULL), listen(false)
MyManager(Module *creator) : Manager(creator), Timer(300, Anope::CurTime, true), serial(Anope::CurTime), tcpsock(NULL), udpsock(NULL),
listen(false), cur_id(rand())
{
}
@@ -717,13 +718,13 @@ class MyManager : public Manager, public Timer
}
private:
unsigned short cur_id;
unsigned short GetID()
{
if (this->udpsock->GetPackets().size() == 65535)
throw SocketException("DNS queue full");
static unsigned short cur_id = rand();
do
cur_id = (cur_id + 1) & 0xFFFF;
while (!cur_id || this->requests.count(cur_id));
+8 -21
View File
@@ -22,7 +22,7 @@
#endif
std::list<Module *> ModuleManager::Modules;
std::map<Anope::string, std::vector<Module *> > ModuleManager::EventHandlers;
std::vector<Module *> ModuleManager::EventHandlers[I_SIZE];
#ifdef _WIN32
void ModuleManager::CleanupRuntimeDirectory()
@@ -112,19 +112,6 @@ static ModuleReturn moduleCopyFile(const Anope::string &name, Anope::string &out
}
#endif
std::vector<Module *> &ModuleManager::GetEventHandlers(const Anope::string &name)
{
std::map<Anope::string, std::vector<Module *> >::iterator it = EventHandlers.find(name);
if (it != EventHandlers.end())
return it->second;
std::vector<Module *> &modules = EventHandlers[name];
/* Populate initial vector */
std::copy(Modules.begin(), Modules.end(), std::back_inserter(modules));
return modules;
}
/* This code was found online at http://www.linuxjournal.com/article/3687#comment-26593
*
* This function will take a pointer from either dlsym or GetProcAddress and cast it in
@@ -263,8 +250,8 @@ ModuleReturn ModuleManager::LoadModule(const Anope::string &modname, User *u)
Log(LOG_DEBUG) << "Module " << modname << " loaded.";
/* Attach module to all events */
for (std::map<Anope::string, std::vector<Module *> >::iterator it = EventHandlers.begin(); it != EventHandlers.end(); ++it)
it->second.push_back(m);
for (unsigned i = 0; i < I_SIZE; ++i)
EventHandlers[i].push_back(m);
FOREACH_MOD(OnModuleLoad, (u, m));
@@ -365,9 +352,9 @@ ModuleReturn ModuleManager::DeleteModule(Module *m)
void ModuleManager::DetachAll(Module *mod)
{
for (std::map<Anope::string, std::vector<Module *> >::iterator it = EventHandlers.begin(); it != EventHandlers.end(); ++it)
for (unsigned i = 0; i < I_SIZE; ++i)
{
std::vector<Module *> &mods = it->second;
std::vector<Module *> &mods = EventHandlers[i];
std::vector<Module *>::iterator it2 = std::find(mods.begin(), mods.end(), mod);
if (it2 != mods.end())
mods.erase(it2);
@@ -376,13 +363,13 @@ void ModuleManager::DetachAll(Module *mod)
bool ModuleManager::SetPriority(Module *mod, Priority s)
{
for (std::map<Anope::string, std::vector<Module *> >::iterator it = EventHandlers.begin(); it != EventHandlers.end(); ++it)
SetPriority(mod, it->first, s);
for (unsigned i = 0; i < I_SIZE; ++i)
SetPriority(mod, static_cast<Implementation>(i), s);
return true;
}
bool ModuleManager::SetPriority(Module *mod, const Anope::string &i, Priority s, Module **modules, size_t sz)
bool ModuleManager::SetPriority(Module *mod, Implementation i, Priority s, Module **modules, size_t sz)
{
/** To change the priority of a module, we first find its position in the vector,
* then we find the position of the other modules in the vector that this module