]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/users.cpp
Customizable by-byte-size recvq stuff
[user/henk/code/inspircd.git] / src / users.cpp
index 40589b2344de2f5f1a542c7fa195e1889f760fbe..0060b45ee4f6c408e4921f5a11637cba5f1d7537 100644 (file)
@@ -40,11 +40,14 @@ userrec::userrec()
        strcpy(server,"");
        strcpy(awaymsg,"");
        strcpy(oper,"");
+       reset_due = TIME;
+       lines_in = 0;
        fd = lastping = signon = idle_lastmsg = nping = registered = 0;
        flood = port = bytes_in = bytes_out = cmds_in = cmds_out = 0;
        haspassed = false;
        dns_done = false;
        recvq = "";
+       sendq = "";
        strcpy(result,"");
        for (int i = 0; i < MAXCHANS; i++)
        {
@@ -164,7 +167,7 @@ bool userrec::HasPermission(char* command)
 }
 
 
-void userrec::AddBuffer(std::string a)
+bool userrec::AddBuffer(std::string a)
 {
         std::string b = "";
         for (int i = 0; i < a.length(); i++)
@@ -173,6 +176,21 @@ void userrec::AddBuffer(std::string a)
         std::stringstream stream(recvq);
         stream << b;
         recvq = stream.str();
+       int i = 0;
+       // count the size of the first line in the buffer.
+       while (i < recvq.length())
+       {
+               if (recvq[i++] == '\n')
+                       break;
+       }
+       if (recvq.length() > this->recvqmax)
+       {
+               this->SetWriteError("RecvQ exceeded");
+               WriteOpers("*** User %s RecvQ of %d exceeds connect class maximum of %d",this->nick,recvq.length(),this->recvqmax);
+       }
+       // return false if we've had more than 600 characters WITHOUT
+       // a carriage return (this is BAD, drop the socket)
+       return (i < 600);
 }
 
 bool userrec::BufferIsReady()
@@ -190,7 +208,8 @@ void userrec::ClearBuffer()
 
 std::string userrec::GetBuffer()
 {
-       log(DEBUG,"GetBuffer\n%s\n",recvq.c_str());
+       if (recvq == "")
+               return "";
         char* line = (char*)recvq.c_str();
         std::string ret = "";
         while ((*line != '\n') && (strlen(line)))
@@ -204,3 +223,53 @@ std::string userrec::GetBuffer()
         return ret;
 }
 
+void userrec::AddWriteBuf(std::string data)
+{
+       if (this->GetWriteError() != "")
+               return;
+       if (sendq.length() + data.length() > this->sendqmax)
+       {
+               WriteOpers("*** User %s SendQ of %d exceeds connect class maximum of %d",this->nick,sendq.length() + data.length(),this->sendqmax);
+               this->SetWriteError("SendQ exceeded");
+               return;
+       }
+        std::stringstream stream;
+        stream << sendq << data;
+        sendq = stream.str();
+}
+
+// send AS MUCH OF THE USERS SENDQ as we are able to (might not be all of it)
+void userrec::FlushWriteBuf()
+{
+       if (sendq.length())
+       {
+               char* tb = (char*)this->sendq.c_str();
+               int n_sent = write(this->fd,tb,this->sendq.length());
+               if (n_sent == -1)
+               {
+                       this->SetWriteError(strerror(errno));
+               }
+               else
+               {
+                       // advance the queue
+                       tb += n_sent;
+                       this->sendq = tb;
+                       // update the user's stats counters
+                       this->bytes_out += n_sent;
+                       this->cmds_out++;
+               }
+       }
+}
+
+void userrec::SetWriteError(std::string error)
+{
+       log(DEBUG,"Setting error string for %s to '%s'",this->nick,error.c_str());
+       // don't try to set the error twice, its already set take the first string.
+       if (this->WriteError == "")
+               this->WriteError = error;
+}
+
+std::string userrec::GetWriteError()
+{
+       return this->WriteError;
+}