X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fconfigreader.cpp;h=e184353160270898964ac22f8b3409820ae36865;hb=cf83031f7bf1c037bf726df84f93686b9631531b;hp=2ee6ace26e81bb942791186fc82fd7f5fe0f5a40;hpb=e7c95d470d08ed4da36e1bdc863903246c2d9683;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/configreader.cpp b/src/configreader.cpp index 2ee6ace26..e18435316 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -125,7 +125,7 @@ void ServerConfig::Update005() void ServerConfig::Send005(User* user) { for (std::vector::iterator line = ServerInstance->Config->isupport.begin(); line != ServerInstance->Config->isupport.end(); line++) - user->WriteNumeric(005, "%s %s", user->nick, line->c_str()); + user->WriteNumeric(005, "%s %s", user->nick.c_str(), line->c_str()); } bool ServerConfig::CheckOnce(const char* tag, ConfigDataHash &newconf) @@ -524,7 +524,12 @@ bool DoConnect(ServerConfig* conf, const char*, char**, ValueList &values, int*) for (ClassVector::iterator item = conf->Classes.begin(); item != conf->Classes.end(); ++item) { ConnectClass* cc = *item; - if ((*name && (cc->GetName() == name)) || (*allow && (cc->GetHost() == allow)) || (*deny && (cc->GetHost() == deny))) + if ( + ((*name && (cc->GetName() == name)) || // if the name is the same + (*allow && (cc->GetHost() == allow)) || // or the allow is the same + (*deny && (cc->GetHost() == deny))) && // or the deny is the same + (!port || port && (cc->GetPort() == port)) // and there is no port, or there is a port and the port is the same + ) { /* reenable class so users can be shoved into it :P */ cc->SetDisabled(false); @@ -726,11 +731,11 @@ void ServerConfig::ReportConfigError(const std::string &errormessage, bool bail, /* ":ServerInstance->Config->ServerName NOTICE user->nick :" */ if (user) { - prefixlen = strlen(this->ServerName) + strlen(user->nick) + 11; - user->WriteServ("NOTICE %s :There were errors in the configuration file:",user->nick); + prefixlen = strlen(this->ServerName) + user->nick.length() + 11; + user->WriteServ("NOTICE %s :There were errors in the configuration file:",user->nick.c_str()); while (start < errors.length()) { - user->WriteServ("NOTICE %s :%s",user->nick, errors.substr(start, 510 - prefixlen).c_str()); + user->WriteServ("NOTICE %s :%s",user->nick.c_str(), errors.substr(start, 510 - prefixlen).c_str()); start += 510 - prefixlen; } } @@ -956,7 +961,7 @@ void ServerConfig::Read(bool bail, User* user) /* Read the values of all the tags which occur once or not at all, and call their callbacks. */ - for (int Index = 0; Values[Index].tag; Index++) + for (int Index = 0; Values[Index].tag; ++Index) { char item[MAXBUF]; int dt = Values[Index].datatype; @@ -992,7 +997,6 @@ void ServerConfig::Read(bool bail, User* user) ValueContainerChar* vcc = (ValueContainerChar*)Values[Index].val; this->ValidateHostname(vi.GetString(), Values[Index].tag, Values[Index].value); vcc->Set(vi.GetString(), strlen(vi.GetString()) + 1); - ServerInstance->Logs->Log("CONFIG",DEFAULT,"Got %s", vi.GetString()); } break; case DT_IPADDRESS: @@ -1047,7 +1051,7 @@ void ServerConfig::Read(bool bail, User* user) * and call the callbacks associated with them. We have three * callbacks for these, a 'start', 'item' and 'end' callback. */ - for (int Index = 0; MultiValues[Index].tag; Index++) + for (int Index = 0; MultiValues[Index].tag; ++Index) { ServerInstance->Threads->Mutex(true); MultiValues[Index].init_function(this, MultiValues[Index].tag); @@ -1055,10 +1059,10 @@ void ServerConfig::Read(bool bail, User* user) int number_of_tags = ConfValueEnum(newconfig, MultiValues[Index].tag); - for (int tagnum = 0; tagnum < number_of_tags; tagnum++) + for (int tagnum = 0; tagnum < number_of_tags; ++tagnum) { ValueList vl; - for (int valuenum = 0; MultiValues[Index].items[valuenum]; valuenum++) + for (int valuenum = 0; (MultiValues[Index].items[valuenum]) && (valuenum < MAX_VALUES_PER_TAG); ++valuenum) { int dt = MultiValues[Index].datatype[valuenum]; bool allow_newlines = ((dt & DT_ALLOW_NEWLINE) > 0); @@ -1187,7 +1191,7 @@ void ServerConfig::Read(bool bail, User* user) if (!foundclass) { if (user) - user->WriteServ("NOTICE %s :*** Warning: Oper type '%s' has a missing class named '%s', this does nothing!", user->nick, item, classname.c_str()); + user->WriteServ("NOTICE %s :*** Warning: Oper type '%s' has a missing class named '%s', this does nothing!", user->nick.c_str(), item, classname.c_str()); else { if (bail) @@ -1224,12 +1228,12 @@ void ServerConfig::Read(bool bail, User* user) if (pl.size() && user) { ServerInstance->Threads->Mutex(true); - user->WriteServ("NOTICE %s :*** Not all your client ports could be bound.", user->nick); - user->WriteServ("NOTICE %s :*** The following port(s) failed to bind:", user->nick); + user->WriteServ("NOTICE %s :*** Not all your client ports could be bound.", user->nick.c_str()); + user->WriteServ("NOTICE %s :*** The following port(s) failed to bind:", user->nick.c_str()); int j = 1; for (FailedPortList::iterator i = pl.begin(); i != pl.end(); i++, j++) { - user->WriteServ("NOTICE %s :*** %d. IP: %s Port: %lu", user->nick, j, i->first.empty() ? "" : i->first.c_str(), (unsigned long)i->second); + user->WriteServ("NOTICE %s :*** %d. IP: %s Port: %lu", user->nick.c_str(), j, i->first.empty() ? "" : i->first.c_str(), (unsigned long)i->second); } ServerInstance->Threads->Mutex(false); } @@ -1244,14 +1248,14 @@ void ServerConfig::Read(bool bail, User* user) ServerInstance->SNO->WriteToSnoMask('A', "*** REHASH UNLOADED MODULE: %s",removing->c_str()); if (user) - user->WriteNumeric(973, "%s %s :Module %s successfully unloaded.",user->nick, removing->c_str(), removing->c_str()); + user->WriteNumeric(973, "%s %s :Module %s successfully unloaded.",user->nick.c_str(), removing->c_str(), removing->c_str()); rem++; } else { if (user) - user->WriteNumeric(972, "%s %s :Failed to unload module %s: %s",user->nick, removing->c_str(), removing->c_str(), ServerInstance->Modules->LastError().c_str()); + user->WriteNumeric(972, "%s %s :Failed to unload module %s: %s",user->nick.c_str(), removing->c_str(), removing->c_str(), ServerInstance->Modules->LastError().c_str()); } } } @@ -1265,14 +1269,14 @@ void ServerConfig::Read(bool bail, User* user) ServerInstance->SNO->WriteToSnoMask('A', "*** REHASH LOADED MODULE: %s",adding->c_str()); if (user) - user->WriteNumeric(975, "%s %s :Module %s successfully loaded.",user->nick, adding->c_str(), adding->c_str()); + user->WriteNumeric(975, "%s %s :Module %s successfully loaded.",user->nick.c_str(), adding->c_str(), adding->c_str()); add++; } else { if (user) - user->WriteNumeric(974, "%s %s :Failed to load module %s: %s",user->nick, adding->c_str(), adding->c_str(), ServerInstance->Modules->LastError().c_str()); + user->WriteNumeric(974, "%s %s :Failed to load module %s: %s",user->nick.c_str(), adding->c_str(), adding->c_str(), ServerInstance->Modules->LastError().c_str()); } } } @@ -1289,7 +1293,7 @@ void ServerConfig::Read(bool bail, User* user) ServerInstance->Threads->Mutex(false); if (user) - user->WriteServ("NOTICE %s :*** Successfully rehashed server.", user->nick); + user->WriteServ("NOTICE %s :*** Successfully rehashed server.", user->nick.c_str()); else ServerInstance->SNO->WriteToSnoMask('A', "*** Successfully rehashed server."); @@ -1649,6 +1653,11 @@ bool ServerConfig::DoPipe(ConfigDataHash &target, const std::string &file, std:: return ret; } +bool ServerConfig::StartsWithWindowsDriveLetter(const std::string &path) +{ + return (path.length() > 2 && isalpha(path[0]) && path[1] == ':'); +} + bool ServerConfig::DoInclude(ConfigDataHash &target, const std::string &file, std::ostringstream &errorstream) { std::string confpath; @@ -1661,7 +1670,7 @@ bool ServerConfig::DoInclude(ConfigDataHash &target, const std::string &file, st std::replace(newfile.begin(),newfile.end(),'\\','/'); std::replace(confpath.begin(),confpath.end(),'\\','/'); - if ((newfile[0] != '/') && (newfile.find("://") == std::string::npos)) + if ((newfile[0] != '/') && (!StartsWithWindowsDriveLetter(newfile))) { if((pos = confpath.rfind("/")) != std::string::npos) { @@ -1883,17 +1892,19 @@ bool ServerConfig::ReadFile(file_cache &F, const char* fname) F.clear(); - if ((*fname != '/') && (*fname != '\\')) + if ((*fname != '/') && (*fname != '\\') && (!StartsWithWindowsDriveLetter(fname))) { std::string::size_type pos; std::string confpath = ServerInstance->ConfigFileName; std::string newfile = fname; - if ((pos = confpath.rfind("/")) != std::string::npos) + if (((pos = confpath.rfind("/"))) != std::string::npos) newfile = confpath.substr(0, pos) + std::string("/") + fname; - else if ((pos = confpath.rfind("\\")) != std::string::npos) + else if (((pos = confpath.rfind("\\"))) != std::string::npos) newfile = confpath.substr(0, pos) + std::string("\\") + fname; + ServerInstance->Logs->Log("config", DEBUG, "Filename: %s", newfile.c_str()); + if (!FileExists(newfile.c_str())) return false; file = fopen(newfile.c_str(), "r"); @@ -1914,10 +1925,7 @@ bool ServerConfig::ReadFile(file_cache &F, const char* fname) else *linebuf = 0; - if (!feof(file)) - { - F.push_back(*linebuf ? linebuf : " "); - } + F.push_back(*linebuf ? linebuf : " "); } fclose(file);