summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordanieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7>2009-10-19 04:09:30 +0000
committerdanieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7>2009-10-19 04:09:30 +0000
commit33141a0825e7cf2dcd0cae63da8943626d8a06b6 (patch)
treeb69c1eb64fc035ac5046a0ca521d8142613d9477
parent041401bc1fa01d5b1397b20847f8c95b8ea2a4f8 (diff)
Close files opened by configreader
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@11915 e03df62e-2008-0410-955e-edbf42e46eb7
-rw-r--r--include/logger.h14
-rw-r--r--src/configreader.cpp48
-rw-r--r--src/logger.cpp16
-rw-r--r--src/mode.cpp7
4 files changed, 50 insertions, 35 deletions
diff --git a/include/logger.h b/include/logger.h
index 4914e86a2..e3b7ee0a5 100644
--- a/include/logger.h
+++ b/include/logger.h
@@ -147,18 +147,8 @@ class CoreExport LogManager
public:
- LogManager()
- {
- noforkstream = NULL;
- Logging = false;
- }
-
- ~LogManager()
- {
- if (noforkstream)
- delete noforkstream;
- Logging = true;
- }
+ LogManager();
+ ~LogManager();
/** Sets up the logstream for -nofork. Called by InspIRCd::OpenLog() and LogManager::OpenFileLogs().
* First time called it creates the nofork stream and stores it in noforkstream. Each call thereafter just readds it to GlobalLogStreams
diff --git a/src/configreader.cpp b/src/configreader.cpp
index 80d123842..545ff86c2 100644
--- a/src/configreader.cpp
+++ b/src/configreader.cpp
@@ -203,7 +203,9 @@ struct Parser
nextword(name);
int spc = next();
- if (!isspace(spc))
+ if (spc == '>')
+ unget(spc);
+ else if (!isspace(spc))
throw CoreException("Invalid character in tag name");
if (name.empty())
@@ -303,6 +305,20 @@ void ParseStack::DoInclude(ConfigTag* tag, int flags)
}
}
+/** RAII wrapper on FILE* to close files on exceptions */
+struct FileWrapper
+{
+ FILE* const f;
+ FileWrapper(FILE* file) : f(file) {}
+ operator bool() { return f; }
+ operator FILE*() { return f; }
+ ~FileWrapper()
+ {
+ if (f)
+ fclose(f);
+ }
+};
+
bool ParseStack::ParseFile(const std::string& name, int flags)
{
ServerInstance->Logs->Log("CONFIG", DEBUG, "Reading file %s", name.c_str());
@@ -316,7 +332,7 @@ bool ParseStack::ParseFile(const std::string& name, int flags)
/* It's not already included, add it to the list of files we've loaded */
- FILE* file = fopen(name.c_str(), "r");
+ FileWrapper file(fopen(name.c_str(), "r"));
if (!file)
throw CoreException("Could not read \"" + name + "\" for include");
@@ -340,7 +356,7 @@ bool ParseStack::ParseExec(const std::string& name, int flags)
/* It's not already included, add it to the list of files we've loaded */
- FILE* file = popen(name.c_str(), "r");
+ FileWrapper file(popen(name.c_str(), "r"));
if (!file)
throw CoreException("Could not open executable \"" + name + "\" for include");
@@ -1245,31 +1261,23 @@ bool ServerConfig::ReadFile(file_cache &F, const std::string& fname)
if (fname.empty())
return false;
- FILE* file = NULL;
char linebuf[MAXBUF];
F.clear();
- if (!FileExists(fname.c_str()))
- return false;
- file = fopen(fname.c_str(), "r");
+ FileWrapper file(fopen(fname.c_str(), "r"));
- if (file)
+ if (!file)
+ return false;
+ while (!feof(file))
{
- while (!feof(file))
- {
- if (fgets(linebuf, sizeof(linebuf), file))
- linebuf[strlen(linebuf)-1] = 0;
- else
- *linebuf = 0;
-
- F.push_back(*linebuf ? linebuf : " ");
- }
+ if (fgets(linebuf, sizeof(linebuf), file))
+ linebuf[strlen(linebuf)-1] = 0;
+ else
+ *linebuf = 0;
- fclose(file);
+ F.push_back(*linebuf ? linebuf : " ");
}
- else
- return false;
return true;
}
diff --git a/src/logger.cpp b/src/logger.cpp
index be28bf836..19e07e78f 100644
--- a/src/logger.cpp
+++ b/src/logger.cpp
@@ -42,6 +42,22 @@
*
*/
+LogManager::LogManager()
+{
+ noforkstream = NULL;
+ Logging = false;
+}
+
+LogManager::~LogManager()
+{
+ if (noforkstream)
+ {
+ ServerInstance->Logs = this;
+ delete noforkstream;
+ ServerInstance->Logs = NULL;
+ }
+}
+
void LogManager::SetupNoFork()
{
if (!noforkstream)
diff --git a/src/mode.cpp b/src/mode.cpp
index 47553f238..65a027e90 100644
--- a/src/mode.cpp
+++ b/src/mode.cpp
@@ -55,13 +55,14 @@ ModeHandler::ModeHandler(Module* Creator, const std::string& Name, char modelett
CullResult ModeHandler::cull()
{
- ServerInstance->Modes->DelMode(this);
+ if (ServerInstance->Modes)
+ ServerInstance->Modes->DelMode(this);
return classbase::cull();
}
ModeHandler::~ModeHandler()
{
- if (ServerInstance && ServerInstance->Modes->FindMode(mode, m_type) == this)
+ if (ServerInstance && ServerInstance->Modes && ServerInstance->Modes->FindMode(mode, m_type) == this)
ServerInstance->Logs->Log("MODE", DEBUG, "ERROR: Destructor for mode %c called while not culled", mode);
}
@@ -1026,7 +1027,7 @@ ModeParser::ModeParser()
ModeParser::~ModeParser()
{
- ModeHandler* mh = ServerInstance->Modes->FindMode('h', MODETYPE_CHANNEL);
+ ModeHandler* mh = FindMode('h', MODETYPE_CHANNEL);
if (mh)
{
mh->cull();