]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/usermanager.cpp
Change all socketengine methods to be static
[user/henk/code/inspircd.git] / src / usermanager.cpp
index 1917606863872e9976836a1a0aca2eef64e340ef..12db0dde2fb406d0fa0a43efc86db79594372eb0 100644 (file)
@@ -28,7 +28,7 @@
 UserManager::UserManager()
        : clientlist(new user_hash)
        , uuidlist(new user_hash)
-       , unregistered_count(0), local_count(0)
+       , unregistered_count(0)
 {
 }
 
@@ -62,20 +62,9 @@ void UserManager::AddUser(int socket, ListenSocket* via, irc::sockets::sockaddrs
        }
        UserIOHandler* eh = &New->eh;
 
-       /* Give each of the modules an attempt to hook the user for I/O */
-       FOREACH_MOD(OnHookIO, (eh, via));
-
-       if (eh->GetIOHook())
-       {
-               try
-               {
-                       eh->GetIOHook()->OnStreamSocketAccept(eh, client, server);
-               }
-               catch (CoreException& modexcept)
-               {
-                       ServerInstance->Logs->Log("SOCKET", LOG_DEBUG, "%s threw an exception: %s", modexcept.GetSource(), modexcept.GetReason());
-               }
-       }
+       // If this listener has an IO hook provider set then tell it about the connection
+       if (via->iohookprov)
+               via->iohookprov->OnAccept(eh, client, server);
 
        ServerInstance->Logs->Log("USERS", LOG_DEBUG, "New user fd: %d", socket);
 
