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())
ret = ret + *line;
line++;
}
- if ((*line == '\n') || (*line == '\r'))
+ while ((*line == '\n') || (*line == '\r'))
line++;
recvq = line;
return ret;
{
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);
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))
{
// 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);
}
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())
}
}
clientlist.erase(iter);
+ delete user;
}
- delete user;
}
WhoWasGroup::WhoWasGroup(userrec* user) : host(NULL), dhost(NULL), ident(NULL), server(NULL), gecos(NULL), signon(user->signon)