X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fuserprocess.cpp;h=1d21871655f758e8d1aa9209caa926bbbb237c46;hb=ddb970dd670bcd905c8f34458f8fcf70e9fd89bd;hp=815663ad819b37270ed74ad53d5ea98bb16da4b5;hpb=51b1560725e8b95562a0d09b87755add4ba59aef;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/userprocess.cpp b/src/userprocess.cpp index 815663ad8..1d2187165 100644 --- a/src/userprocess.cpp +++ b/src/userprocess.cpp @@ -2,22 +2,15 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev. - * E-mail: - * - * + * InspIRCd: (C) 2002-2007 InspIRCd Development Team + * See: http://www.inspircd.org/wiki/index.php/Credits * - * Written by Craig Edwards, Craig McLure, and others. * This program is free but copyrighted software; see * the file COPYING for details. * * --------------------------------------------------- */ -/* Now with added unF! ;) */ - -using namespace std; - #include "configreader.h" #include "users.h" #include "modules.h" @@ -26,7 +19,6 @@ using namespace std; #include "socketengine.h" #include "inspircd.h" #include "command_parse.h" -#include "cull_list.h" void InspIRCd::ProcessUser(userrec* cu) { @@ -44,9 +36,9 @@ void InspIRCd::ProcessUser(userrec* cu) { MOD_RESULT = this->Config->GetIOHook(cu->GetPort())->OnRawSocketRead(cu->GetFd(),ReadBuffer,sizeof(ReadBuffer),result2); } - catch (ModuleException& modexcept) + catch (CoreException& modexcept) { - this->Log(DEBUG,"Module exception caught: %s",modexcept.GetReason()); + this->Log(DEBUG, "%s threw an exception: %s", modexcept.GetSource(), modexcept.GetReason()); } if (MOD_RESULT < 0) @@ -63,8 +55,6 @@ void InspIRCd::ProcessUser(userrec* cu) result = cu->ReadData(ReadBuffer, sizeof(ReadBuffer)); } - this->Log(DEBUG,"Read result: %d",result); - if ((result) && (result != -EAGAIN)) { userrec *current; @@ -112,7 +102,7 @@ void InspIRCd::ProcessUser(userrec* cu) { this->Log(DEFAULT,"Excess flood from: %s!%s@%s",current->nick,current->ident,current->host); this->SNO->WriteToSnoMask('f',"Excess flood from: %s!%s@%s",current->nick,current->ident,current->host); - userrec::QuitUser(this, current,"Excess flood"); + current->SetWriteError("Excess flood"); return; } else @@ -136,7 +126,7 @@ void InspIRCd::ProcessUser(userrec* cu) { if (current->registered == REG_ALL) { - userrec::QuitUser(this, current,"RecvQ exceeded"); + current->SetWriteError("RecvQ exceeded"); } else { @@ -162,7 +152,7 @@ void InspIRCd::ProcessUser(userrec* cu) { this->Log(DEFAULT,"Excess flood from: %s!%s@%s",current->nick,current->ident,current->host); this->SNO->WriteToSnoMask('f',"Excess flood from: %s!%s@%s",current->nick,current->ident,current->host); - userrec::QuitUser(this, current,"Excess flood"); + current->SetWriteError("Excess flood"); return; } @@ -172,7 +162,7 @@ void InspIRCd::ProcessUser(userrec* cu) { this->Log(DEFAULT,"Excess flood from: %s!%s@%s",current->nick,current->ident,current->host); SNO->WriteToSnoMask('f',"Excess flood from: %s!%s@%s",current->nick,current->ident,current->host); - userrec::QuitUser(this, current,"Excess flood"); + current->SetWriteError("Excess flood"); } else { @@ -210,8 +200,7 @@ void InspIRCd::ProcessUser(userrec* cu) if ((result == -1) && (errno != EAGAIN) && (errno != EINTR)) { - this->Log(DEBUG,"killing: %s",cu->nick); - userrec::QuitUser(this,cu,strerror(errno)); + cu->SetWriteError(strerror(errno)); return; } } @@ -223,8 +212,7 @@ void InspIRCd::ProcessUser(userrec* cu) } else if (result == 0) { - userrec::QuitUser(this,cu,"Client exited"); - this->Log(DEBUG,"Bailing from client exit"); + cu->SetWriteError("Client exited"); return; } } @@ -241,30 +229,28 @@ void InspIRCd::DoBackgroundUserStuff(time_t TIME) return; else { - CullList GlobalGoners(this); - /* Time we actually need to call this again */ const time_t DUMMY_VALUE = 32768; next_call = TIME + DUMMY_VALUE; - + /* XXX: IT IS NOT SAFE TO USE AN ITERATOR HERE. DON'T EVEN THINK ABOUT IT. */ for (unsigned long count2 = 0; count2 != this->local_users.size(); count2++) { if (count2 >= this->local_users.size()) break; - + userrec* curr = this->local_users[count2]; - + if (curr) { /* * registration timeout -- didnt send USER/NICK/HOST * in the time specified in their connection class. */ - if (((unsigned)TIME > (unsigned)curr->timeout) && (curr->registered != REG_ALL)) + if ((TIME > curr->timeout) && (curr->registered != REG_ALL)) { - this->Log(DEBUG,"InspIRCd: registration timeout: %s",curr->nick); - GlobalGoners.AddItem(curr,"Registration timeout"); + curr->muted = true; + GlobalCulls.AddItem(curr,"Registration timeout"); continue; } else @@ -272,7 +258,7 @@ void InspIRCd::DoBackgroundUserStuff(time_t TIME) if ((curr->registered != REG_ALL) && (next_call > (time_t)curr->timeout)) next_call = curr->timeout; } - + /* * user has signed on with USER/NICK/PASS, and dns has completed, all the modules * say this user is ok to proceed, fully connect them. @@ -282,7 +268,7 @@ void InspIRCd::DoBackgroundUserStuff(time_t TIME) { curr->dns_done = true; this->stats->statsDnsBad++; - curr->FullConnect(&GlobalGoners); + curr->FullConnect(); continue; } else @@ -290,11 +276,10 @@ void InspIRCd::DoBackgroundUserStuff(time_t TIME) if ((curr->registered == REG_NICKUSER) && (ready) && (next_call > curr->signon)) next_call = curr->signon; } - + if ((curr->dns_done) && (curr->registered == REG_NICKUSER) && (ready)) { - this->Log(DEBUG,"dns done, registered=3, and modules ready, OK"); - curr->FullConnect(&GlobalGoners); + curr->FullConnect(); continue; } else @@ -302,7 +287,7 @@ void InspIRCd::DoBackgroundUserStuff(time_t TIME) if ((curr->registered == REG_NICKUSER) && (ready) && (next_call > curr->signon + this->Config->dns_timeout)) next_call = curr->signon + this->Config->dns_timeout; } - + // It's time to PING this user. Send them a ping. if ((TIME > curr->nping) && (curr->registered == REG_ALL)) { @@ -311,8 +296,9 @@ void InspIRCd::DoBackgroundUserStuff(time_t TIME) { /* Everybody loves boobies. */ time_t time = this->Time(false) - (curr->nping - curr->pingmax); - std::string boobies = "Ping timeout: " + ConvToStr(time) + " second" + (time > 1 ? "s" : ""); - GlobalGoners.AddItem(curr, boobies); + std::string boobies = "Ping timeout: " + ConvToStr(time) + " second" + (time > 1 ? "s" : ""); + curr->muted = true; + GlobalCulls.AddItem(curr, boobies); curr->lastping = 1; curr->nping = TIME+curr->pingmax; continue; @@ -326,15 +312,9 @@ void InspIRCd::DoBackgroundUserStuff(time_t TIME) if ((curr->registered == REG_ALL) && (next_call > curr->nping)) next_call = curr->nping; } - - /* - * We can flush the write buffer as the last thing we do, because if they - * match any of the above conditions its no use flushing their buffer anyway. - */ - //curr->FlushWriteBuf(); } } - + /* If theres nothing to do, trigger in the next second, something might come up */ time_t delta = next_call - TIME; if (delta == DUMMY_VALUE) @@ -342,9 +322,5 @@ void InspIRCd::DoBackgroundUserStuff(time_t TIME) next_call = TIME + 1; delta = 1; } - - /* Remove all the queued users who are due to be quit, free memory used. */ - GlobalGoners.Apply(); } } -