@@ -92,10 +81,9 @@ void UserManager::AddUser(int socket, ListenSocket* via, irc::sockets::sockaddrs
        ServerInstance->Users->AddLocalClone(New);
        ServerInstance->Users->AddGlobalClone(New);
 
-       New->localuseriter = this->local_users.insert(local_users.end(), New);
-       local_count++;
+       this->local_users.push_front(New);
 
-       if ((this->local_users.size() > ServerInstance->Config->SoftLimit) || (this->local_users.size() >= (unsigned int)ServerInstance->SE->GetMaxFds()))
+       if ((this->local_users.size() > ServerInstance->Config->SoftLimit) || (this->local_users.size() >= (unsigned int)SocketEngine::GetMaxFds()))
        {
                ServerInstance->SNO->WriteToSnoMask('a', "Warning: softlimit value has been reached: %d clients", ServerInstance->Config->SoftLimit);
                this->QuitUser(New,"No more connections allowed");
@@ -153,7 +141,7 @@ void UserManager::AddUser(int socket, ListenSocket* via, irc::sockets::sockaddrs
                }
        }
 
-       if (!ServerInstance->SE->AddFd(eh, FD_WANT_FAST_READ | FD_WANT_EDGE_WRITE))
+       if (!SocketEngine::AddFd(eh, FD_WANT_FAST_READ | FD_WANT_EDGE_WRITE))
        {
                ServerInstance->Logs->Log("USERS", LOG_DEBUG, "Internal error on new connection");
                this->QuitUser(New, "Internal error handling connection");
@@ -169,7 +157,7 @@ void UserManager::AddUser(int socket, ListenSocket* via, irc::sockets::sockaddrs
        FOREACH_MOD(OnUserInit, (New));
 }
 
-void UserManager::QuitUser(User *user, const std::string &quitreason, const char* operreason)
+void UserManager::QuitUser(User* user, const std::string& quitreason, const std::string* operreason)
 {
        if (user->quitting)
        {
@@ -186,57 +174,31 @@ void UserManager::QuitUser(User *user, const std::string &quitreason, const char
        user->quitting = true;
 
        ServerInstance->Logs->Log("USERS", LOG_DEBUG, "QuitUser: %s=%s '%s'", user->uuid.c_str(), user->nick.c_str(), quitreason.c_str());
-       user->Write("ERROR :Closing link: (%s@%s) [%s]", user->ident.c_str(), user->host.c_str(), *operreason ? operreason : quitreason.c_str());
+       user->Write("ERROR :Closing link: (%s@%s) [%s]", user->ident.c_str(), user->host.c_str(), operreason ? operreason->c_str() : quitreason.c_str());
 
        std::string reason;
-       std::string oper_reason;
        reason.assign(quitreason, 0, ServerInstance->Config->Limits.MaxQuit);
-       if (operreason && *operreason)
-               oper_reason.assign(operreason, 0, ServerInstance->Config->Limits.MaxQuit);
-       else
-               oper_reason = quitreason;
+       if (!operreason)
+               operreason = &reason;
 
        ServerInstance->GlobalCulls.AddItem(user);
 
        if (user->registered == REG_ALL)
        {
-               FOREACH_MOD(OnUserQuit, (user, reason, oper_reason));
-               user->WriteCommonQuit(reason, oper_reason);
+               FOREACH_MOD(OnUserQuit, (user, reason, *operreason));
+               user->WriteCommonQuit(reason, *operreason);
        }
-
-       if (user->registered != REG_ALL)
-               if (ServerInstance->Users->unregistered_count)
-                       ServerInstance->Users->unregistered_count--;
+       else
+               unregistered_count--;
 
        if (IS_LOCAL(user))
        {
                LocalUser* lu = IS_LOCAL(user);
                FOREACH_MOD(OnUserDisconnect, (lu));
                lu->eh.Close();
-       }
 
-       /*
-        * this must come before the ServerInstance->SNO->WriteToSnoMaskso that it doesnt try to fill their buffer with anything
-        * if they were an oper with +s +qQ.
-        */
-       if (user->registered == REG_ALL)
-       {
-               if (IS_LOCAL(user))
-               {
-                       if (!user->quietquit)
-                       {
-                               ServerInstance->SNO->WriteToSnoMask('q',"Client exiting: %s (%s) [%s]",
-                                       user->GetFullRealHost().c_str(), user->GetIPString().c_str(), oper_reason.c_str());
-                       }
-               }
-               else
-               {
-                       if ((!ServerInstance->SilentULine(user->server)) && (!user->quietquit))
-                       {
-                               ServerInstance->SNO->WriteToSnoMask('Q',"Client exiting on server %s: %s (%s) [%s]",
-                                       user->server.c_str(), user->GetFullRealHost().c_str(), user->GetIPString().c_str(), oper_reason.c_str());
-                       }
-               }
+               if (lu->registered == REG_ALL)
+                       ServerInstance->SNO->WriteToSnoMask('q',"Client exiting: %s (%s) [%s]", user->GetFullRealHost().c_str(), user->GetIPString().c_str(), operreason->c_str());
        }
 
        user_hash::iterator iter = this->clientlist->find(user->nick);
@@ -246,7 +208,8 @@ void UserManager::QuitUser(User *user, const std::string &quitreason, const char
        else
                ServerInstance->Logs->Log("USERS", LOG_DEFAULT, "ERROR: Nick not found in clientlist, cannot remove: " + user->nick);
 
-       ServerInstance->Users->uuidlist->erase(user->uuid);
+       uuidlist->erase(user->uuid);
+       user->PurgeEmptyChannels();
 }
 
 void UserManager::AddLocalClone(User *user)
@@ -374,7 +337,7 @@ void UserManager::DoBackgroundUserStuff()
                                        if (!curr->lastping)
                                        {
                                                time_t time = ServerInstance->Time() - (curr->nping - curr->MyClass->GetPingTime());
-                                               const std::string message = "Ping timeout: " + ConvToStr(time) + (time == 1 ? " seconds" : " second");
+                                               const std::string message = "Ping timeout: " + ConvToStr(time) + (time != 1 ? " seconds" : " second");
                                                this->QuitUser(curr, message);
                                                continue;
                                        }