/** Standard constructor gubbins
*/
- virtual ~Command() {}
+ virtual ~Command()
+ {
+ syntax.clear();
+ }
};
/** A hash of commands used by the core
{
ServerInstance = Instance;
}
-
+
+ ~UserManager()
+ {
+ for (user_hash::iterator i = clientlist->begin();i != clientlist->end();i++)
+ {
+ delete i->second;
+ }
+ clientlist->clear();
+ }
/** Client list, a hash_map containing all clients, local and remote
*/
{
if (!ServerInstance->PassCompare(user, ServerInstance->Config->diepass, parameters[0], ServerInstance->Config->powerhash))
{
- std::string diebuf = std::string("*** DIE command from ") + user->nick + "!" + user->ident + "@" + user->dhost + ". Terminating in " + ConvToStr(ServerInstance->Config->DieDelay) + " seconds.";
- ServerInstance->Logs->Log("COMMAND",SPARSE, diebuf);
- ServerInstance->SendError(diebuf);
+ {
+ std::string diebuf = std::string("*** DIE command from ") + user->nick + "!" + user->ident + "@" + user->dhost + ". Terminating in " + ConvToStr(ServerInstance->Config->DieDelay) + " seconds.";
+ ServerInstance->Logs->Log("COMMAND",SPARSE, diebuf);
+ ServerInstance->SendError(diebuf);
+ }
if (ServerInstance->Config->DieDelay)
sleep(ServerInstance->Config->DieDelay);
ServerConfig::ServerConfig(InspIRCd* Instance) : ServerInstance(Instance)
{
this->ClearStack();
- *ServerName = *Network = *ServerDesc = *AdminName = '\0';
+ *sid = *ServerName = *Network = *ServerDesc = *AdminName = '\0';
*HideWhoisServer = *AdminEmail = *AdminNick = *diepass = *restartpass = *FixedQuit = *HideKillsServer = '\0';
*DefaultModes = *CustomVersion = *motd = *rules = *PrefixQuit = *DieValue = *DNSServer = '\0';
*UserStats = *ModPath = *MyExecutable = *DisabledCommands = *PID = *SuffixQuit = '\0';
{
#ifdef WINDOWS
return true;
-#endif
+#else
char work[1024];
char buffer[1024];
{
return false;
}
+#endif
}
std::string ServerConfig::GetFullProgDir()
ServerInstance->SE->Shutdown(this, 2);
ServerInstance->SE->Close(this);
ServerInstance->Timers->DelTimer(this->PruneTimer);
- delete this->PruneTimer;
}
CachedQuery* DNS::GetCache(const std::string &source)
this->Modules->Unload(k->c_str());
}
}
-
- /* Close logging */
- this->Logs->CloseLogs();
+ /* Remove core commands */
+ Parser->RemoveCommands("<core>");
/* Cleanup Server Names */
for(servernamelist::iterator itr = servernames.begin(); itr != servernames.end(); ++itr)
delete (*itr);
+ /* Delete objects dynamically allocated in constructor
+ * (destructor would be more appropriate, but we're likely exiting)
+ */
+
+ // Must be deleted before modes as it decrements modelines
+ if (this->Users)
+ {
+ delete this->Users;
+ this->Users = 0;
+ }
+
+ if (this->Modes)
+ {
+ delete this->Modes;
+ this->Modes = 0;
+ }
+
+ if (this->XLines)
+ {
+ delete this->XLines;
+ this->XLines = 0;
+ }
+ if (this->Parser)
+ {
+ delete this->Parser;
+ this->Parser = 0;
+
+ if (this->stats)
+ {
+ delete this->stats;
+ this->stats = 0;
+ }
+
+ if (this->Modules)
+ {
+ delete this->Modules;
+ this->Modules = 0;
+ }
+
+ if (this->BanCache)
+ delete this->BanCache;
+ this->BanCache = 0;
+ }
+
+ if (this->SNO)
+ {
+ delete this->SNO;
+ this->SNO = 0;
+ }
+
+ if (this->Config)
+ {
+ delete this->Config;
+ this->Config = 0;
+ }
+
+ if (this->Res)
+ {
+ delete this->Res;
+ this->Res = 0;
+ }
+
+ if (this->chanlist)
+ {
+ delete chanlist;
+ chanlist = 0;
+ }
+
+ if (this->PI)
+ {
+ delete this->PI;
+ this->PI = 0;
+ }
+
+ if (this->Threads)
+ {
+ delete this->Threads;
+ this->Threads = 0;
+ }
+
+ /* Needs to be deleted after Res, DNS has a timer */
+ if (this->Timers)
+ {
+ delete this->Timers;
+ this->Timers = 0;
+ }
+
+ /* Close logging */
+ this->Logs->CloseLogs();
+
+ if (this->Logs)
+ {
+ delete this->Logs;
+ this->Logs = 0;
+ }
}
void InspIRCd::Restart(const std::string &reason)
{
#ifdef WIN32
+ // Strict, frequent checking of memory on debug builds
_CrtSetDbgFlag ( _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
+
+ // Avoid erroneous frees on early exit
+ WindowsIPC = 0;
#endif
int found_ports = 0;
FailedPortList pl;
do_nolog = 0, do_root = 0, do_testsuite = 0; /* flag variables */
char c = 0;
+ // Initialize so that if we exit before proper initialization they're not deleted
+ this->Logs = 0;
+ this->Threads = 0;
+ this->PI = 0;
+ this->Users = 0;
+ this->chanlist = 0;
+ this->Config = 0;
+ this->SNO = 0;
+ this->BanCache = 0;
+ this->Modules = 0;
+ this->stats = 0;
+ this->Timers = 0;
+ this->Parser = 0;
+ this->XLines = 0;
+ this->Modes = 0;
+ this->Res = 0;
+
+
memset(&server, 0, sizeof(server));
memset(&client, 0, sizeof(client));
this->Users->uuidlist = new user_hash();
this->chanlist = new chan_hash();
- this->Res = NULL;
-
this->Config = new ServerConfig(this);
this->SNO = new SnomaskManager(this);
this->BanCache = new BanCacheManager(this);
Config->sid[0] = (char)(sid / 100 + 48);
Config->sid[1] = (char)(((sid / 10) % 10) + 48);
Config->sid[2] = (char)(sid % 10 + 48);
+ Config->sid[3] = '\0';
}
/* set up fake client again this time with the correct uid */
NULL
};
- /* Clear mode list */
+ /* Clear mode handler list */
memset(modehandlers, 0, sizeof(modehandlers));
- memset(modewatchers, 0, sizeof(modewatchers));
/* Last parse string */
LastParse.clear();
return MODEACTION_ALLOW;
}
-
- return MODEACTION_DENY;
}
modulelist ml;
ml.push_back(Mod);
Interfaces[InterfaceName] = std::make_pair(0, ml);
- return true;
}
else
{
iter->second.second.push_back(Mod);
- return true;
}
- return false;
+ return true;
}
bool ModuleManager::UnpublishInterface(const std::string &InterfaceName, Module* Mod)
void InspIRCd::Exit(int status)
{
#ifdef WINDOWS
- delete WindowsIPC;
+ if (WindowsIPC)
+ delete WindowsIPC;
#endif
if (this)
{
}
SnomaskManager::~SnomaskManager()
-{
+{
+ for (std::map<char, Snomask *>::iterator i = SnoMasks.begin(); i != SnoMasks.end(); i++)
+ {
+ delete i->second;
+ }
+ SnoMasks.clear();
}
void SnomaskManager::FlushSnotices()
delete KFact;
delete QFact;
delete ZFact;
+
+ // Delete all existing XLines
+ for (XLineContainer::iterator i = lookup_lines.begin(); i != lookup_lines.end(); i++)
+ {
+ for (XLineLookup::iterator j = i->second.begin(); j != i->second.end(); j++)
+ {
+ delete j->second;
+ }
+ i->second.clear();
+ }
+ lookup_lines.clear();
+
}
void XLine::Apply(User* u)
#endif
#endif
- fprintf(f, "makedir:\n if not exist debug mkdir debug\n if not exist release mkdir release\n\n");
+#ifdef _DEBUG
+ fprintf(f, "makedir:\n if not exist debug mkdir debug\n if not exist ..\\..\\bin\\debug\\lib mkdir ..\\..\\bin\\debug\\lib\n\n");
+#else
+ fprintf(f, "makedir:\n if not exist release mkdir release\n if not exist ..\\..\\bin\\release\\lib mkdir ..\\..\\bin\\release\\lib\n\n");
+#endif
// dump modules.. again the second and last time :)
for(int i = 0; i < command_count; ++i)
#endif
#endif
- fprintf(f, "makedir:\n if not exist debug mkdir debug\n if not exist release mkdir release\n\n");
+#ifdef _DEBUG
+ fprintf(f, "makedir:\n if not exist debug mkdir debug\n if not exist ..\\..\\bin\\debug\\modules mkdir ..\\..\\bin\\debug\\modules\n\n");
+#else
+ fprintf(f, "makedir:\n if not exist release mkdir release\n if not exist ..\\..\\bin\\release\\modules mkdir ..\\..\\bin\\release\\modules\n\n");
+#endif
// dump modules.. again the second and last time :)
for(int i = 0; i < module_count; ++i)
/>\r
</Configuration>\r
<Configuration\r
- Name="Release|Win32"\r
- OutputDirectory="..\bin\release\modules"\r
- IntermediateDirectory="Release"\r
+ Name="Debug|x64"\r
+ OutputDirectory="..\bin\debug_x64\modules"\r
+ IntermediateDirectory="x64Debug_spanningtree"\r
ConfigurationType="2"\r
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
CharacterSet="2"\r
/>\r
<Tool\r
Name="VCMIDLTool"\r
+ TargetEnvironment="3"\r
/>\r
<Tool\r
Name="VCCLCompilerTool"\r
- AdditionalOptions="/MP"\r
- Optimization="1"\r
- WholeProgramOptimization="true"\r
+ Optimization="0"\r
AdditionalIncludeDirectories="..\include;..\win;..\src\modules\m_spanningtree;.;..\src\modules"\r
- PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;M_SPANNINGTREE_EXPORTS;DLL_BUILD"\r
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;DLL_BUILD;WIN64"\r
MinimalRebuild="true"\r
- RuntimeLibrary="2"\r
+ BasicRuntimeChecks="3"\r
+ RuntimeLibrary="1"\r
UsePrecompiledHeader="0"\r
- WarningLevel="2"\r
+ WarningLevel="3"\r
Detect64BitPortabilityProblems="true"\r
DebugInformationFormat="3"\r
/>\r
/>\r
<Tool\r
Name="VCLinkerTool"\r
- AdditionalOptions="/MD"\r
- AdditionalDependencies="ws2_32.lib inspircd.lib cmd_whois.lib cmd_stats.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib"\r
+ AdditionalDependencies="ws2_32.lib inspircd.lib cmd_whois.lib cmd_stats.lib"\r
OutputFile="$(OutDir)/m_spanningtree.so"\r
LinkIncremental="1"\r
- AdditionalLibraryDirectories="..\bin\release\bin;..\bin\release\lib"\r
+ AdditionalLibraryDirectories="..\bin\debug_x64\bin;..\bin\debug_x64\lib"\r
GenerateDebugInformation="true"\r
+ ProgramDatabaseFile="$(OutDir)/m_spanningtree.pdb"\r
SubSystem="2"\r
- OptimizeReferences="2"\r
- EnableCOMDATFolding="2"\r
- LinkTimeCodeGeneration="1"\r
ImportLibrary="$(OutDir)/m_spanningtree.lib"\r
- TargetMachine="1"\r
+ TargetMachine="17"\r
/>\r
<Tool\r
Name="VCALinkTool"\r
/>\r
<Tool\r
Name="VCPostBuildEventTool"\r
- Description="Re-basing shared objects..."\r
- CommandLine="@cd $(InputDir)
@$(InputDir)\rebase.bat
"\r
/>\r
</Configuration>\r
<Configuration\r
- Name="Debug|x64"\r
- OutputDirectory="..\bin\debug_x64\modules"\r
- IntermediateDirectory="x64Debug_spanningtree"\r
+ Name="Release|Win32"\r
+ OutputDirectory="..\bin\release\modules"\r
+ IntermediateDirectory="Release"\r
ConfigurationType="2"\r
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
CharacterSet="2"\r
/>\r
<Tool\r
Name="VCMIDLTool"\r
- TargetEnvironment="3"\r
/>\r
<Tool\r
Name="VCCLCompilerTool"\r
- Optimization="0"\r
+ Optimization="1"\r
+ WholeProgramOptimization="true"\r
AdditionalIncludeDirectories="..\include;..\win;..\src\modules\m_spanningtree;.;..\src\modules"\r
- PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;DLL_BUILD;WIN64"\r
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;M_SPANNINGTREE_EXPORTS;DLL_BUILD"\r
MinimalRebuild="true"\r
- BasicRuntimeChecks="3"\r
- RuntimeLibrary="1"\r
+ RuntimeLibrary="2"\r
UsePrecompiledHeader="0"\r
- WarningLevel="3"\r
+ WarningLevel="2"\r
Detect64BitPortabilityProblems="true"\r
DebugInformationFormat="3"\r
/>\r
/>\r
<Tool\r
Name="VCLinkerTool"\r
- AdditionalDependencies="ws2_32.lib inspircd.lib cmd_whois.lib cmd_stats.lib"\r
+ AdditionalOptions="/MD"\r
+ AdditionalDependencies="ws2_32.lib inspircd.lib cmd_whois.lib cmd_stats.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib"\r
OutputFile="$(OutDir)/m_spanningtree.so"\r
LinkIncremental="1"\r
- AdditionalLibraryDirectories="..\bin\debug_x64\bin;..\bin\debug_x64\lib"\r
+ AdditionalLibraryDirectories="..\bin\release\bin;..\bin\release\lib"\r
GenerateDebugInformation="true"\r
- ProgramDatabaseFile="$(OutDir)/m_spanningtree.pdb"\r
SubSystem="2"\r
+ OptimizeReferences="2"\r
+ EnableCOMDATFolding="2"\r
+ LinkTimeCodeGeneration="1"\r
ImportLibrary="$(OutDir)/m_spanningtree.lib"\r
- TargetMachine="17"\r
+ TargetMachine="1"\r
/>\r
<Tool\r
Name="VCALinkTool"\r
/>\r
<Tool\r
Name="VCPostBuildEventTool"\r
+ Description="Re-basing shared objects..."\r
+ CommandLine="@cd $(InputDir)
@"$(InputDir)\rebase.bat"
"\r
/>\r
</Configuration>\r
<Configuration\r