X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules.cpp;h=7505dd21edf2fb814a7098446b49abbde4532fd9;hb=ddb970dd670bcd905c8f34458f8fcf70e9fd89bd;hp=df7c9da40ab248204796ae62fde3777c975872d1;hpb=1552f3918ac0dad7fef9b86b70c0f4a63d4e37a7;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules.cpp b/src/modules.cpp index df7c9da40..7505dd21e 100644 --- a/src/modules.cpp +++ b/src/modules.cpp @@ -109,7 +109,7 @@ void Module::OnUserDisconnect(userrec* user) { } void Module::OnUserJoin(userrec* user, chanrec* channel) { } void Module::OnPostJoin(userrec* user, chanrec* channel) { } void Module::OnUserPart(userrec* user, chanrec* channel, const std::string &partmessage) { } -void Module::OnRehash(const std::string ¶meter) { } +void Module::OnRehash(userrec* user, const std::string ¶meter) { } void Module::OnServerRaw(std::string &raw, bool inbound, userrec* user) { } int Module::OnUserPreJoin(userrec* user, chanrec* chan, const char* cname, std::string &privs) { return 0; } void Module::OnMode(userrec* user, void* dest, int target_type, const std::string &text) { }; @@ -191,6 +191,7 @@ void Module::OnCancelAway(userrec* user) { }; int Module::OnUserList(userrec* user, chanrec* Ptr) { return 0; }; int Module::OnWhoisLine(userrec* user, userrec* dest, int &numeric, std::string &text) { return 0; }; void Module::OnBuildExemptList(MessageType message_type, chanrec* chan, userrec* sender, char status, CUList &exempt_list) { }; +void Module::OnGarbageCollect() { }; long InspIRCd::PriorityAfter(const std::string &modulename) { @@ -328,6 +329,10 @@ std::pair InspIRCd::GetInterfaceInstanceCount(Module* m) const std::string& InspIRCd::GetModuleName(Module* m) { static std::string nothing = ""; /* Prevent compiler warning */ + + if (!this->GetModuleCount()) + return nothing; + for (int i = 0; i <= this->GetModuleCount(); i++) { if (this->modules[i] == m) @@ -341,7 +346,10 @@ const std::string& InspIRCd::GetModuleName(Module* m) void InspIRCd::RehashServer() { this->WriteOpers("*** Rehashing config file"); + this->RehashUsersAndChans(); this->Config->Read(false,NULL); + this->ResetMaxBans(); + this->Res->Rehash(); } /* This is ugly, yes, but hash_map's arent designed to be @@ -354,7 +362,7 @@ void InspIRCd::RehashServer() chanrec* InspIRCd::GetChannelIndex(long index) { int target = 0; - for (chan_hash::iterator n = this->chanlist.begin(); n != this->chanlist.end(); n++, target++) + for (chan_hash::iterator n = this->chanlist->begin(); n != this->chanlist->end(); n++, target++) { if (index == target) return n->second; @@ -427,63 +435,28 @@ bool InspIRCd::DelModeWatcher(ModeWatcher* mw) return this->Modes->DelModeWatcher(mw); } -bool InspIRCd::AddResolver(Resolver* r) +bool InspIRCd::AddResolver(Resolver* r, bool cached) { - return this->Res->AddResolverClass(r); + if (!cached) + return this->Res->AddResolverClass(r); + else + { + r->TriggerCachedResult(); + delete r; + return true; + } } bool InspIRCd::UserToPseudo(userrec* user, const std::string &message) { - unsigned int old_fd = user->GetFd(); - user->Write("ERROR :Closing link (%s@%s) [%s]",user->ident,user->host,message.c_str()); - user->FlushWriteBuf(); - user->ClearBuffer(); - user->SetFd(FD_MAGIC_NUMBER); - - if (find(local_users.begin(),local_users.end(),user) != local_users.end()) - { - local_users.erase(find(local_users.begin(),local_users.end(),user)); - } - - this->SE->DelFd(user); - shutdown(old_fd,2); - close(old_fd); - return true; + throw CoreException("The InspIRCd::UsertoPseudo function should not be used in InspIRCd later than 1.0.x"); + return false; } bool InspIRCd::PseudoToUser(userrec* alive, userrec* zombie, const std::string &message) { - zombie->SetFd(alive->GetFd()); - FOREACH_MOD_I(this,I_OnUserQuit,OnUserQuit(alive,message)); - alive->SetFd(FD_MAGIC_NUMBER); - alive->FlushWriteBuf(); - alive->ClearBuffer(); - // save these for later - std::string oldnick = alive->nick; - std::string oldhost = alive->host; - std::string oldident = alive->ident; - userrec::QuitUser(this,alive,message.c_str()); - if (find(local_users.begin(),local_users.end(),alive) != local_users.end()) - { - local_users.erase(find(local_users.begin(),local_users.end(),alive)); - } - // Fix by brain - cant write the user until their fd table entry is updated - zombie->Write(":%s!%s@%s NICK %s",oldnick.c_str(),oldident.c_str(),oldhost.c_str(),zombie->nick); - for (UCListIter i = zombie->chans.begin(); i != zombie->chans.end(); i++) - { - chanrec* Ptr = i->first; - zombie->WriteFrom(zombie,"JOIN %s",Ptr->name); - if (Ptr->topicset) - { - zombie->WriteServ("332 %s %s :%s", zombie->nick, Ptr->name, Ptr->topic); - zombie->WriteServ("333 %s %s %s %d", zombie->nick, Ptr->name, Ptr->setby, Ptr->topicset); - } - Ptr->UserList(zombie); - zombie->WriteServ("366 %s %s :End of /NAMES list.", zombie->nick, Ptr->name); - } - if ((find(local_users.begin(),local_users.end(),zombie) == local_users.end()) && (zombie->GetFd() != FD_MAGIC_NUMBER)) - local_users.push_back(zombie); - return true; + throw CoreException("The InspIRCd::PseudotoUser function should not be used in InspIRCd later than 1.0.x"); + return false; } void InspIRCd::AddGLine(long duration, const std::string &source, const std::string &reason, const std::string &hostmask) @@ -619,30 +592,40 @@ ConfigReader::ConfigReader(InspIRCd* Instance, const std::string &filename) : Se this->error = CONF_FILE_NOT_FOUND; }; -std::string ConfigReader::ReadValue(const std::string &tag, const std::string &name, int index) + +std::string ConfigReader::ReadValue(const std::string &tag, const std::string &name, const std::string &default_value, int index, bool allow_linefeeds) { /* Don't need to strlcpy() tag and name anymore, ReadConf() takes const char* */ std::string result; - if (!ServerInstance->Config->ConfValue(*this->data, tag, name, index, result)) + if (!ServerInstance->Config->ConfValue(*this->data, tag, name, default_value, index, result, allow_linefeeds)) { this->error = CONF_VALUE_NOT_FOUND; - return ""; } - return result; } +std::string ConfigReader::ReadValue(const std::string &tag, const std::string &name, int index, bool allow_linefeeds) +{ + return ReadValue(tag, name, "", index, allow_linefeeds); +} + +bool ConfigReader::ReadFlag(const std::string &tag, const std::string &name, const std::string &default_value, int index) +{ + return ServerInstance->Config->ConfValueBool(*this->data, tag, name, default_value, index); +} + bool ConfigReader::ReadFlag(const std::string &tag, const std::string &name, int index) { - return ServerInstance->Config->ConfValueBool(*this->data, tag, name, index); + return ReadFlag(tag, name, "", index); } -long ConfigReader::ReadInteger(const std::string &tag, const std::string &name, int index, bool needs_unsigned) + +long ConfigReader::ReadInteger(const std::string &tag, const std::string &name, const std::string &default_value, int index, bool needs_unsigned) { int result; - if(!ServerInstance->Config->ConfValueInteger(*this->data, tag, name, index, result)) + if(!ServerInstance->Config->ConfValueInteger(*this->data, tag, name, default_value, index, result)) { this->error = CONF_VALUE_NOT_FOUND; return 0; @@ -657,6 +640,11 @@ long ConfigReader::ReadInteger(const std::string &tag, const std::string &name, return result; } +long ConfigReader::ReadInteger(const std::string &tag, const std::string &name, int index, bool needs_unsigned) +{ + return ReadInteger(tag, name, "", index, needs_unsigned); +} + long ConfigReader::GetError() { long olderr = this->error; @@ -666,46 +654,7 @@ long ConfigReader::GetError() void ConfigReader::DumpErrors(bool bail, userrec* user) { - /* XXX - Duplicated code */ - - if (bail) - { - printf("There were errors in your configuration:\n%s", this->errorlog->str().c_str()); - InspIRCd::Exit(ERROR); - } - else - { - std::string errors = this->errorlog->str(); - std::string::size_type start; - unsigned int prefixlen; - - start = 0; - /* ":ServerInstance->Config->ServerName NOTICE user->nick :" */ - prefixlen = strlen(ServerInstance->Config->ServerName) + strlen(user->nick) + 11; - - if (user) - { - user->WriteServ("NOTICE %s :There were errors in the configuration file:",user->nick); - - while(start < errors.length()) - { - user->WriteServ("NOTICE %s :%s",user->nick, errors.substr(start, 510 - prefixlen).c_str()); - start += 510 - prefixlen; - } - } - else - { - ServerInstance->WriteOpers("There were errors in the configuration file:"); - - while(start < errors.length()) - { - ServerInstance->WriteOpers(errors.substr(start, 360).c_str()); - start += 360; - } - } - - return; - } + ServerInstance->Config->ReportConfigError(this->errorlog->str(), bail, user); } @@ -727,10 +676,7 @@ bool ConfigReader::Verify() FileReader::FileReader(InspIRCd* Instance, const std::string &filename) : ServerInstance(Instance) { - file_cache c; - ServerInstance->Config->ReadFile(c,filename.c_str()); - this->fc = c; - this->CalcSize(); + LoadFile(filename); } FileReader::FileReader(InspIRCd* Instance) : ServerInstance(Instance) @@ -764,9 +710,12 @@ void FileReader::CalcSize() void FileReader::LoadFile(const std::string &filename) { file_cache c; - ServerInstance->Config->ReadFile(c,filename.c_str()); - this->fc = c; - this->CalcSize(); + c.clear(); + if (ServerInstance->Config->ReadFile(c,filename.c_str())) + { + this->fc = c; + this->CalcSize(); + } }