*/
/* $Core: libIRCDconfigreader */
+/* $CopyInstall: conf/inspircd.quotes.example $(CONPATH) */
+/* $CopyInstall: conf/inspircd.rules.example $(CONPATH) */
+/* $CopyInstall: conf/inspircd.motd.example $(CONPATH) */
+/* $CopyInstall: conf/inspircd.helpop-full.example $(CONPATH) */
+/* $CopyInstall: conf/inspircd.helpop.example $(CONPATH) */
+/* $CopyInstall: conf/inspircd.censor.example $(CONPATH) */
+/* $CopyInstall: conf/inspircd.filter.example $(CONPATH) */
+/* $CopyInstall: docs/inspircd.conf.example $(CONPATH) */
#include "inspircd.h"
#include <fstream>
{
conf->GetInstance()->Log(DEFAULT,"Reading connect classes...");
-goagain:
- /* change this: only delete a class with refcount 0 */
for (ClassVector::iterator i = conf->Classes.begin(); i != conf->Classes.end(); i++)
{
ConnectClass *c = *i;
+ conf->GetInstance()->Log(DEBUG, "Address of class is %p", c);
+ }
+
+ for (ClassVector::iterator i = conf->Classes.begin(); i != conf->Classes.end(); i++)
+ {
+ ConnectClass *c = *i;
+
+ /* only delete a class with refcount 0 */
if (c->RefCount == 0)
{
conf->GetInstance()->Log(DEFAULT, "Removing connect class, refcount is 0!");
conf->Classes.erase(i);
- goto goagain; // XXX fucking hell.. how better to do this
+ i = conf->Classes.begin(); // start over so we don't trample on a bad iterator
}
+
+ /* also mark all existing classes disabled, if they still exist in the conf, they will be reenabled. */
+ c->SetDisabled(true);
}
return true;
*/
bool DoConnect(ServerConfig* conf, const char*, char**, ValueList &values, int*)
{
- conf->GetInstance()->Log(DEFAULT,"Adding a connect class!");
ConnectClass c;
const char* allow = values[0].GetString(); /* Yeah, there are a lot of values. Live with it. */
const char* deny = values[1].GetString();
const char* name = values[12].GetString();
const char* parent = values[13].GetString();
int maxchans = values[14].GetInteger();
+ unsigned long limit = values[15].GetInteger();
+
+ /*
+ * duplicates check: Now we don't delete all connect classes on rehash, we need to ensure we don't add dupes.
+ * easier said than done, but for now we'll just disallow anything with a duplicate host or name. -- w00t
+ */
+ for (ClassVector::iterator item = conf->Classes.begin(); item != conf->Classes.end(); ++item)
+ {
+ ConnectClass* c = *item;
+ if ((*name && (c->GetName() == name)) || (*allow && (c->GetHost() == allow)) || (*deny && (c->GetHost() == deny)))
+ {
+ /* reenable class so users can be shoved into it :P */
+ c->SetDisabled(false);
+ conf->GetInstance()->Log(DEFAULT, "Not adding class, it already exists!");
+ return true;
+ }
+ }
+
+ conf->GetInstance()->Log(DEFAULT,"Adding a connect class!");
if (*parent)
{
/* Find 'parent' and inherit a new class from it,
* then overwrite any values that are set here
*/
- for (ClassVector::iterator item = conf->Classes.begin(); item != conf->Classes.end(); ++item)
+ ClassVector::iterator item = conf->Classes.begin();
+ for (; item != conf->Classes.end(); ++item)
{
ConnectClass* c = *item;
+ conf->GetInstance()->Log(DEBUG,"Class: %s", c->GetName().c_str());
if (c->GetName() == parent)
{
- ConnectClass* c = new ConnectClass(name, c);
- c->Update(timeout, flood, *allow ? allow : deny, pingfreq, password, threshold, sendq, recvq, localmax, globalmax, maxchans, port);
- conf->Classes.push_back(c);
+ ConnectClass* newclass = new ConnectClass(name, c);
+ newclass->Update(timeout, flood, *allow ? allow : deny, pingfreq, password, threshold, sendq, recvq, localmax, globalmax, maxchans, port, limit);
+ conf->Classes.push_back(newclass);
+ break;
}
}
- throw CoreException("Class name '" + std::string(name) + "' is configured to inherit from class '" + std::string(parent) + "' which cannot be found.");
+ if (item == conf->Classes.end())
+ throw CoreException("Class name '" + std::string(name) + "' is configured to inherit from class '" + std::string(parent) + "' which cannot be found.");
}
else
{
if (*allow)
{
ConnectClass* c = new ConnectClass(name, timeout, flood, allow, pingfreq, password, threshold, sendq, recvq, localmax, globalmax, maxchans);
+ c->limit = limit;
c->SetPort(port);
conf->Classes.push_back(c);
}
{"connect",
{"allow", "deny", "password", "timeout", "pingfreq", "flood",
"threshold", "sendq", "recvq", "localmax", "globalmax", "port",
- "name", "parent", "maxchans",
+ "name", "parent", "maxchans", "limit",
NULL},
{"", "", "", "", "120", "",
"", "", "", "3", "3", "0",
- "", "", "0",
+ "", "", "0", "0",
NULL},
{DT_CHARPTR, DT_CHARPTR, DT_CHARPTR, DT_INTEGER, DT_INTEGER, DT_INTEGER,
DT_INTEGER, DT_INTEGER, DT_INTEGER, DT_INTEGER, DT_INTEGER, DT_INTEGER,
- DT_CHARPTR, DT_CHARPTR, DT_INTEGER},
+ DT_CHARPTR, DT_CHARPTR, DT_INTEGER, DT_INTEGER},
InitConnect, DoConnect, DoneConnect},
{"uline",
confpath = ServerInstance->ConfigFileName;
newfile = file;
- for (std::string::iterator c = newfile.begin(); c != newfile.end(); c++)
- {
- if (*c == '\\')
- {
- *c = '/';
- }
- }
+ std::replace(newfile.begin(),newfile.end(),'\\','/');
+ std::replace(confpath.begin(),confpath.end(),'\\','/');
- if (file[0] != '/')
+ if (newfile[0] != '/')
{
if((pos = confpath.rfind("/")) != std::string::npos)
{
}
else
{
- errorstream << "Couldn't get config path from: " << confpath << std::endl;
+ errorstream << "Couldn't get config path from: " << ServerInstance->ConfigFileName << std::endl;
return false;
}
}