summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/inspircd_io.h34
-rw-r--r--src/commands.cpp2
-rw-r--r--src/inspircd.cpp266
-rw-r--r--src/inspircd_io.cpp287
-rw-r--r--src/modules.cpp2
5 files changed, 291 insertions, 300 deletions
diff --git a/include/inspircd_io.h b/include/inspircd_io.h
index e5447ecb3..c067de059 100644
--- a/include/inspircd_io.h
+++ b/include/inspircd_io.h
@@ -67,38 +67,8 @@ class ServerConfig
char PID[1024];
std::stringstream config_f;
- ServerConfig()
- {
- *ServerName = '\0';
- *Network = '\0';
- *ServerDesc = '\0';
- *AdminName = '\0';
- *AdminEmail = '\0';
- *AdminNick = '\0';
- *diepass = '\0';
- *restartpass = '\0';
- *motd = '\0';
- *rules = '\0';
- *PrefixQuit = '\0';
- *DieValue = '\0';
- *DNSServer = '\0';
- *ModPath = '\0';
- *MyExecutable = '\0';
- *DisabledCommands = '\0';
- *PID = '\0';
- log_file = NULL;
- nofork = false;
- unlimitcore = false;
- AllowHalfop = true;
- dns_timeout = 5;
- NetBufferSize = 10240;
- SoftLimit = MAXCLIENTS;
- MaxConn = SOMAXCONN;
- MaxWhoResults = 100;
- debugging = 0;
- LogLevel = DEFAULT;
- DieDelay = 5;
- }
+ ServerConfig();
+ void Read(bool bail, userrec* user);
};
diff --git a/src/commands.cpp b/src/commands.cpp
index 9c16a58ad..a9bc5895e 100644
--- a/src/commands.cpp
+++ b/src/commands.cpp
@@ -1089,7 +1089,7 @@ void handle_rehash(char **parameters, int pcnt, userrec *user)
else
{
WriteOpers("%s is rehashing config file %s",user->nick,CleanFilename(CONFIG_FILE));
- ReadConfig(false,user);
+ Config->Read(false,user);
}
FOREACH_MOD OnRehash(parameter);
}
diff --git a/src/inspircd.cpp b/src/inspircd.cpp
index 0e4e976c4..b0fbed667 100644
--- a/src/inspircd.cpp
+++ b/src/inspircd.cpp
@@ -209,270 +209,6 @@ std::string getadminnick()
return Config->AdminNick;
}
-void ReadConfig(bool bail, userrec* user)
-{
- char dbg[MAXBUF],pauseval[MAXBUF],Value[MAXBUF],timeout[MAXBUF],NB[MAXBUF],flood[MAXBUF],MW[MAXBUF],MCON[MAXBUF];
- char AH[MAXBUF],AP[MAXBUF],AF[MAXBUF],DNT[MAXBUF],pfreq[MAXBUF],thold[MAXBUF],sqmax[MAXBUF],rqmax[MAXBUF],SLIMT[MAXBUF];
- ConnectClass c;
- std::stringstream errstr;
- include_stack.clear();
-
- if (!LoadConf(CONFIG_FILE,&Config->config_f,&errstr))
- {
- errstr.seekg(0);
- log(DEFAULT,"There were errors in your configuration:\n%s",errstr.str().c_str());
- if (bail)
- {
- printf("There were errors in your configuration:\n%s",errstr.str().c_str());
- Exit(0);
- }
- else
- {
- char dataline[1024];
- if (user)
- {
- WriteServ(user->fd,"NOTICE %s :There were errors in the configuration file:",user->nick);
- while (!errstr.eof())
- {
- errstr.getline(dataline,1024);
- WriteServ(user->fd,"NOTICE %s :%s",user->nick,dataline);
- }
- }
- else
- {
- WriteOpers("There were errors in the configuration file:");
- while (!errstr.eof())
- {
- errstr.getline(dataline,1024);
- WriteOpers(dataline);
- }
- }
- return;
- }
- }
-
- ConfValue("server","name",0,Config->ServerName,&Config->config_f);
- ConfValue("server","description",0,Config->ServerDesc,&Config->config_f);
- ConfValue("server","network",0,Config->Network,&Config->config_f);
- ConfValue("admin","name",0,Config->AdminName,&Config->config_f);
- ConfValue("admin","email",0,Config->AdminEmail,&Config->config_f);
- ConfValue("admin","nick",0,Config->AdminNick,&Config->config_f);
- ConfValue("files","motd",0,Config->motd,&Config->config_f);
- ConfValue("files","rules",0,Config->rules,&Config->config_f);
- ConfValue("power","diepass",0,Config->diepass,&Config->config_f);
- ConfValue("power","pause",0,pauseval,&Config->config_f);
- ConfValue("power","restartpass",0,Config->restartpass,&Config->config_f);
- ConfValue("options","prefixquit",0,Config->PrefixQuit,&Config->config_f);
- ConfValue("die","value",0,Config->DieValue,&Config->config_f);
- ConfValue("options","loglevel",0,dbg,&Config->config_f);
- ConfValue("options","netbuffersize",0,NB,&Config->config_f);
- ConfValue("options","maxwho",0,MW,&Config->config_f);
- ConfValue("options","allowhalfop",0,AH,&Config->config_f);
- ConfValue("options","allowprotect",0,AP,&Config->config_f);
- ConfValue("options","allowfounder",0,AF,&Config->config_f);
- ConfValue("dns","server",0,Config->DNSServer,&Config->config_f);
- ConfValue("dns","timeout",0,DNT,&Config->config_f);
- ConfValue("options","moduledir",0,Config->ModPath,&Config->config_f);
- ConfValue("disabled","commands",0,Config->DisabledCommands,&Config->config_f);
- ConfValue("options","somaxconn",0,MCON,&Config->config_f);
- ConfValue("options","softlimit",0,SLIMT,&Config->config_f);
-
- Config->SoftLimit = atoi(SLIMT);
- if ((Config->SoftLimit < 1) || (Config->SoftLimit > MAXCLIENTS))
- {
- log(DEFAULT,"WARNING: <options:softlimit> value is greater than %d or less than 0, set to %d.",MAXCLIENTS,MAXCLIENTS);
- Config->SoftLimit = MAXCLIENTS;
- }
- Config->MaxConn = atoi(MCON);
- if (Config->MaxConn > SOMAXCONN)
- log(DEFAULT,"WARNING: <options:somaxconn> value may be higher than the system-defined SOMAXCONN value!");
- Config->NetBufferSize = atoi(NB);
- Config->MaxWhoResults = atoi(MW);
- Config->dns_timeout = atoi(DNT);
- if (!Config->dns_timeout)
- Config->dns_timeout = 5;
- if (!Config->MaxConn)
- Config->MaxConn = SOMAXCONN;
- if (!*Config->DNSServer)
- strlcpy(Config->DNSServer,"127.0.0.1",MAXBUF);
- if (!*Config->ModPath)
- strlcpy(Config->ModPath,MOD_PATH,MAXBUF);
- Config->AllowHalfop = ((!strcasecmp(AH,"true")) || (!strcasecmp(AH,"1")) || (!strcasecmp(AH,"yes")));
- if ((!Config->NetBufferSize) || (Config->NetBufferSize > 65535) || (Config->NetBufferSize < 1024))
- {
- log(DEFAULT,"No NetBufferSize specified or size out of range, setting to default of 10240.");
- Config->NetBufferSize = 10240;
- }
- if ((!Config->MaxWhoResults) || (Config->MaxWhoResults > 65535) || (Config->MaxWhoResults < 1))
- {
- log(DEFAULT,"No MaxWhoResults specified or size out of range, setting to default of 128.");
- Config->MaxWhoResults = 128;
- }
- Config->LogLevel = DEFAULT;
- if (!strcmp(dbg,"debug"))
- {
- Config->LogLevel = DEBUG;
- Config->debugging = 1;
- }
- if (!strcmp(dbg,"verbose"))
- Config->LogLevel = VERBOSE;
- if (!strcmp(dbg,"default"))
- Config->LogLevel = DEFAULT;
- if (!strcmp(dbg,"sparse"))
- Config->LogLevel = SPARSE;
- if (!strcmp(dbg,"none"))
- Config->LogLevel = NONE;
-
- readfile(Config->MOTD,Config->motd);
- log(DEFAULT,"Reading message of the day...");
- readfile(Config->RULES,Config->rules);
- log(DEFAULT,"Reading connect classes...");
- Classes.clear();
- for (int i = 0; i < ConfValueEnum("connect",&Config->config_f); i++)
- {
- strcpy(Value,"");
- ConfValue("connect","allow",i,Value,&Config->config_f);
- ConfValue("connect","timeout",i,timeout,&Config->config_f);
- ConfValue("connect","flood",i,flood,&Config->config_f);
- ConfValue("connect","pingfreq",i,pfreq,&Config->config_f);
- ConfValue("connect","threshold",i,thold,&Config->config_f);
- ConfValue("connect","sendq",i,sqmax,&Config->config_f);
- ConfValue("connect","recvq",i,rqmax,&Config->config_f);
- if (Value[0])
- {
- strlcpy(c.host,Value,MAXBUF);
- c.type = CC_ALLOW;
- strlcpy(Value,"",MAXBUF);
- ConfValue("connect","password",i,Value,&Config->config_f);
- strlcpy(c.pass,Value,MAXBUF);
- c.registration_timeout = 90; // default is 2 minutes
- c.pingtime = 120;
- c.flood = atoi(flood);
- c.threshold = 5;
- c.sendqmax = 262144; // 256k
- c.recvqmax = 4096; // 4k
- if (atoi(thold)>0)
- {
- c.threshold = atoi(thold);
- }
- if (atoi(sqmax)>0)
- {
- c.sendqmax = atoi(sqmax);
- }
- if (atoi(rqmax)>0)
- {
- c.recvqmax = atoi(rqmax);
- }
- if (atoi(timeout)>0)
- {
- c.registration_timeout = atoi(timeout);
- }
- if (atoi(pfreq)>0)
- {
- c.pingtime = atoi(pfreq);
- }
- Classes.push_back(c);
- log(DEBUG,"Read connect class type ALLOW, host=%s password=%s timeout=%lu flood=%lu",c.host,c.pass,(unsigned long)c.registration_timeout,(unsigned long)c.flood);
- }
- else
- {
- ConfValue("connect","deny",i,Value,&Config->config_f);
- strlcpy(c.host,Value,MAXBUF);
- c.type = CC_DENY;
- Classes.push_back(c);
- log(DEBUG,"Read connect class type DENY, host=%s",c.host);
- }
-
- }
- log(DEFAULT,"Reading K lines,Q lines and Z lines from config...");
- read_xline_defaults();
- log(DEFAULT,"Applying K lines, Q lines and Z lines...");
- apply_lines(APPLY_ALL);
-
- ConfValue("pid","file",0,Config->PID,&Config->config_f);
- // write once here, to try it out and make sure its ok
- WritePID(Config->PID);
-
- log(DEFAULT,"Done reading configuration file, InspIRCd is now starting.");
- if (!bail)
- {
- log(DEFAULT,"Adding and removing modules due to rehash...");
-
- std::vector<std::string> old_module_names, new_module_names, added_modules, removed_modules;
-
- // store the old module names
- for (std::vector<std::string>::iterator t = module_names.begin(); t != module_names.end(); t++)
- {
- old_module_names.push_back(*t);
- }
-
- // get the new module names
- for (int count2 = 0; count2 < ConfValueEnum("module",&Config->config_f); count2++)
- {
- ConfValue("module","name",count2,Value,&Config->config_f);
- new_module_names.push_back(Value);
- }
-
- // now create a list of new modules that are due to be loaded
- // and a seperate list of modules which are due to be unloaded
- for (std::vector<std::string>::iterator _new = new_module_names.begin(); _new != new_module_names.end(); _new++)
- {
- bool added = true;
- for (std::vector<std::string>::iterator old = old_module_names.begin(); old != old_module_names.end(); old++)
- {
- if (*old == *_new)
- added = false;
- }
- if (added)
- added_modules.push_back(*_new);
- }
- for (std::vector<std::string>::iterator oldm = old_module_names.begin(); oldm != old_module_names.end(); oldm++)
- {
- bool removed = true;
- for (std::vector<std::string>::iterator newm = new_module_names.begin(); newm != new_module_names.end(); newm++)
- {
- if (*newm == *oldm)
- removed = false;
- }
- if (removed)
- removed_modules.push_back(*oldm);
- }
- // now we have added_modules, a vector of modules to be loaded, and removed_modules, a vector of modules
- // to be removed.
- int rem = 0, add = 0;
- if (!removed_modules.empty())
- for (std::vector<std::string>::iterator removing = removed_modules.begin(); removing != removed_modules.end(); removing++)
- {
- if (UnloadModule(removing->c_str()))
- {
- WriteOpers("*** REHASH UNLOADED MODULE: %s",removing->c_str());
- WriteServ(user->fd,"973 %s %s :Module %s successfully unloaded.",user->nick, removing->c_str(), removing->c_str());
- rem++;
- }
- else
- {
- WriteServ(user->fd,"972 %s %s :Failed to unload module %s: %s",user->nick, removing->c_str(), removing->c_str(), ModuleError());
- }
- }
- if (!added_modules.empty())
- for (std::vector<std::string>::iterator adding = added_modules.begin(); adding != added_modules.end(); adding++)
- {
- if (LoadModule(adding->c_str()))
- {
- WriteOpers("*** REHASH LOADED MODULE: %s",adding->c_str());
- WriteServ(user->fd,"975 %s %s :Module %s successfully loaded.",user->nick, adding->c_str(), adding->c_str());
- add++;
- }
- else
- {
- WriteServ(user->fd,"974 %s %s :Failed to load module %s: %s",user->nick, adding->c_str(), adding->c_str(), ModuleError());
- }
- }
- log(DEFAULT,"Successfully unloaded %lu of %lu modules and loaded %lu of %lu modules.",(unsigned long)rem,(unsigned long)removed_modules.size(),(unsigned long)add,(unsigned long)added_modules.size());
- }
-}
-
-
/* add a channel to a user, creating the record for it if needed and linking
* it to the user record */
@@ -2227,7 +1963,7 @@ int InspIRCd(char** argv, int argc)
* into smaller sub-functions, much tidier -- Brain
*/
OpenLog(argv, argc);
- ReadConfig(true,NULL);
+ Config->Read(true,NULL);
CheckRoot();
SetupCommandTable();
AddServerName(Config->ServerName);
diff --git a/src/inspircd_io.cpp b/src/inspircd_io.cpp
index aa29202cc..24eacb833 100644
--- a/src/inspircd_io.cpp
+++ b/src/inspircd_io.cpp
@@ -37,6 +37,291 @@ extern int openSockfd[MAXSOCKS];
extern time_t TIME;
std::vector<std::string> include_stack;
+ServerConfig::ServerConfig()
+{
+ *ServerName = *Network = *ServerDesc = *AdminName = '\0';
+ *AdminEmail = *AdminNick = *diepass = *restartpass = '\0';
+ *motd = *rules = *PrefixQuit = *DieValue = *DNSServer = '\0';
+ *ModPath = *MyExecutable = *DisabledCommands = *PID = '\0';
+ log_file = NULL;
+ nofork = false;
+ unlimitcore = false;
+ AllowHalfop = true;
+ dns_timeout = 5;
+ NetBufferSize = 10240;
+ SoftLimit = MAXCLIENTS;
+ MaxConn = SOMAXCONN;
+ MaxWhoResults = 100;
+ debugging = 0;
+ LogLevel = DEFAULT;
+ DieDelay = 5;
+}
+
+
+void ServerConfig::Read(bool bail, userrec* user)
+{
+ char dbg[MAXBUF],pauseval[MAXBUF],Value[MAXBUF],timeout[MAXBUF],NB[MAXBUF],flood[MAXBUF],MW[MAXBUF],MCON[MAXBUF];
+ char AH[MAXBUF],AP[MAXBUF],AF[MAXBUF],DNT[MAXBUF],pfreq[MAXBUF],thold[MAXBUF],sqmax[MAXBUF],rqmax[MAXBUF],SLIMT[MAXBUF];
+ ConnectClass c;
+ std::stringstream errstr;
+ include_stack.clear();
+
+ if (!LoadConf(CONFIG_FILE,&Config->config_f,&errstr))
+ {
+ errstr.seekg(0);
+ log(DEFAULT,"There were errors in your configuration:\n%s",errstr.str().c_str());
+ if (bail)
+ {
+ printf("There were errors in your configuration:\n%s",errstr.str().c_str());
+ Exit(0);
+ }
+ else
+ {
+ char dataline[1024];
+ if (user)
+ {
+ WriteServ(user->fd,"NOTICE %s :There were errors in the configuration file:",user->nick);
+ while (!errstr.eof())
+ {
+ errstr.getline(dataline,1024);
+ WriteServ(user->fd,"NOTICE %s :%s",user->nick,dataline);
+ }
+ }
+ else
+ {
+ WriteOpers("There were errors in the configuration file:");
+ while (!errstr.eof())
+ {
+ errstr.getline(dataline,1024);
+ WriteOpers(dataline);
+ }
+ }
+ return;
+ }
+ }
+
+ ConfValue("server","name",0,Config->ServerName,&Config->config_f);
+ ConfValue("server","description",0,Config->ServerDesc,&Config->config_f);
+ ConfValue("server","network",0,Config->Network,&Config->config_f);
+ ConfValue("admin","name",0,Config->AdminName,&Config->config_f);
+ ConfValue("admin","email",0,Config->AdminEmail,&Config->config_f);
+ ConfValue("admin","nick",0,Config->AdminNick,&Config->config_f);
+ ConfValue("files","motd",0,Config->motd,&Config->config_f);
+ ConfValue("files","rules",0,Config->rules,&Config->config_f);
+ ConfValue("power","diepass",0,Config->diepass,&Config->config_f);
+ ConfValue("power","pause",0,pauseval,&Config->config_f);
+ ConfValue("power","restartpass",0,Config->restartpass,&Config->config_f);
+ ConfValue("options","prefixquit",0,Config->PrefixQuit,&Config->config_f);
+ ConfValue("die","value",0,Config->DieValue,&Config->config_f);
+ ConfValue("options","loglevel",0,dbg,&Config->config_f);
+ ConfValue("options","netbuffersize",0,NB,&Config->config_f);
+ ConfValue("options","maxwho",0,MW,&Config->config_f);
+ ConfValue("options","allowhalfop",0,AH,&Config->config_f);
+ ConfValue("options","allowprotect",0,AP,&Config->config_f);
+ ConfValue("options","allowfounder",0,AF,&Config->config_f);
+ ConfValue("dns","server",0,Config->DNSServer,&Config->config_f);
+ ConfValue("dns","timeout",0,DNT,&Config->config_f);
+ ConfValue("options","moduledir",0,Config->ModPath,&Config->config_f);
+ ConfValue("disabled","commands",0,Config->DisabledCommands,&Config->config_f);
+ ConfValue("options","somaxconn",0,MCON,&Config->config_f);
+ ConfValue("options","softlimit",0,SLIMT,&Config->config_f);
+
+ Config->SoftLimit = atoi(SLIMT);
+ if ((Config->SoftLimit < 1) || (Config->SoftLimit > MAXCLIENTS))
+ {
+ log(DEFAULT,"WARNING: <options:softlimit> value is greater than %d or less than 0, set to %d.",MAXCLIENTS,MAXCLIENTS);
+ Config->SoftLimit = MAXCLIENTS;
+ }
+ Config->MaxConn = atoi(MCON);
+ if (Config->MaxConn > SOMAXCONN)
+ log(DEFAULT,"WARNING: <options:somaxconn> value may be higher than the system-defined SOMAXCONN value!");
+ Config->NetBufferSize = atoi(NB);
+ Config->MaxWhoResults = atoi(MW);
+ Config->dns_timeout = atoi(DNT);
+ if (!Config->dns_timeout)
+ Config->dns_timeout = 5;
+ if (!Config->MaxConn)
+ Config->MaxConn = SOMAXCONN;
+ if (!*Config->DNSServer)
+ strlcpy(Config->DNSServer,"127.0.0.1",MAXBUF);
+ if (!*Config->ModPath)
+ strlcpy(Config->ModPath,MOD_PATH,MAXBUF);
+ Config->AllowHalfop = ((!strcasecmp(AH,"true")) || (!strcasecmp(AH,"1")) || (!strcasecmp(AH,"yes")));
+ if ((!Config->NetBufferSize) || (Config->NetBufferSize > 65535) || (Config->NetBufferSize < 1024))
+ {
+ log(DEFAULT,"No NetBufferSize specified or size out of range, setting to default of 10240.");
+ Config->NetBufferSize = 10240;
+ }
+ if ((!Config->MaxWhoResults) || (Config->MaxWhoResults > 65535) || (Config->MaxWhoResults < 1))
+ {
+ log(DEFAULT,"No MaxWhoResults specified or size out of range, setting to default of 128.");
+ Config->MaxWhoResults = 128;
+ }
+ Config->LogLevel = DEFAULT;
+ if (!strcmp(dbg,"debug"))
+ {
+ Config->LogLevel = DEBUG;
+ Config->debugging = 1;
+ }
+ if (!strcmp(dbg,"verbose"))
+ Config->LogLevel = VERBOSE;
+ if (!strcmp(dbg,"default"))
+ Config->LogLevel = DEFAULT;
+ if (!strcmp(dbg,"sparse"))
+ Config->LogLevel = SPARSE;
+ if (!strcmp(dbg,"none"))
+ Config->LogLevel = NONE;
+
+ readfile(Config->MOTD,Config->motd);
+ log(DEFAULT,"Reading message of the day...");
+ readfile(Config->RULES,Config->rules);
+ log(DEFAULT,"Reading connect classes...");
+ Classes.clear();
+ for (int i = 0; i < ConfValueEnum("connect",&Config->config_f); i++)
+ {
+ strcpy(Value,"");
+ ConfValue("connect","allow",i,Value,&Config->config_f);
+ ConfValue("connect","timeout",i,timeout,&Config->config_f);
+ ConfValue("connect","flood",i,flood,&Config->config_f);
+ ConfValue("connect","pingfreq",i,pfreq,&Config->config_f);
+ ConfValue("connect","threshold",i,thold,&Config->config_f);
+ ConfValue("connect","sendq",i,sqmax,&Config->config_f);
+ ConfValue("connect","recvq",i,rqmax,&Config->config_f);
+ if (*Value)
+ {
+ strlcpy(c.host,Value,MAXBUF);
+ c.type = CC_ALLOW;
+ strlcpy(Value,"",MAXBUF);
+ ConfValue("connect","password",i,Value,&Config->config_f);
+ strlcpy(c.pass,Value,MAXBUF);
+ c.registration_timeout = 90; // default is 2 minutes
+ c.pingtime = 120;
+ c.flood = atoi(flood);
+ c.threshold = 5;
+ c.sendqmax = 262144; // 256k
+ c.recvqmax = 4096; // 4k
+ if (atoi(thold)>0)
+ {
+ c.threshold = atoi(thold);
+ }
+ if (atoi(sqmax)>0)
+ {
+ c.sendqmax = atoi(sqmax);
+ }
+ if (atoi(rqmax)>0)
+ {
+ c.recvqmax = atoi(rqmax);
+ }
+ if (atoi(timeout)>0)
+ {
+ c.registration_timeout = atoi(timeout);
+ }
+ if (atoi(pfreq)>0)
+ {
+ c.pingtime = atoi(pfreq);
+ }
+ Classes.push_back(c);
+ }
+ else
+ {
+ ConfValue("connect","deny",i,Value,&Config->config_f);
+ strlcpy(c.host,Value,MAXBUF);
+ c.type = CC_DENY;
+ Classes.push_back(c);
+ log(DEBUG,"Read connect class type DENY, host=%s",c.host);
+ }
+
+ }
+ log(DEFAULT,"Reading K lines,Q lines and Z lines from config...");
+ read_xline_defaults();
+ log(DEFAULT,"Applying K lines, Q lines and Z lines...");
+ apply_lines(APPLY_ALL);
+
+ ConfValue("pid","file",0,Config->PID,&Config->config_f);
+ // write once here, to try it out and make sure its ok
+ WritePID(Config->PID);
+
+ log(DEFAULT,"Done reading configuration file, InspIRCd is now starting.");
+ if (!bail)
+ {
+ log(DEFAULT,"Adding and removing modules due to rehash...");
+
+ std::vector<std::string> old_module_names, new_module_names, added_modules, removed_modules;
+
+ // store the old module names
+ for (std::vector<std::string>::iterator t = module_names.begin(); t != module_names.end(); t++)
+ {
+ old_module_names.push_back(*t);
+ }
+
+ // get the new module names
+ for (int count2 = 0; count2 < ConfValueEnum("module",&Config->config_f); count2++)
+ {
+ ConfValue("module","name",count2,Value,&Config->config_f);
+ new_module_names.push_back(Value);
+ }
+
+ // now create a list of new modules that are due to be loaded
+ // and a seperate list of modules which are due to be unloaded
+ for (std::vector<std::string>::iterator _new = new_module_names.begin(); _new != new_module_names.end(); _new++)
+ {
+ bool added = true;
+ for (std::vector<std::string>::iterator old = old_module_names.begin(); old != old_module_names.end(); old++)
+ {
+ if (*old == *_new)
+ added = false;
+ }
+ if (added)
+ added_modules.push_back(*_new);
+ }
+ for (std::vector<std::string>::iterator oldm = old_module_names.begin(); oldm != old_module_names.end(); oldm++)
+ {
+ bool removed = true;
+ for (std::vector<std::string>::iterator newm = new_module_names.begin(); newm != new_module_names.end(); newm++)
+ {
+ if (*newm == *oldm)
+ removed = false;
+ }
+ if (removed)
+ removed_modules.push_back(*oldm);
+ }
+ // now we have added_modules, a vector of modules to be loaded, and removed_modules, a vector of modules
+ // to be removed.
+ int rem = 0, add = 0;
+ if (!removed_modules.empty())
+ for (std::vector<std::string>::iterator removing = removed_modules.begin(); removing != removed_modules.end(); removing++)
+ {
+ if (UnloadModule(removing->c_str()))
+ {
+ WriteOpers("*** REHASH UNLOADED MODULE: %s",removing->c_str());
+ WriteServ(user->fd,"973 %s %s :Module %s successfully unloaded.",user->nick, removing->c_str(), removing->c_str());
+ rem++;
+ }
+ else
+ {
+ WriteServ(user->fd,"972 %s %s :Failed to unload module %s: %s",user->nick, removing->c_str(), removing->c_str(), ModuleError());
+ }
+ }
+ if (!added_modules.empty())
+ for (std::vector<std::string>::iterator adding = added_modules.begin(); adding != added_modules.end(); adding++)
+ {
+ if (LoadModule(adding->c_str()))
+ {
+ WriteOpers("*** REHASH LOADED MODULE: %s",adding->c_str());
+ WriteServ(user->fd,"975 %s %s :Module %s successfully loaded.",user->nick, adding->c_str(), adding->c_str());
+ add++;
+ }
+ else
+ {
+ WriteServ(user->fd,"974 %s %s :Failed to load module %s: %s",user->nick, adding->c_str(), adding->c_str(), ModuleError());
+ }
+ }
+ log(DEFAULT,"Successfully unloaded %lu of %lu modules and loaded %lu of %lu modules.",(unsigned long)rem,(unsigned long)removed_modules.size(),
+ (unsigned long)add,(unsigned long)added_modules.size());
+ }
+}
+
+
void WriteOpers(char* text, ...);
void Exit (int status)
@@ -58,7 +343,7 @@ void Killed(int status)
void Rehash(int status)
{
WriteOpers("Rehashing config file %s due to SIGHUP",CONFIG_FILE);
- ReadConfig(false,NULL);
+ Config->Read(false,NULL);
}
diff --git a/src/modules.cpp b/src/modules.cpp
index 96e9bdea5..62e84f218 100644
--- a/src/modules.cpp
+++ b/src/modules.cpp
@@ -331,7 +331,7 @@ void Server::AddSocket(InspSocket* sock)
void Server::RehashServer()
{
WriteOpers("*** Rehashing config file");
- ReadConfig(false,NULL);
+ Config->Read(false,NULL);
}
void Server::DelSocket(InspSocket* sock)