]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/users.cpp
Dont check APrefix both times :p
[user/henk/code/inspircd.git] / src / users.cpp
index 53617b923f9682ec0ed1b758171e2d85124c2aac..9bc7705040f4a9156f1e0fa3cf235396f3f42d56 100644 (file)
 #include "bancache.h"
 #include "commands/cmd_whowas.h"
 
-static unsigned long already_sent[MAX_DESCRIPTORS] = {0};
+static unsigned long* already_sent = NULL;
+
+
+void InitializeAlreadySent(SocketEngine* SE)
+{
+       already_sent = new unsigned long[SE->GetMaxFds()];
+}
 
 /* XXX: Used for speeding up WriteCommon operations */
 unsigned long uniq_id = 0;
@@ -308,8 +314,11 @@ char* User::MakeHostIP()
 
 void User::CloseSocket()
 {
-       ServerInstance->SE->Shutdown(this, 2);
-       ServerInstance->SE->Close(this);
+       if (this->fd > -1)
+       {
+               ServerInstance->SE->Shutdown(this, 2);
+               ServerInstance->SE->Close(this);
+       }
 }
 
 char* User::GetFullHost()
@@ -520,7 +529,7 @@ bool User::AddBuffer(std::string a)
                if (this->MyClass && (recvq.length() > this->MyClass->GetRecvqMax()))
                {
                        this->SetWriteError("RecvQ exceeded");
-                       ServerInstance->SNO->WriteToSnoMask('A', "User %s RecvQ of %lu exceeds connect class maximum of %lu",this->nick,recvq.length(),this->MyClass->GetRecvqMax());
+                       ServerInstance->SNO->WriteToSnoMask('A', "User %s RecvQ of %lu exceeds connect class maximum of %lu",this->nick,(unsigned long int)recvq.length(),this->MyClass->GetRecvqMax());
                        return false;
                }
 
@@ -597,7 +606,7 @@ void User::AddWriteBuf(const std::string &data)
                 * to repeatedly add the text to the sendq!
                 */
                this->SetWriteError("SendQ exceeded");
-               ServerInstance->SNO->WriteToSnoMask('A', "User %s SendQ of %lu exceeds connect class maximum of %lu",this->nick,sendq.length() + data.length(),this->MyClass->GetSendqMax());
+               ServerInstance->SNO->WriteToSnoMask('A', "User %s SendQ of %lu exceeds connect class maximum of %lu",this->nick,(unsigned long int)sendq.length() + data.length(),this->MyClass->GetSendqMax());
                return;
        }
 
@@ -1322,6 +1331,9 @@ void User::WriteCommon(const std::string &text)
 
        uniq_id++;
 
+       if (!already_sent)
+               InitializeAlreadySent(ServerInstance->SE);
+
        /* We dont want to be doing this n times, just once */
        snprintf(tb,MAXBUF,":%s %s",this->GetFullHost(),text.c_str());
        std::string out = tb;
@@ -1376,6 +1388,10 @@ void User::WriteCommonQuit(const std::string &normal_text, const std::string &op
                return;
 
        uniq_id++;
+
+       if (!already_sent)
+               InitializeAlreadySent(ServerInstance->SE);
+
        snprintf(tb1,MAXBUF,":%s QUIT :%s",this->GetFullHost(),normal_text.c_str());
        snprintf(tb2,MAXBUF,":%s QUIT :%s",this->GetFullHost(),oper_text.c_str());
        std::string out1 = tb1;
@@ -1407,6 +1423,10 @@ void User::WriteCommonExcept(const std::string &text)
                return;
 
        uniq_id++;
+
+       if (!already_sent)
+               InitializeAlreadySent(ServerInstance->SE);
+
        snprintf(tb1,MAXBUF,":%s %s",this->GetFullHost(),text.c_str());
        out1 = tb1;
 
@@ -1430,7 +1450,7 @@ void User::WriteCommonExcept(const std::string &text)
 
 void User::WriteWallOps(const std::string &text)
 {
-       if (!IS_OPER(this) && IS_LOCAL(this))
+       if (!IS_LOCAL(this))
                return;
 
        std::string wallop("WALLOPS :");
@@ -1446,6 +1466,9 @@ void User::WriteWallOps(const std::string &text)
 
 void User::WriteWallOps(const char* text, ...)
 {
+       if (!IS_LOCAL(this))
+               return;
+
        char textbuffer[MAXBUF];
        va_list argsPtr;