X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fconfigreader.cpp;h=51045ef5859a8dba15f215e3666849a43f7e9b64;hb=48045988a48a738a1ffa183fdc1e335a431312a8;hp=aea422a3578c5e94f84c6d51e975d14975f56e57;hpb=3b4c56a69e10223434c6502e60139355b49fbd5e;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/configreader.cpp b/src/configreader.cpp index aea422a35..51045ef58 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -2,8 +2,8 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd: (C) 2002-2008 InspIRCd Development Team - * See: http://www.inspircd.org/wiki/index.php/Credits + * InspIRCd: (C) 2002-2009 InspIRCd Development Team + * See: http://wiki.inspircd.org/Credits * * This program is free but copyrighted software; see * the file COPYING for details. @@ -23,12 +23,14 @@ /* $CopyInstall: conf/modules.conf.example $(CONPATH) */ /* $CopyInstall: conf/opers.conf.example $(CONPATH) */ /* $CopyInstall: conf/links.conf.example $(CONPATH) */ +/* $CopyInstall: .gdbargs $(BASE) */ #include "inspircd.h" #include #include "xline.h" #include "exitcodes.h" #include "commands/cmd_whowas.h" +#include "modes/cmode_h.h" std::vector old_module_names, new_module_names, added_modules, removed_modules; @@ -358,6 +360,24 @@ bool ValidateMaxWho(ServerConfig* conf, const char*, const char*, ValueItem &dat return true; } +bool ValidateHalfOp(ServerConfig* conf, const char*, const char*, ValueItem &data) +{ + ModeHandler* mh = conf->GetInstance()->Modes->FindMode('h', MODETYPE_CHANNEL); + if (data.GetBool() && !mh) + { + conf->GetInstance()->Logs->Log("CONFIG",DEFAULT,"Enabling halfop mode."); + mh = new ModeChannelHalfOp(conf->GetInstance()); + conf->GetInstance()->Modes->AddMode(mh); + } + else if (!data.GetBool() && mh) + { + conf->GetInstance()->Logs->Log("CONFIG",DEFAULT,"Disabling halfop mode."); + conf->GetInstance()->Modes->DelMode(mh); + delete mh; + } + return true; +} + bool ValidateMotd(ServerConfig* conf, const char*, const char*, ValueItem &data) { conf->ReadFile(conf->MOTD, data.GetString()); @@ -457,15 +477,33 @@ bool InitConnect(ServerConfig* conf, const char*) { conf->GetInstance()->Logs->Log("CONFIG",DEFAULT,"Reading connect classes... class list is:"); - /* - * Remove all connect classes.. we'll reset the pointers in user classes - * once all new classes have been read from config. - */ - while (conf->Classes.begin() != conf->Classes.end()) + for (ClassVector::iterator i = conf->Classes.begin(); i != conf->Classes.end() ; ) { - ConnectClass *c = *(conf->Classes.begin()); - conf->Classes.erase(conf->Classes.begin()); - delete c; + ConnectClass* c = *i; + + /* + * only delete a class with refcount 0. + * this is needed to avoid trampling on a wild pointer (User::MyClass)! + * it's also the most simple way to do it, given that we're looking at threads.. + * -- w00t + */ + if (c->RefCount == 0) + { + conf->GetInstance()->Logs->Log("CONFIG",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 + } + else + { + /* also mark all existing classes disabled, if they still exist in the conf, they will be reenabled. */ + c->SetDisabled(true); + i++; + } } return true; @@ -481,18 +519,16 @@ bool DoConnect(ServerConfig* conf, const char*, char**, ValueList &values, int*) const char* password = values[2].GetString(); int timeout = values[3].GetInteger(); int pingfreq = values[4].GetInteger(); - int flood = values[5].GetInteger(); - int threshold = values[6].GetInteger(); - int sendq = values[7].GetInteger(); - int recvq = values[8].GetInteger(); - int localmax = values[9].GetInteger(); - int globalmax = values[10].GetInteger(); - int port = values[11].GetInteger(); - const char* name = values[12].GetString(); - const char* parent = values[13].GetString(); - int maxchans = values[14].GetInteger(); - unsigned long limit = values[15].GetInteger(); - const char* hashtype = values[16].GetString(); + int sendq = values[5].GetInteger(); + int recvq = values[6].GetInteger(); + int localmax = values[7].GetInteger(); + int globalmax = values[8].GetInteger(); + int port = values[9].GetInteger(); + const char* name = values[10].GetString(); + const char* parent = values[11].GetString(); + int maxchans = values[12].GetInteger(); + unsigned long limit = values[13].GetInteger(); + const char* hashtype = values[14].GetString(); conf->GetInstance()->Logs->Log("CONFIG",DEFAULT,"Adding a connect class!"); @@ -511,7 +547,7 @@ bool DoConnect(ServerConfig* conf, const char*, char**, ValueList &values, int*) if (cc->GetName() == parent) { cc = new ConnectClass(name, cc); - cc->Update(timeout, flood, *allow ? allow : deny, pingfreq, password, threshold, sendq, recvq, localmax, globalmax, maxchans, port, limit); + cc->Update(timeout, *allow ? allow : deny, pingfreq, password, sendq, recvq, localmax, globalmax, maxchans, port, limit); conf->Classes.push_back(cc); break; } @@ -526,13 +562,13 @@ bool DoConnect(ServerConfig* conf, const char*, char**, ValueList &values, int*) /* Find existing class by mask, the mask should be unique */ for (ClassVector::iterator item = conf->Classes.begin(); item != conf->Classes.end(); ++item) { - if ((*item)->GetHost() == allow) + if ((*item)->GetHost() == allow && !(*item)->GetDisabled()) { - (*item)->Update(timeout, flood, allow, pingfreq, password, threshold, sendq, recvq, localmax, globalmax, maxchans, port, limit); + (*item)->Update(timeout, allow, pingfreq, password, sendq, recvq, localmax, globalmax, maxchans, port, limit); return true; } } - cc = new ConnectClass(name, timeout, flood, allow, pingfreq, password, hashtype, threshold, sendq, recvq, localmax, globalmax, maxchans); + cc = new ConnectClass(name, timeout, allow, pingfreq, password, hashtype, sendq, recvq, localmax, globalmax, maxchans); cc->limit = limit; cc->SetPort(port); conf->Classes.push_back(cc); @@ -542,7 +578,7 @@ bool DoConnect(ServerConfig* conf, const char*, char**, ValueList &values, int*) /* Find existing class by mask, the mask should be unique */ for (ClassVector::iterator item = conf->Classes.begin(); item != conf->Classes.end(); ++item) { - if ((*item)->GetHost() == deny) + if ((*item)->GetHost() == deny && !(*item)->GetDisabled()) { (*item)->Update(name, deny); (*item)->SetPort(port); @@ -562,29 +598,6 @@ bool DoConnect(ServerConfig* conf, const char*, char**, ValueList &values, int*) */ bool DoneConnect(ServerConfig *conf, const char*) { - /* - * Update connect classes on all users. - */ - conf->GetInstance()->Logs->Log("CONFIG",DEFAULT, "Resetting connect classes for users..."); - for (std::vector::iterator n = conf->GetInstance()->Users->local_users.begin(); n != conf->GetInstance()->Users->local_users.end(); n++) - { - User *u = *n; - - /* - * Make their existing class go away so that SetClass doesn't touch a wild ptr, important! - */ - u->MyClass = NULL; - - u->SetClass(); - - /* - * Check that the user falls into a valid class block.. if they don't, - * they need to be quit, which CheckClass will do. -- w00t - */ - u->CheckClass(); - } - - conf->GetInstance()->Logs->Log("CONFIG",DEFAULT, "Done adding connect classes!"); return true; } @@ -726,10 +739,10 @@ void ServerConfig::ReportConfigError(const std::string &errormessage, bool bail, } else { - ServerInstance->SNO->WriteToSnoMask('A', "There were errors in the configuration file:"); + ServerInstance->SNO->WriteToSnoMask('a', "There were errors in the configuration file:"); while (start < errors.length()) { - ServerInstance->SNO->WriteToSnoMask('A', errors.substr(start, 360)); + ServerInstance->SNO->WriteToSnoMask('a', errors.substr(start, 360)); start += 360; } } @@ -803,14 +816,14 @@ void ServerConfig::Read(bool bail, const std::string &useruid) {"options", "fixedpart", "", new ValueContainerChar (this->FixedPart), DT_CHARPTR, NoValidation}, {"performance", "netbuffersize","10240", new ValueContainerInt (&this->NetBufferSize), DT_INTEGER, ValidateNetBufferSize}, {"performance", "maxwho", "128", new ValueContainerInt (&this->MaxWhoResults), DT_INTEGER, ValidateMaxWho}, - {"options", "allowhalfop", "0", new ValueContainerBool (&this->AllowHalfop), DT_BOOLEAN, NoValidation}, + {"options", "allowhalfop", "0", new ValueContainerBool (&this->AllowHalfop), DT_BOOLEAN, ValidateHalfOp}, {"dns", "server", "", new ValueContainerChar (this->DNSServer), DT_IPADDRESS,DNSServerValidator}, {"dns", "timeout", "5", new ValueContainerInt (&this->dns_timeout), DT_INTEGER, NoValidation}, {"options", "moduledir", MOD_PATH, new ValueContainerChar (this->ModPath), DT_CHARPTR, NoValidation}, {"disabled", "commands", "", new ValueContainerChar (this->DisabledCommands), DT_CHARPTR, NoValidation}, {"disabled", "usermodes", "", new ValueContainerChar (disabledumodes), DT_CHARPTR, ValidateDisabledUModes}, {"disabled", "chanmodes", "", new ValueContainerChar (disabledcmodes), DT_CHARPTR, ValidateDisabledCModes}, - {"disabled", "fakenonexistant", "0", new ValueContainerBool (&this->DisabledDontExist), DT_BOOLEAN, NoValidation}, + {"disabled", "fakenonexistant", "0", new ValueContainerBool (&this->DisabledDontExist), DT_BOOLEAN, NoValidation}, {"security", "runasuser", "", new ValueContainerChar(this->SetUser), DT_CHARPTR, NoValidation}, {"security", "runasgroup", "", new ValueContainerChar(this->SetGroup), DT_CHARPTR, NoValidation}, @@ -821,6 +834,8 @@ void ServerConfig::Read(bool bail, const std::string &useruid) {"security", "hidewhois", "", new ValueContainerChar (this->HideWhoisServer), DT_NOSPACES, NoValidation}, {"security", "hidekills", "", new ValueContainerChar (this->HideKillsServer), DT_NOSPACES, NoValidation}, {"security", "operspywhois", "0", new ValueContainerBool (&this->OperSpyWhois), DT_BOOLEAN, NoValidation}, + {"security", "restrictbannedusers", "1", new ValueContainerBool (&this->RestrictBannedUsers), DT_BOOLEAN, NoValidation}, + {"security", "genericoper", "0", new ValueContainerBool (&this->GenericOper), DT_BOOLEAN, NoValidation}, {"performance", "nouserdns", "0", new ValueContainerBool (&this->NoUserDns), DT_BOOLEAN, NoValidation}, {"options", "syntaxhints", "0", new ValueContainerBool (&this->SyntaxHints), DT_BOOLEAN, NoValidation}, {"options", "cyclehosts", "0", new ValueContainerBool (&this->CycleHosts), DT_BOOLEAN, NoValidation}, @@ -860,18 +875,16 @@ void ServerConfig::Read(bool bail, const std::string &useruid) MultiConfig MultiValues[] = { {"connect", - {"allow", "deny", "password", "timeout", "pingfreq", "flood", - "threshold", "sendq", "recvq", "localmax", "globalmax", "port", + {"allow", "deny", "password", "timeout", "pingfreq", + "sendq", "recvq", "localmax", "globalmax", "port", "name", "parent", "maxchans", "limit", "hash", NULL}, - {"", "", "", "", "120", "", - "", "", "", "3", "3", "0", - "", "", "0", "0", "", + {"", "", "", "", "120", + "", "", "3", "3", "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_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_NOSPACES, DT_NOSPACES, DT_INTEGER, DT_INTEGER, DT_CHARPTR}, InitConnect, DoConnect, DoneConnect}, @@ -904,7 +917,7 @@ void ServerConfig::Read(bool bail, const std::string &useruid) {"No reason", "", NULL}, {DT_CHARPTR, DT_CHARPTR}, InitXLine, DoQLine, DoneConfItem}, - + {"badhost", {"reason", "host", NULL}, {"No reason", "", NULL}, @@ -916,7 +929,7 @@ void ServerConfig::Read(bool bail, const std::string &useruid) {"No reason", "", NULL}, {DT_CHARPTR, DT_CHARPTR}, InitXLine, DoELine, DoneELine}, - + {"type", {"name", "classes", NULL}, {"", "", NULL}, @@ -928,7 +941,7 @@ void ServerConfig::Read(bool bail, const std::string &useruid) {"", "", "", "", "", NULL}, {DT_NOSPACES, DT_CHARPTR, DT_CHARPTR, DT_CHARPTR, DT_CHARPTR}, InitClasses, DoClass, DoneClassesAndTypes}, - + {NULL, {NULL}, {NULL}, @@ -947,7 +960,7 @@ void ServerConfig::Read(bool bail, const std::string &useruid) delete errstr; return; } - + delete errstr; /* The stuff in here may throw CoreException, be sure we're in a position to catch it. */ @@ -989,11 +1002,11 @@ void ServerConfig::Read(bool bail, const std::string &useruid) ConfValue(newconfig, Values[Index].tag, Values[Index].value, Values[Index].default_value, 0, item, MAXBUF, allow_newlines); ValueItem vi(item); - + if (!Values[Index].validation_function(this, Values[Index].tag, Values[Index].value, vi)) throw CoreException("One or more values in your configuration file failed to validate. Please see your ircd.log for more information."); - - ServerInstance->Threads->Lock(); + + // XXX: ServerInstance->Threads->Lock(); switch (dt) { case DT_NOSPACES: @@ -1022,7 +1035,7 @@ void ServerConfig::Read(bool bail, const std::string &useruid) ValueContainerChar* vcc = (ValueContainerChar*)Values[Index].val; if (*(vi.GetString()) && !ServerInstance->IsChannel(vi.GetString(), MAXBUF)) { - ServerInstance->Threads->Unlock(); + // XXX: ServerInstance->Threads->Unlock(); throw CoreException("The value of <"+std::string(Values[Index].tag)+":"+Values[Index].value+"> is not a valid channel name"); } vcc->Set(vi.GetString(), strlen(vi.GetString()) + 1); @@ -1055,7 +1068,7 @@ void ServerConfig::Read(bool bail, const std::string &useruid) } /* We're done with this now */ delete Values[Index].val; - ServerInstance->Threads->Unlock(); + // XXX: ServerInstance->Threads->Unlock(); } /* Read the multiple-tag items (class tags, connect tags, etc) @@ -1064,9 +1077,9 @@ void ServerConfig::Read(bool bail, const std::string &useruid) */ for (int Index = 0; MultiValues[Index].tag; ++Index) { - ServerInstance->Threads->Lock(); + // XXX: ServerInstance->Threads->Lock(); MultiValues[Index].init_function(this, MultiValues[Index].tag); - ServerInstance->Threads->Unlock(); + // XXX: ServerInstance->Threads->Unlock(); int number_of_tags = ConfValueEnum(newconfig, MultiValues[Index].tag); @@ -1081,7 +1094,7 @@ void ServerConfig::Read(bool bail, const std::string &useruid) dt &= ~DT_ALLOW_NEWLINE; dt &= ~DT_ALLOW_WILD; - ServerInstance->Threads->Lock(); + // XXX: ServerInstance->Threads->Lock(); /* We catch and rethrow any exception here just so we can free our mutex */ try @@ -1160,10 +1173,10 @@ void ServerConfig::Read(bool bail, const std::string &useruid) } catch (CoreException &e) { - ServerInstance->Threads->Unlock(); + // XXX: ServerInstance->Threads->Unlock(); throw e; } - ServerInstance->Threads->Unlock(); + // XXX: ServerInstance->Threads->Unlock(); } MultiValues[Index].validation_function(this, MultiValues[Index].tag, (char**)MultiValues[Index].items, vl, MultiValues[Index].datatype); } @@ -1183,7 +1196,7 @@ void ServerConfig::Read(bool bail, const std::string &useruid) return; } - ServerInstance->Threads->Lock(); + // XXX: ServerInstance->Threads->Lock(); for (int i = 0; i < ConfValueEnum(newconfig, "type"); ++i) { char item[MAXBUF], classn[MAXBUF], classes[MAXBUF]; @@ -1217,7 +1230,7 @@ void ServerConfig::Read(bool bail, const std::string &useruid) if (bail) printf("Warning: Oper type '%s' has a missing class named '%s', this does nothing!\n", item, classname.c_str()); else - ServerInstance->SNO->WriteToSnoMask('A', "Warning: Oper type '%s' has a missing class named '%s', this does nothing!", item, classname.c_str()); + ServerInstance->SNO->WriteToSnoMask('a', "Warning: Oper type '%s' has a missing class named '%s', this does nothing!", item, classname.c_str()); } } } @@ -1226,17 +1239,11 @@ void ServerConfig::Read(bool bail, const std::string &useruid) /* If we succeeded, set the ircd config to the new one */ this->config_data = newconfig; - ServerInstance->Threads->Unlock(); + // XXX: ServerInstance->Threads->Unlock(); // write once here, to try it out and make sure its ok ServerInstance->WritePID(this->PID); - /* Switch over logfiles */ - ServerInstance->Logs->CloseLogs(); - ServerInstance->Logs->OpenFileLogs(); - - ServerInstance->Logs->Log("CONFIG", DEFAULT, "Done reading configuration file."); - /* If we're rehashing, let's load any new modules, and unload old ones */ if (!bail) @@ -1247,7 +1254,7 @@ void ServerConfig::Read(bool bail, const std::string &useruid) if (pl.size() && !useruid.empty()) { - ServerInstance->Threads->Lock(); + // XXX: ServerInstance->Threads->Lock(); User* user = ServerInstance->FindNick(useruid); if (user) { @@ -1259,17 +1266,17 @@ void ServerConfig::Read(bool bail, const std::string &useruid) user->WriteServ("NOTICE %s :*** %d. Address: %s Reason: %s", user->nick.c_str(), j, i->first.empty() ? "" : i->first.c_str(), i->second.c_str()); } } - ServerInstance->Threads->Unlock(); + // XXX: ServerInstance->Threads->Unlock(); } - ServerInstance->Threads->Lock(); + // XXX: ServerInstance->Threads->Lock(); if (!removed_modules.empty()) { for (std::vector::iterator removing = removed_modules.begin(); removing != removed_modules.end(); removing++) { if (ServerInstance->Modules->Unload(removing->c_str())) { - ServerInstance->SNO->WriteToSnoMask('A', "*** REHASH UNLOADED MODULE: %s",removing->c_str()); + ServerInstance->SNO->WriteToSnoMask('a', "*** REHASH UNLOADED MODULE: %s",removing->c_str()); if (!useruid.empty()) { @@ -1278,7 +1285,7 @@ void ServerConfig::Read(bool bail, const std::string &useruid) user->WriteNumeric(RPL_UNLOADEDMODULE, "%s %s :Module %s successfully unloaded.",user->nick.c_str(), removing->c_str(), removing->c_str()); } else - ServerInstance->SNO->WriteToSnoMask('A', "Module %s successfully unloaded.", removing->c_str()); + ServerInstance->SNO->WriteToSnoMask('a', "Module %s successfully unloaded.", removing->c_str()); rem++; } @@ -1291,7 +1298,7 @@ void ServerConfig::Read(bool bail, const std::string &useruid) user->WriteNumeric(ERR_CANTUNLOADMODULE, "%s %s :Failed to unload module %s: %s",user->nick.c_str(), removing->c_str(), removing->c_str(), ServerInstance->Modules->LastError().c_str()); } else - ServerInstance->SNO->WriteToSnoMask('A', "Failed to unload module %s: %s", removing->c_str(), ServerInstance->Modules->LastError().c_str()); + ServerInstance->SNO->WriteToSnoMask('a', "Failed to unload module %s: %s", removing->c_str(), ServerInstance->Modules->LastError().c_str()); } } } @@ -1302,7 +1309,7 @@ void ServerConfig::Read(bool bail, const std::string &useruid) { if (ServerInstance->Modules->Load(adding->c_str())) { - ServerInstance->SNO->WriteToSnoMask('A', "*** REHASH LOADED MODULE: %s",adding->c_str()); + ServerInstance->SNO->WriteToSnoMask('a', "*** REHASH LOADED MODULE: %s",adding->c_str()); if (!useruid.empty()) { User* user = ServerInstance->FindNick(useruid); @@ -1310,7 +1317,7 @@ void ServerConfig::Read(bool bail, const std::string &useruid) user->WriteNumeric(RPL_LOADEDMODULE, "%s %s :Module %s successfully loaded.",user->nick.c_str(), adding->c_str(), adding->c_str()); } else - ServerInstance->SNO->WriteToSnoMask('A', "Module %s successfully loaded.", adding->c_str()); + ServerInstance->SNO->WriteToSnoMask('a', "Module %s successfully loaded.", adding->c_str()); add++; } @@ -1323,28 +1330,15 @@ void ServerConfig::Read(bool bail, const std::string &useruid) user->WriteNumeric(ERR_CANTLOADMODULE, "%s %s :Failed to load module %s: %s",user->nick.c_str(), adding->c_str(), adding->c_str(), ServerInstance->Modules->LastError().c_str()); } else - ServerInstance->SNO->WriteToSnoMask('A', "Failed to load module %s: %s", adding->c_str(), ServerInstance->Modules->LastError().c_str()); + ServerInstance->SNO->WriteToSnoMask('a', "Failed to load module %s: %s", adding->c_str(), ServerInstance->Modules->LastError().c_str()); } } } - - ServerInstance->Logs->Log("CONFIG", 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()); - - ServerInstance->Threads->Unlock(); + // XXX: ServerInstance->Threads->Unlock(); } - if (bail) - { - /** Note: This is safe, the method checks for user == NULL */ - ServerInstance->Threads->Lock(); - User* user = NULL; - if (!useruid.empty()) - user = ServerInstance->FindNick(useruid); - ServerInstance->Parser->SetupCommandTable(user); - ServerInstance->Threads->Unlock(); - } - else + if (!bail) { if (!useruid.empty()) { @@ -1353,7 +1347,7 @@ void ServerConfig::Read(bool bail, const std::string &useruid) user->WriteServ("NOTICE %s :*** Successfully rehashed server.", user->nick.c_str()); } else - ServerInstance->SNO->WriteToSnoMask('A', "*** Successfully rehashed server."); + ServerInstance->SNO->WriteToSnoMask('a', "*** Successfully rehashed server."); } } @@ -1537,7 +1531,7 @@ bool ServerConfig::LoadConf(ConfigDataHash &target, FILE* &conf, const char* fil { // errorstream << "Closing config tag on line " << linenumber << std::endl; in_tag = false; - + /* * If this finds an then ParseLine can simply call * LoadConf() and load the included config into the same ConfigDataHash @@ -1548,7 +1542,7 @@ bool ServerConfig::LoadConf(ConfigDataHash &target, FILE* &conf, const char* fil last_successful_parse = linenumber; linenumber = bl; - + line.clear(); } else @@ -1693,7 +1687,7 @@ bool ServerConfig::ParseLine(ConfigDataHash &target, const std::string &filename got_key = false; if ((tagname == "include") && (current_key == "file")) - { + { if (!this->DoInclude(target, current_value, errorstream)) return false; } @@ -2033,7 +2027,7 @@ bool ServerConfig::FileExists(const char* file) if ((sb.st_mode & S_IFDIR) > 0) return false; - + FILE *input; if ((input = fopen (file, "r")) == NULL) return false; @@ -2052,64 +2046,6 @@ char* ServerConfig::CleanFilename(char* name) } -bool ServerConfig::DirValid(const char* dirandfile) -{ -#ifdef WINDOWS - return true; -#else - - char work[1024]; - char buffer[1024]; - char otherdir[1024]; - int p; - - strlcpy(work, dirandfile, 1024); - p = strlen(work); - - // we just want the dir - while (*work) - { - if (work[p] == '/') - { - work[p] = '\0'; - break; - } - - work[p--] = '\0'; - } - - // Get the current working directory - if (getcwd(buffer, 1024 ) == NULL ) - return false; - - if (chdir(work) == -1) - return false; - - if (getcwd(otherdir, 1024 ) == NULL ) - return false; - - if (chdir(buffer) == -1) - return false; - - size_t t = strlen(work); - - if (strlen(otherdir) >= t) - { - otherdir[t] = '\0'; - if (!strcmp(otherdir,work)) - { - return true; - } - - return false; - } - else - { - return false; - } -#endif -} - std::string ServerConfig::GetFullProgDir() { char buffer[PATH_MAX]; @@ -2211,15 +2147,6 @@ bool ValueItem::GetBool() */ bool InitTypes(ServerConfig* conf, const char*) { - if (conf->opertypes.size()) - { - for (opertype_t::iterator n = conf->opertypes.begin(); n != conf->opertypes.end(); n++) - { - if (n->second) - delete[] n->second; - } - } - conf->opertypes.clear(); return true; } @@ -2256,7 +2183,7 @@ bool DoType(ServerConfig* conf, const char*, char**, ValueList &values, int*) const char* TypeName = values[0].GetString(); const char* Classes = values[1].GetString(); - conf->opertypes[TypeName] = strnewdup(Classes); + conf->opertypes[TypeName] = std::string(Classes); return true; } @@ -2378,8 +2305,5 @@ bool DoneELine(ServerConfig* conf, const char* tag) void ConfigReaderThread::Run() { ServerInstance->Config->Read(do_bail, TheUserUID); - ServerInstance->Threads->Lock(); - this->SetExitFlag(); - ServerInstance->Threads->Unlock(); + done = true; } -