]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Changed channel user lists from vector to map
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Thu, 12 Jan 2006 20:14:43 +0000 (20:14 +0000)
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Thu, 12 Jan 2006 20:14:43 +0000 (20:14 +0000)
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@2780 e03df62e-2008-0410-955e-edbf42e46eb7

include/channels.h
src/channels.cpp
src/helperfuncs.cpp
src/inspircd.cpp
src/modules.cpp
src/modules/m_spanningtree.cpp

index dac6713762082f1c04ec9e8db3eda0b9653bbbea..9e4bf7b248d2dded7259454e4786bb8b0bbca9fe 100644 (file)
  * ---------------------------------------------------
  */
 
+#ifndef __CHANNELS_H__
+#define __CHANNELS_H__
+
 #include "inspircd_config.h"
 #include "base.h"
 #include <time.h>
 #include <vector>
 #include <string>
-
-#ifndef __CHANNELS_H__
-#define __CHANNELS_H__
+#include <map>
 
 #define CM_TOPICLOCK 1
 #define CM_NOEXTERNAL 2
@@ -114,7 +115,7 @@ class chanrec : public Extensible
        /** User list (casted to char*'s to stop forward declaration stuff)
         * (chicken and egg scenario!)
         */
-       std::vector<char*> internal_userlist;
+       std::map<char*,char*> internal_userlist;
        
        /** Channel topic.
         * If this is an empty string, no channel topic is set.
@@ -217,7 +218,7 @@ class chanrec : public Extensible
         *
         * @return This function returns a vector of userrec pointers, each of which has been casted to char* to prevent circular references
         */
-       std::vector<char*> *GetUsers();
+       std::map<char*,char*> *GetUsers();
 
        /** Creates a channel record and initialises it with default values
         */
index c51321a64348031d1950652a123db2d5cb479aa6..a1a7d60fa576ca8eb22bb9cba52133eb5f3c2357 100644 (file)
@@ -160,25 +160,23 @@ long chanrec::GetUserCounter()
 
 void chanrec::AddUser(char* castuser)
 {
-       internal_userlist.push_back(castuser);
+       internal_userlist[castuser] = castuser;
        log(DEBUG,"Added casted user to channel's internal list");
 }
 
 void chanrec::DelUser(char* castuser)
 {
-       for (std::vector<char*>::iterator a = internal_userlist.begin(); a < internal_userlist.end(); a++)
+       std::map<char*,char*>::iterator a = internal_userlist.find(castuser);
+       if (a != internal_userlist.end())
        {
-               if (*a == castuser)
-               {
-                       log(DEBUG,"Removed casted user from channel's internal list");
-                       internal_userlist.erase(a);
-                       return;
-               }
+               log(DEBUG,"Removed casted user from channel's internal list");
+               internal_userlist.erase(a);
+               return;
        }
        log(DEBUG,"BUG BUG BUG! Attempt to remove an uncasted user from the internal list of %s!",name);
 }
 
-std::vector<char*> *chanrec::GetUsers()
+std::map<char*,char*> *chanrec::GetUsers()
 {
        return &internal_userlist;
 }
index 059f89be632b150382988bff552d91f40f588762..a979125307a46992c8cfc0bef213c1c2ad3af6e7 100644 (file)
@@ -346,11 +346,10 @@ void WriteChannel(chanrec* Ptr, userrec* user, char* text, ...)
         vsnprintf(textbuffer, MAXBUF, text, argsPtr);
         va_end(argsPtr);
 
-        std::vector<char*> *ulist = Ptr->GetUsers();
-       unsigned int x = ulist->size();
-        for (unsigned int j = 0; j < x; j++)
+        std::map<char*,char*> *ulist= Ptr->GetUsers();
+       for (std::map<char*,char*>::iterator i = ulist->begin(); i != ulist->end(); i++)
         {
-                char* o = (*ulist)[j];
+                char* o = i->second;
                 userrec* otheruser = (userrec*)o;
                 if (otheruser->fd != FD_MAGIC_NUMBER)
                         WriteTo_NoFormat(user,otheruser,textbuffer);
@@ -364,11 +363,10 @@ void WriteChannel_NoFormat(chanrec* Ptr, userrec* user, const char* text)
                 log(DEFAULT,"*** BUG *** WriteChannel was given an invalid parameter");
                 return;
         }
