summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/channels.h11
-rw-r--r--src/channels.cpp16
-rw-r--r--src/helperfuncs.cpp90
-rw-r--r--src/inspircd.cpp27
-rw-r--r--src/modules.cpp6
-rw-r--r--src/modules/m_spanningtree.cpp13
6 files changed, 71 insertions, 92 deletions
diff --git a/include/channels.h b/include/channels.h
index dac671376..9e4bf7b24 100644
--- a/include/channels.h
+++ b/include/channels.h
@@ -14,14 +14,15 @@
* ---------------------------------------------------
*/
+#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
*/
diff --git a/src/channels.cpp b/src/channels.cpp
index c51321a64..a1a7d60fa 100644
--- a/src/channels.cpp
+++ b/src/channels.cpp
@@ -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;
}
diff --git a/src/helperfuncs.cpp b/src/helperfuncs.cpp
index 059f89be6..a97912530 100644
--- a/src/helperfuncs.cpp
+++ b/src/helperfuncs.cpp
@@ -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')))
{
diff --git a/src/inspircd.cpp b/src/inspircd.cpp
index b690c2d87..35626fbb9 100644
--- a/src/inspircd.cpp
+++ b/src/inspircd.cpp
@@ -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;
diff --git a/src/modules.cpp b/src/modules.cpp
index 0706184d4..4b8c0dffe 100644
--- a/src/modules.cpp
+++ b/src/modules.cpp
@@ -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;
diff --git a/src/modules/m_spanningtree.cpp b/src/modules/m_spanningtree.cpp
index 1c0b91241..d8f4821ba 100644
--- a/src/modules/m_spanningtree.cpp
+++ b/src/modules/m_spanningtree.cpp
@@ -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)
{