* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
- * InspIRCd: (C) 2002-2007 InspIRCd Development Team
+ * InspIRCd: (C) 2002-2008 InspIRCd Development Team
* See: http://www.inspircd.org/wiki/index.php/Credits
*
* This program is free but copyrighted software; see
std::string nameserver;
// attempt to look up their nameserver from /etc/resolv.conf
conf->GetInstance()->Log(DEFAULT,"WARNING: <dns:server> not defined, attempting to find working server in /etc/resolv.conf...");
- ifstream resolv("/etc/resolv.conf");
+ std::ifstream resolv("/etc/resolv.conf");
bool found_server = false;
if (resolv.is_open())
bool ValidateSID(ServerConfig* conf, const char*, const char*, ValueItem &data)
{
-// std::string sid = data.GetString();
+ const char *sid = data.GetString();
+
+ if (*sid && !conf->GetInstance()->IsSID(sid))
+ {
+ throw CoreException(std::string(sid) + " is not a valid server ID. A server ID must be 3 characters long, with the first character a digit and the next two characters a digit or letter.");
+ }
+
return true;
}
conf->GetInstance()->Log(DEBUG, "Address of class is %p", c);
}
- for (ClassVector::iterator i = conf->Classes.begin(); i != conf->Classes.end(); i++)
+ for (ClassVector::iterator i = conf->Classes.begin(); i != conf->Classes.end() ; )
{
- ConnectClass *c = *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!");
+
+ /* This was causing a crash, because we'd set i to .begin() just here, but then the for loop's increment would
+ * set it to .begin() + 1. Which if it was already the last thing in the list, wasn't good.
+ * Now the increment is in the else { } below.
+ */
conf->Classes.erase(i);
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);
+ else
+ {
+ /* also mark all existing classes disabled, if they still exist in the conf, they will be reenabled. */
+ c->SetDisabled(true);
+ i++;
+ }
}
return true;
const char* parent = values[13].GetString();
int maxchans = values[14].GetInteger();
unsigned long limit = values[15].GetInteger();
+ const char* hashtype = values[16].GetString();
/*
* duplicates check: Now we don't delete all connect classes on rehash, we need to ensure we don't add dupes.
{
if (*allow)
{
- ConnectClass* c = new ConnectClass(name, timeout, flood, allow, pingfreq, password, threshold, sendq, recvq, localmax, globalmax, maxchans);
+ ConnectClass* c = new ConnectClass(name, timeout, flood, allow, pingfreq, password, hashtype, threshold, sendq, recvq, localmax, globalmax, maxchans);
c->limit = limit;
c->SetPort(port);
conf->Classes.push_back(c);
}
else
{
- ServerInstance->WriteOpers("There were errors in the configuration file:");
+ ServerInstance->SNO->WriteToSnoMask('A', "There were errors in the configuration file:");
while (start < errors.length())
{
- ServerInstance->WriteOpers(errors.substr(start, 360).c_str());
+ ServerInstance->SNO->WriteToSnoMask('A', errors.substr(start, 360).c_str());
start += 360;
}
}
{"files", "rules", "", new ValueContainerChar (this->rules), DT_CHARPTR, ValidateRules},
{"power", "diepass", "", new ValueContainerChar (this->diepass), DT_CHARPTR, ValidateNotEmpty},
{"power", "pause", "", new ValueContainerInt (&this->DieDelay), DT_INTEGER, NoValidation},
+ {"power", "hash", "", new ValueContainerChar (this->powerhash), DT_CHARPTR, NoValidation},
{"power", "restartpass", "", new ValueContainerChar (this->restartpass), DT_CHARPTR, ValidateNotEmpty},
{"options", "prefixquit", "", new ValueContainerChar (this->PrefixQuit), DT_CHARPTR, NoValidation},
{"options", "suffixquit", "", new ValueContainerChar (this->SuffixQuit), DT_CHARPTR, NoValidation},
{"options", "fixedquit", "", new ValueContainerChar (this->FixedQuit), DT_CHARPTR, NoValidation},
+ {"options", "prefixpart", "", new ValueContainerChar (this->PrefixPart), DT_CHARPTR, NoValidation},
+ {"options", "suffixpart", "", new ValueContainerChar (this->SuffixPart), DT_CHARPTR, NoValidation},
+ {"options", "fixedpart", "", new ValueContainerChar (this->FixedPart), DT_CHARPTR, NoValidation},
{"options", "loglevel", "default", new ValueContainerChar (debug), DT_CHARPTR, ValidateLogLevel},
{"options", "netbuffersize","10240", new ValueContainerInt (&this->NetBufferSize), DT_INTEGER, ValidateNetBufferSize},
{"options", "maxwho", "128", new ValueContainerInt (&this->MaxWhoResults), DT_INTEGER, ValidateMaxWho},
{"connect",
{"allow", "deny", "password", "timeout", "pingfreq", "flood",
"threshold", "sendq", "recvq", "localmax", "globalmax", "port",
- "name", "parent", "maxchans", "limit",
+ "name", "parent", "maxchans", "limit", "hash",
NULL},
{"", "", "", "", "120", "",
"", "", "", "3", "3", "0",
- "", "", "0", "0",
+ "", "", "0", "0", "",
NULL},
{DT_IPADDRESS|DT_ALLOW_WILD,
DT_IPADDRESS|DT_ALLOW_WILD,
DT_CHARPTR, DT_INTEGER, DT_INTEGER, DT_INTEGER,
DT_INTEGER, DT_INTEGER, DT_INTEGER, DT_INTEGER, DT_INTEGER, DT_INTEGER,
- DT_NOSPACES, DT_NOSPACES, DT_INTEGER, DT_INTEGER},
+ DT_NOSPACES, DT_NOSPACES, DT_INTEGER, DT_INTEGER, DT_CHARPTR},
InitConnect, DoConnect, DoneConnect},
{"uline",
if (pass == 0)
{
- if (isatty(0) && isatty(1) && isatty(2))
- printf("Downloading configuration ");
+ ServerInstance->Log(DEBUG, "Downloading configuration");
TotalDownloaded = 0;
FileErrors = 0;
{
if (ServerInstance->Modules->Unload(removing->c_str()))
{
- ServerInstance->WriteOpers("*** REHASH UNLOADED MODULE: %s",removing->c_str());
+ ServerInstance->SNO->WriteToSnoMask('A', "REHASH UNLOADED MODULE: %s",removing->c_str());
if (user)
user->WriteServ("973 %s %s :Module %s successfully unloaded.",user->nick, removing->c_str(), removing->c_str());
rem++;
if (ServerInstance->Modules->Load(adding->c_str()))
{
- ServerInstance->WriteOpers("*** REHASH LOADED MODULE: %s",adding->c_str());
+ ServerInstance->SNO->WriteToSnoMask('A', "REHASH LOADED MODULE: %s",adding->c_str());
if (user)
user->WriteServ("975 %s %s :Module %s successfully loaded.",user->nick, adding->c_str(), adding->c_str());
if (user)
user->WriteServ("NOTICE %s :*** Successfully rehashed server.", user->nick);
else
- ServerInstance->WriteOpers("*** Successfully rehashed server.");
+ ServerInstance->SNO->WriteToSnoMask('A', "Successfully rehashed server.");
}
/* XXX: This can and will block! */
// this should probably be moved to configreader, but atm it relies on CheckELines above.
bool DoneELine(ServerConfig* conf, const char* tag)
{
- for (std::vector<User*>::const_iterator u2 = conf->GetInstance()->local_users.begin(); u2 != conf->GetInstance()->local_users.end(); u2++)
+ for (std::vector<User*>::const_iterator u2 = conf->GetInstance()->Users->local_users.begin(); u2 != conf->GetInstance()->Users->local_users.end(); u2++)
{
User* u = (User*)(*u2);
u->exempt = false;
conf->GetInstance()->XLines->CheckELines();
return true;
}
-