-        std::vector<char*> *ulist = Ptr->GetUsers();
-        unsigned int x = ulist->size();
-        for (unsigned int j = 0; j < x; j++)
+        std::map<char*,char*> *ulist= Ptr->GetUsers();
+        for (std::map<char*,char*>::iterator i = ulist->begin(); i != ulist->end(); i++)
         {
-                char* o = (*ulist)[j];
+                char* o = i->second;
                 userrec* otheruser = (userrec*)o;
                 if (otheruser->fd != FD_MAGIC_NUMBER)
                         WriteTo_NoFormat(user,otheruser,text);
@@ -393,11 +391,10 @@ void WriteChannelLocal(chanrec* Ptr, userrec* user, char* text, ...)
         vsnprintf(textbuffer, MAXBUF, text, argsPtr);
         va_end(argsPtr);
 
-        std::vector<char*> *ulist = Ptr->GetUsers();
-       unsigned int x = ulist->size();
-        for (unsigned int j = 0; j < x; j++)
+        std::map<char*,char*> *ulist= Ptr->GetUsers();
+       for (std::map<char*,char*>::iterator i = ulist->begin(); i != ulist->end(); i++)
         {
-                char* o = (*ulist)[j];
+                char* o = i->second;
                 userrec* otheruser = (userrec*)o;
                 if ((otheruser->fd != FD_MAGIC_NUMBER) && (otheruser != user))
                 {
@@ -420,11 +417,10 @@ void WriteChannelLocal_NoFormat(chanrec* Ptr, userrec* user, const char* text)
                 log(DEFAULT,"*** BUG *** WriteChannel was given an invalid parameter");
                 return;
         }
-        std::vector<char*> *ulist = Ptr->GetUsers();
-        unsigned int x = ulist->size();
-        for (unsigned int j = 0; j < x; j++)
+        std::map<char*,char*> *ulist= Ptr->GetUsers();
+        for (std::map<char*,char*>::iterator i = ulist->begin(); i != ulist->end(); i++)
         {
-                char* o = (*ulist)[j];   
+                char* o = i->second;
                 userrec* otheruser = (userrec*)o;
                 if ((otheruser->fd != FD_MAGIC_NUMBER) && (otheruser != user))
                 {
@@ -456,11 +452,10 @@ void WriteChannelWithServ(char* ServName, chanrec* Ptr, char* text, ...)
         va_end(argsPtr);
 
 
-        std::vector<char*> *ulist = Ptr->GetUsers();
-       unsigned int x = ulist->size();
-        for (unsigned int j = 0; j < x; j++)
+        std::map<char*,char*> *ulist= Ptr->GetUsers();
+       for (std::map<char*,char*>::iterator i = ulist->begin(); i != ulist->end(); i++)
         {
-                char* o = (*ulist)[j];
+                char* o = i->second;
                 userrec* otheruser = (userrec*)o;
                 if (IS_LOCAL(otheruser))
                         WriteServ_NoFormat(otheruser->fd,textbuffer);
@@ -474,11 +469,10 @@ void WriteChannelWithServ_NoFormat(char* ServName, chanrec* Ptr, const char* tex
                 log(DEFAULT,"*** BUG *** WriteChannelWithServ was given an invalid parameter");
                 return;
         }
-        std::vector<char*> *ulist = Ptr->GetUsers();
-        unsigned int x = ulist->size();
-        for (unsigned int j = 0; j < x; j++)
+        std::map<char*,char*> *ulist= Ptr->GetUsers();
+        for (std::map<char*,char*>::iterator i = ulist->begin(); i != ulist->end(); i++)
         {
-                char* o = (*ulist)[j];
+                char* o = i->second;
                 userrec* otheruser = (userrec*)o;
                 if (IS_LOCAL(otheruser))
                         WriteServ_NoFormat(otheruser->fd,text);
@@ -503,11 +497,10 @@ void ChanExceptSender(chanrec* Ptr, userrec* user, char* text, ...)
         vsnprintf(textbuffer, MAXBUF, text, argsPtr);
         va_end(argsPtr);
 
-        std::vector<char*> *ulist = Ptr->GetUsers();
-       unsigned int x = ulist->size();
-        for (unsigned int j = 0; j < x; j++)
+        std::map<char*,char*> *ulist= Ptr->GetUsers();
+       for (std::map<char*,char*>::iterator i = ulist->begin(); i != ulist->end(); i++)
         {
-                char* o = (*ulist)[j];
+                char* o = i->second;
                 userrec* otheruser = (userrec*)o;
                 if ((IS_LOCAL(otheruser)) && (user != otheruser))
                         WriteFrom_NoFormat(otheruser->fd,user,textbuffer);
@@ -521,11 +514,10 @@ void ChanExceptSender_NoFormat(chanrec* Ptr, userrec* user, const char* text)
                 log(DEFAULT,"*** BUG *** ChanExceptSender was given an invalid parameter");
                 return;
         }
-        std::vector<char*> *ulist = Ptr->GetUsers();
-        unsigned int x = ulist->size();
-        for (unsigned int j = 0; j < x; j++)
+        std::map<char*,char*> *ulist= Ptr->GetUsers();
+        for (std::map<char*,char*>::iterator i = ulist->begin(); i != ulist->end(); i++)
         {
-                char* o = (*ulist)[j];
+                char* o = i->second;
                 userrec* otheruser = (userrec*)o;
                 if ((IS_LOCAL(otheruser)) && (user != otheruser))
                         WriteFrom_NoFormat(otheruser->fd,user,text);
@@ -578,11 +570,10 @@ void WriteCommon(userrec *u, char* text, ...)
         {
                 if (u->chans[i].channel)
                 {
-                        std::vector<char*> *ulist = u->chans[i].channel->GetUsers();
-                       unsigned int x = ulist->size();
-                        for (unsigned int j = 0; j < x; j++)
+                        std::map<char*,char*> *ulist= u->chans[i].channel->GetUsers();
+                       for (std::map<char*,char*>::iterator i = ulist->begin(); i != ulist->end(); i++)
                         {
-                                char* o = (*ulist)[j];
+                                char* o = i->second;
                                 userrec* otheruser = (userrec*)o;
                                 if ((otheruser->fd > -1) && (!already_sent[otheruser->fd]))
                                 {
@@ -623,11 +614,10 @@ void WriteCommon_NoFormat(userrec *u, const char* text)
         {
                 if (u->chans[i].channel)
                 {
-                        std::vector<char*> *ulist = u->chans[i].channel->GetUsers();
-                        unsigned int x = ulist->size();
-                        for (unsigned int j = 0; j < x; j++)
+                        std::map<char*,char*> *ulist= u->chans[i].channel->GetUsers();
+                        for (std::map<char*,char*>::iterator i = ulist->begin(); i != ulist->end(); i++)
                         {
-                                char* o = (*ulist)[j];
+                                char* o = i->second;
                                 userrec* otheruser = (userrec*)o;
                                 if ((otheruser->fd > -1) && (!already_sent[otheruser->fd]))
                                 {
@@ -677,11 +667,10 @@ void WriteCommonExcept(userrec *u, char* text, ...)
         {
                 if (u->chans[i].channel)
                 {
-                        std::vector<char*> *ulist = u->chans[i].channel->GetUsers();
-                       unsigned int x = ulist->size();
-                        for (unsigned int j = 0; j < x; j++)
+                        std::map<char*,char*> *ulist= u->chans[i].channel->GetUsers();
+                       for (std::map<char*,char*>::iterator i = ulist->begin(); i != ulist->end(); i++)
                         {
-                                char* o = (*ulist)[j];
+                                char* o = i->second;
                                 userrec* otheruser = (userrec*)o;
                                 if (u != otheruser)
                                 {
@@ -716,11 +705,10 @@ void WriteCommonExcept_NoFormat(userrec *u, const char* text)
         {
                 if (u->chans[i].channel)
                 {
-                        std::vector<char*> *ulist = u->chans[i].channel->GetUsers();
-                        unsigned int x = ulist->size();
-                        for (unsigned int j = 0; j < x; j++)
+                        std::map<char*,char*> *ulist= u->chans[i].channel->GetUsers();
+                        for (std::map<char*,char*>::iterator i = ulist->begin(); i != ulist->end(); i++)
                         {
-                                char* o = (*ulist)[j];
+                                char* o = i->second;
                                 userrec* otheruser = (userrec*)o;
                                 if (u != otheruser)
                                 {
@@ -1082,10 +1070,10 @@ void userlist(userrec *user,chanrec *c)
 
         snprintf(list,MAXBUF,"353 %s = %s :", user->nick, c->name);
 
-        std::vector<char*> *ulist = c->GetUsers();
-        for (unsigned int i = 0; i < ulist->size(); i++)
+        std::map<char*,char*> *ulist= c->GetUsers();
+        for (std::map<char*,char*>::iterator i = ulist->begin(); i != ulist->end(); i++)
         {
-                char* o = (*ulist)[i];
+                char* o = i->second;
                 userrec* otheruser = (userrec*)o;
                 if ((!has_channel(user,c)) && (strchr(otheruser->modes,'i')))
                 {
index b690c2d878e9ba93496973cee32d0c324ffb040f..35626fbb96bee36a90e41942309546852782a73d 100644 (file)
@@ -646,7 +646,8 @@ int InspIRCd::Run()
                                        uslen = sizeof(sock_us);
                                        length = sizeof(client);
                                        incomingSockfd = accept (activefds[activefd],(struct sockaddr*)&client,&length);
-                                       if (!getsockname(incomingSockfd,(sockaddr*)&sock_us,&uslen))
+                                       
+                                       if ((incomingSockfd > -1) && (!getsockname(incomingSockfd,(sockaddr*)&sock_us,&uslen)))
                                        {
                                                in_port = ntohs(sock_us.sin_port);
                                                log(DEBUG,"Accepted socket %d",incomingSockfd);
@@ -655,29 +656,21 @@ int InspIRCd::Run()
                                                 * using gethostbyaddr(). That is sucky and we
                                                 * don't do that any more...
                                                 */
-                                               if (incomingSockfd >= 0)
+                                               NonBlocking(incomingSockfd);
+                                               if (Config->GetIOHook(in_port))
                                                {
-                                                       NonBlocking(incomingSockfd);
-                                                       if (Config->GetIOHook(in_port))
-                                                       {
-                                                               Config->GetIOHook(in_port)->OnRawSocketAccept(incomingSockfd, target, in_port);
-                                                       }
-                                                       stats->statsAccept++;
-                                                       AddClient(incomingSockfd, target, in_port, false, target);
-                                                       log(DEBUG,"Adding client on port %lu fd=%lu",(unsigned long)in_port,(unsigned long)incomingSockfd);
-                                               }
-                                               else
-                                               {
-                                                       WriteOpers("*** WARNING: accept() failed on port %lu (%s)",(unsigned long)in_port,target);
-                                                       log(DEBUG,"accept failed: %lu",(unsigned long)in_port);
-                                                       stats->statsRefused++;
+                                                       Config->GetIOHook(in_port)->OnRawSocketAccept(incomingSockfd, target, in_port);
                                                }
+                                               stats->statsAccept++;
+                                               AddClient(incomingSockfd, target, in_port, false, target);
+                                               log(DEBUG,"Adding client on port %lu fd=%lu",(unsigned long)in_port,(unsigned long)incomingSockfd);
                                        }
                                        else
                                        {
-                                               log(DEBUG,"Couldnt look up the port number for fd %lu (OS BROKEN?!)",incomingSockfd);
+                                               log(DEBUG,"Accept failed on fd %lu: %s",(unsigned long)incomingSockfd,strerror(errno));
                                                shutdown(incomingSockfd,2);
                                                close(incomingSockfd);
+                                               stats->statsRefused++;
                                        }
                                break;
 
index 0706184d4ddfa4f9ffa17225ab7073502283ced2..4b8c0dffe2848e429b1570c54561587f040211f5 100644 (file)
@@ -377,10 +377,10 @@ chanuserlist Server::GetUsers(chanrec* chan)
 {
        chanuserlist userl;
        userl.clear();
-       std::vector<char*> *list = chan->GetUsers();
-       for (std::vector<char*>::iterator i = list->begin(); i != list->end(); i++)
+       std::map<char*,char*> *list = chan->GetUsers();
+       for (std::map<char*,char*>::iterator i = list->begin(); i != list->end(); i++)
        {
-               char* o = *i;
+               char* o = i->second;
                userl.push_back((userrec*)o);
        }
        return userl;
index 1c0b91241d5b19291e45ba9e7ba4a64ee090f535..d8f4821ba7ead8350e5b342a66719b22aa26ebb4 100644 (file)
@@ -1083,10 +1083,10 @@ class TreeSocket : public InspSocket
                log(DEBUG,"Sending FJOINs to other server for %s",c->name);
                char list[MAXBUF];
                snprintf(list,MAXBUF,":%s FJOIN %s %lu",Srv->GetServerName().c_str(),c->name,(unsigned long)c->age);
-               std::vector<char*> *ulist = c->GetUsers();
-               for (unsigned int i = 0; i < ulist->size(); i++)
+               std::map<char*,char*> *ulist = c->GetUsers();
+               for (std::map<char*,char*>::iterator i = ulist->begin(); i != ulist->end(); i++)
                {
-                       char* o = (*ulist)[i];
+                       char* o = i->second;
                        userrec* otheruser = (userrec*)o;
                        strlcat(list," ",MAXBUF);
                        strlcat(list,cmode(otheruser,c),MAXBUF);
@@ -2188,11 +2188,10 @@ void AddThisServer(TreeServer* server, std::deque<TreeServer*> &list)
 // returns a list of DIRECT servernames for a specific channel
 void GetListOfServersForChannel(chanrec* c, std::deque<TreeServer*> &list)
 {
-       std::vector<char*> *ulist = c->GetUsers();
-       unsigned int ucount = ulist->size();
-       for (unsigned int i = 0; i < ucount; i++)
+       std::map<char*,char*> *ulist = c->GetUsers();
+       for (std::map<char*,char*>::iterator i = ulist->begin(); i != ulist->end(); i++)
        {
-               char* o = (*ulist)[i];
+               char* o = i->second;
                userrec* otheruser = (userrec*)o;
                if (otheruser->fd < 0)
                {