]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/users.cpp
Add WriteOpers_NoFormat, now to remember what I wanted it for
[user/henk/code/inspircd.git] / src / users.cpp
index c7f74da0b95b0ac8f2ee0cd374778984adc5a23a..e67ad7cecce5ea65190a2ac5a06566652441e085 100644 (file)
@@ -311,9 +311,7 @@ bool userrec::AddBuffer(const std::string &a)
                 if ((*i != '\r') && (*i != '\0') && (*i != 7))
                         b = b + *i;
        }
-        std::stringstream stream(recvq);
-        stream << b;
-        recvq = stream.str();
+       recvq.append(b);
        unsigned int i = 0;
        // count the size of the first line in the buffer.
        while (i < recvq.length())
@@ -356,7 +354,7 @@ std::string userrec::GetBuffer()
                 ret = ret + *line;
                 line++;
         }
-        if ((*line == '\n') || (*line == '\r'))
+        while ((*line == '\n') || (*line == '\r'))
                 line++;
         recvq = line;
         return ret;
@@ -440,13 +438,25 @@ void kill_link(userrec *user,const char* r)
 {
         user_hash::iterator iter = clientlist.find(user->nick);
 
+
+/*
+ * I'm pretty sure returning here is causing a desync when part of the net thinks a user is gone,
+ * and another part doesn't. We want to broadcast the quit/kill before bailing so the net stays in sync.
+ *
+ * I can't imagine this blowing up, so I'm commenting it out. We still check
+ * before playing with a bad iterator below in our if(). DISCUSS THIS BEFORE YOU DO ANYTHING. --w00t
+ *
+ *     if (iter == clientlist.end())
+ *             return;
+ */
+
         char reason[MAXBUF];
 
         strlcpy(reason,r,MAXQUIT-1);
 
         log(DEBUG,"kill_link: %s '%s'",user->nick,reason);
-        Write(user->fd,"ERROR :Closing link (%s@%s) [%s]",user->ident,user->host,reason);
-        log(DEBUG,"closing fd %d",user->fd);
+       if (IS_LOCAL(user))
+               Write(user->fd,"ERROR :Closing link (%s@%s) [%s]",user->ident,user->host,reason);
 
         if (user->registered == 7) {
                purge_empty_chans(user);
@@ -454,11 +464,12 @@ void kill_link(userrec *user,const char* r)
                 WriteCommonExcept(user,"QUIT :%s",reason);
         }
 
-        user->FlushWriteBuf();
+       if (IS_LOCAL(user))
+               user->FlushWriteBuf();
 
         FOREACH_MOD(I_OnUserDisconnect,OnUserDisconnect(user));
 
-        if (user->fd > -1)
+        if (IS_LOCAL(user))
         {
                if (Config->GetIOHook(user->port))
                {
@@ -479,7 +490,7 @@ void kill_link(userrec *user,const char* r)
         // if they were an oper with +s.
         if (user->registered == 7) {
                 // fix by brain: only show local quits because we only show local connects (it just makes SENSE)
-                if (user->fd > -1)
+                if (IS_LOCAL(user))
                         WriteOpers("*** Client exiting: %s!%s@%s [%s]",user->nick,user->ident,user->host,reason);
                 AddWhoWas(user);
         }
@@ -487,7 +498,7 @@ void kill_link(userrec *user,const char* r)
         if (iter != clientlist.end())
         {
                 log(DEBUG,"deleting user hash value %lx",(unsigned long)user);
-                if (user->fd > -1)
+                if (IS_LOCAL(user))
                {
                         fd_ref_table[user->fd] = NULL;
                        if (find(local_users.begin(),local_users.end(),user) != local_users.end())
@@ -497,8 +508,8 @@ void kill_link(userrec *user,const char* r)
                        }
                }
                 clientlist.erase(iter);
+               delete user;
         }
-        delete user;
 }
 
 WhoWasGroup::WhoWasGroup(userrec* user) : host(NULL), dhost(NULL), ident(NULL), server(NULL), gecos(NULL), signon(user->signon)