diff options
Diffstat (limited to 'src/userprocess.cpp')
-rw-r--r-- | src/userprocess.cpp | 89 |
1 files changed, 48 insertions, 41 deletions
diff --git a/src/userprocess.cpp b/src/userprocess.cpp index 7ea5167a5..a6f86d2f2 100644 --- a/src/userprocess.cpp +++ b/src/userprocess.cpp @@ -334,58 +334,65 @@ void DoBackgroundUserStuff(time_t TIME) { cfd = curr->fd; - /* - * registration timeout -- didnt send USER/NICK/HOST - * in the time specified in their connection class. - */ - if (((unsigned)TIME > (unsigned)curr->timeout) && (curr->registered != 7)) - { - log(DEBUG,"InspIRCd: registration timeout: %s",curr->nick); - ZapThisDns(curr->fd); - GlobalGoners.AddItem(curr,"Registration timeout"); - continue; - } - - /* - * 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. - */ - if ((TIME > curr->signon) && (curr->registered == 3) && (AllModulesReportReady(curr))) - { - curr->dns_done = true; - ZapThisDns(curr->fd); - ServerInstance->stats->statsDnsBad++; - FullConnectUser(curr,&GlobalGoners); - continue; - } - - if ((curr->dns_done) && (curr->registered == 3) && (AllModulesReportReady(curr))) - { - log(DEBUG,"dns done, registered=3, and modules ready, OK"); - FullConnectUser(curr,&GlobalGoners); - ZapThisDns(curr->fd); - continue; - } - - // It's time to PING this user. Send them a ping. - if ((TIME > curr->nping) && (curr->registered == 7)) + if ((cfd > 0) && (cfd < MAX_DESCRIPTORS) && (fd_ref_table[cfd] == curr) && (curr)) { - // This user didn't answer the last ping, remove them - if (!curr->lastping) + /* + * registration timeout -- didnt send USER/NICK/HOST + * in the time specified in their connection class. + */ + if (((unsigned)TIME > (unsigned)curr->timeout) && (curr->registered != 7)) { - GlobalGoners.AddItem(curr,"Ping timeout"); + log(DEBUG,"InspIRCd: registration timeout: %s",curr->nick); + ZapThisDns(curr->fd); + GlobalGoners.AddItem(curr,"Registration timeout"); continue; } - Write(curr->fd,"PING :%s",Config->ServerName); - curr->lastping = 0; - curr->nping = TIME+curr->pingmax; + /* + * 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. + */ + if ((TIME > curr->signon) && (curr->registered == 3) && (AllModulesReportReady(curr))) + { + curr->dns_done = true; + ZapThisDns(curr->fd); + ServerInstance->stats->statsDnsBad++; + FullConnectUser(curr,&GlobalGoners); + continue; + } + + if ((curr->dns_done) && (curr->registered == 3) && (AllModulesReportReady(curr))) + { + log(DEBUG,"dns done, registered=3, and modules ready, OK"); + FullConnectUser(curr,&GlobalGoners); + ZapThisDns(curr->fd); + continue; + } + + // It's time to PING this user. Send them a ping. + if ((TIME > curr->nping) && (curr->registered == 7)) + { + // This user didn't answer the last ping, remove them + if (!curr->lastping) + { + GlobalGoners.AddItem(curr,"Ping timeout"); + curr->lastping = 1; + curr->nping = TIME+curr->pingmax; + continue; + } + + Write(curr->fd,"PING :%s",Config->ServerName); + curr->lastping = 0; + curr->nping = TIME+curr->pingmax; + } } /* * 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. */ + + /* Check again that theyre still here (something above may have changed that) */ if ((cfd > 0) && (cfd < MAX_DESCRIPTORS) && (fd_ref_table[cfd] == curr) && (curr)) { curr->FlushWriteBuf(); |