#include <stdarg.h>
#include "connection.h"
#include "users.h"
-#include "servers.h"
#include "ctables.h"
#include "globals.h"
#include "modules.h"
#include "inspstring.h"
#include "helperfuncs.h"
#include "hashcomp.h"
+#include "typedefs.h"
extern int MODCOUNT;
extern std::vector<Module*> modules;
-
+extern ServerConfig *Config;
extern time_t TIME;
-extern bool nofork;
extern char lowermap[255];
-extern char ServerName[MAXBUF];
-extern char Network[MAXBUF];
-extern char ServerDesc[MAXBUF];
-extern char list[MAXBUF];
-
-extern int debugging;
-extern int LogLevel;
-
-extern std::stringstream config_f;
-
-extern serverrec* me[32];
-
-extern FILE *log_file;
+static char list[MAXBUF];
extern userrec* fd_ref_table[65536];
-
-extern int statsAccept, statsRefused, statsUnknown, statsCollisions, statsDns, statsDnsGood, statsDnsBad, statsConnects, statsSent, statsRecv;
-
+extern serverstats* stats;
static char already_sent[65536];
extern std::vector<userrec*> all_opers;
-
extern ClassVector Classes;
-
-typedef nspace::hash_map<std::string, userrec*, nspace::hash<string>, irc::StrHashComp> user_hash;
-typedef nspace::hash_map<std::string, chanrec*, nspace::hash<string>, irc::StrHashComp> chan_hash;
-typedef std::deque<command_t> command_table;
-
extern user_hash clientlist;
extern chan_hash chanlist;
extern command_table cmdlist;
-extern file_cache MOTD;
-extern file_cache RULES;
void log(int level,char *text, ...)
{
va_list argsPtr;
time_t rawtime;
struct tm * timeinfo;
- if (level < LogLevel)
+ if (level < Config->LogLevel)
return;
time(&rawtime);
- timeinfo = localtime (&rawtime);
+ timeinfo = localtime(&rawtime);
- if (log_file)
+ if (Config->log_file)
{
char b[MAXBUF];
va_start (argsPtr, text);
va_end(argsPtr);
strlcpy(b,asctime(timeinfo),MAXBUF);
b[24] = ':'; // we know this is the end of the time string
- fprintf(log_file,"%s %s\n",b,textbuffer);
- if (nofork)
+ if (Config->log_file)
+ fprintf(Config->log_file,"%s %s\n",b,textbuffer);
+ if (Config->nofork)
{
// nofork enabled? display it on terminal too
printf("%s %s\n",b,textbuffer);
{
fgets(linebuf,sizeof(linebuf),file);
linebuf[strlen(linebuf)-1]='\0';
- if (linebuf[0] == 0)
+ if (!*linebuf)
{
strcpy(linebuf," ");
}
char textbuffer[MAXBUF];
va_list argsPtr;
char tb[MAXBUF];
- int res;
va_start (argsPtr, text);
vsnprintf(textbuffer, MAXBUF, text, argsPtr);
int MOD_RESULT = 0;
FOREACH_RESULT(OnRawSocketWrite(sock,tb,bytes));
fd_ref_table[sock]->AddWriteBuf(tb);
- statsSent += bytes;
+ stats->statsSent += bytes;
}
else log(DEFAULT,"ERROR! attempted write to a user with no fd_ref_table entry!!!");
}
return;
}
char textbuffer[MAXBUF],tb[MAXBUF];
- int res;
va_list argsPtr;
va_start (argsPtr, text);
vsnprintf(textbuffer, MAXBUF, text, argsPtr);
va_end(argsPtr);
- int bytes = snprintf(tb,MAXBUF,":%s %s\r\n",ServerName,textbuffer);
+ int bytes = snprintf(tb,MAXBUF,":%s %s\r\n",Config->ServerName,textbuffer);
chop(tb);
if (fd_ref_table[sock])
{
int MOD_RESULT = 0;
FOREACH_RESULT(OnRawSocketWrite(sock,tb,bytes));
fd_ref_table[sock]->AddWriteBuf(tb);
- statsSent += bytes;
+ stats->statsSent += bytes;
}
else log(DEFAULT,"ERROR! attempted write to a user with no fd_ref_table entry!!!");
}
}
char textbuffer[MAXBUF],tb[MAXBUF];
va_list argsPtr;
- int res;
va_start (argsPtr, text);
vsnprintf(textbuffer, MAXBUF, text, argsPtr);
int MOD_RESULT = 0;
FOREACH_RESULT(OnRawSocketWrite(sock,tb,bytes));
fd_ref_table[sock]->AddWriteBuf(tb);
- statsSent += bytes;
+ stats->statsSent += bytes;
}
else log(DEFAULT,"ERROR! attempted write to a user with no fd_ref_table entry!!!");
}
// if no source given send it from the server.
if (!source)
{
- WriteServ(dest->fd,":%s %s",ServerName,textbuffer);
+ WriteServ(dest->fd,":%s %s",Config->ServerName,textbuffer);
}
else
{
va_end(argsPtr);
std::vector<char*> *ulist = Ptr->GetUsers();
- for (int j = 0; j < ulist->size(); j++)
+ for (unsigned int j = 0; j < ulist->size(); j++)
{
char* o = (*ulist)[j];
userrec* otheruser = (userrec*)o;
va_end(argsPtr);
std::vector<char*> *ulist = Ptr->GetUsers();
- for (int j = 0; j < ulist->size(); j++)
+ for (unsigned int j = 0; j < ulist->size(); j++)
{
char* o = (*ulist)[j];
userrec* otheruser = (userrec*)o;
std::vector<char*> *ulist = Ptr->GetUsers();
- for (int j = 0; j < ulist->size(); j++)
+ for (unsigned int j = 0; j < ulist->size(); j++)
{
char* o = (*ulist)[j];
userrec* otheruser = (userrec*)o;
va_end(argsPtr);
std::vector<char*> *ulist = Ptr->GetUsers();
- for (int j = 0; j < ulist->size(); j++)
+ for (unsigned int j = 0; j < ulist->size(); j++)
{
char* o = (*ulist)[j];
userrec* otheruser = (userrec*)o;
std::string GetServerDescription(char* servername)
{
- for (int j = 0; j < 32; j++)
- {
- if (me[j] != NULL)
- {
- for (int k = 0; k < me[j]->connectors.size(); k++)
- {
- if (!strcasecmp(me[j]->connectors[k].GetServerName().c_str(),servername))
- {
- return me[j]->connectors[k].GetDescription();
- }
- }
- }
- return ServerDesc; // not a remote server that can be found, it must be me.
- }
+ std::string description = "";
+ FOREACH_MOD OnGetServerDescription(servername,description);
+ if (description != "")
+ {
+ return description;
+ }
+ else
+ {
+ return Config->ServerDesc; // not a remote server that can be found, it must be me.
+ }
}
/* write a formatted string to all users who share at least one common
bool sent_to_at_least_one = false;
- for (int i = 0; i < MAXCHANS; i++)
+ for (unsigned int i = 0; i < u->chans.size(); i++)
{
if (u->chans[i].channel)
{
std::vector<char*> *ulist = u->chans[i].channel->GetUsers();
- for (int j = 0; j < ulist->size(); j++)
+ for (unsigned int j = 0; j < ulist->size(); j++)
{
char* o = (*ulist)[j];
userrec* otheruser = (userrec*)o;
memset(&already_sent,0,65536);
- for (int i = 0; i < MAXCHANS; i++)
+ for (unsigned int i = 0; i < u->chans.size(); i++)
{
if (u->chans[i].channel)
{
std::vector<char*> *ulist = u->chans[i].channel->GetUsers();
- for (int j = 0; j < ulist->size(); j++)
+ for (unsigned int j = 0; j < ulist->size(); j++)
{
char* o = (*ulist)[j];
userrec* otheruser = (userrec*)o;
}
}
+void ServerNoticeAll(char* text, ...)
+{
+ if (!text)
+ return;
+
+ char textbuffer[MAXBUF];
+ va_list argsPtr;
+ va_start (argsPtr, text);
+ vsnprintf(textbuffer, MAXBUF, text, argsPtr);
+ va_end(argsPtr);
+
+ for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
+ {
+ if ((i->second) && (i->second->fd != FD_MAGIC_NUMBER))
+ {
+ WriteServ(i->second->fd,"NOTICE $%s :%s",Config->ServerName,textbuffer);
+ }
+ }
+}
+
+void ServerPrivmsgAll(char* text, ...)
+{
+ if (!text)
+ return;
+
+ char textbuffer[MAXBUF];
+ va_list argsPtr;
+ va_start (argsPtr, text);
+ vsnprintf(textbuffer, MAXBUF, text, argsPtr);
+ va_end(argsPtr);
+
+ for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
+ {
+ if ((i->second) && (i->second->fd != FD_MAGIC_NUMBER))
+ {
+ WriteServ(i->second->fd,"PRIVMSG $%s :%s",Config->ServerName,textbuffer);
+ }
+ }
+}
+
void NoticeAllOpers(userrec *source, bool local_only, char* text, ...)
{
if ((!text) || (!source))
}
}
- if (!local_only)
- {
- char buffer[MAXBUF];
- snprintf(buffer,MAXBUF,"V %s @* :%s",source->nick,textbuffer);
- NetSendToAll(buffer);
- }
}
// returns TRUE of any users on channel C occupy server 'servername'.
log(DEBUG,"ChanAnyOnThisServer");
std::vector<char*> *ulist = c->GetUsers();
- for (int j = 0; j < ulist->size(); j++)
+ for (unsigned int j = 0; j < ulist->size(); j++)
{
char* o = (*ulist)[j];
userrec* user = (userrec*)o;
{
log(DEBUG,"ChanAnyOnThisServer");
- for (int i = 0; i < MAXCHANS; i++)
+ for (unsigned int i = 0; i < u->chans.size(); i++)
{
if (u->chans[i].channel)
{
std::vector<char*> *ulist = u->chans[i].channel->GetUsers();
- for (int j = 0; j < ulist->size(); j++)
+ for (unsigned int j = 0; j < ulist->size(); j++)
{
char* o = (*ulist)[j];
userrec* user = (userrec*)o;
return false;
}
-void NetSendToCommon(userrec* u, char* s)
-{
- char buffer[MAXBUF];
- if (*s == ':')
- {
- snprintf(buffer,MAXBUF,"%s",s);
- }
- else snprintf(buffer,MAXBUF,"%s %s",CreateSum().c_str(),s);
-
- log(DEBUG,"NetSendToCommon: '%s' '%s'",u->nick,s);
-
- std::string msg = buffer;
- FOREACH_MOD OnPacketTransmit(msg,s);
- strlcpy(buffer,msg.c_str(),MAXBUF);
-
- for (int j = 0; j < 32; j++)
- {
- if (me[j] != NULL)
- {
- for (int k = 0; k < me[j]->connectors.size(); k++)
- {
- if (CommonOnThisServer(u,me[j]->connectors[k].GetServerName().c_str()))
- {
- me[j]->SendPacket(buffer,me[j]->connectors[k].GetServerName().c_str());
- }
- }
- }
- }
-}
-
-
-void NetSendToAll(char* s)
-{
- char buffer[MAXBUF];
- if (*s == ':')
- {
- snprintf(buffer,MAXBUF,"%s",s);
- }
- else snprintf(buffer,MAXBUF,"%s %s",CreateSum().c_str(),s);
-
- log(DEBUG,"NetSendToAll: '%s'",s);
-
- std::string msg = buffer;
- FOREACH_MOD OnPacketTransmit(msg,s);
- strlcpy(buffer,msg.c_str(),MAXBUF);
-
- for (int j = 0; j < 32; j++)
- {
- if (me[j] != NULL)
- {
- for (int k = 0; k < me[j]->connectors.size(); k++)
- {
- me[j]->SendPacket(buffer,me[j]->connectors[k].GetServerName().c_str());
- }
- }
- }
-}
-
-
-void NetSendToAll_WithSum(char* s,char* u)
-{
- char buffer[MAXBUF];
- if (*s == ':')
- {
- snprintf(buffer,MAXBUF,"%s",s);
- }
- else snprintf(buffer,MAXBUF,":%s %s",u,s);
-
- log(DEBUG,"NetSendToAll: '%s'",s);
-
- std::string msg = buffer;
- FOREACH_MOD OnPacketTransmit(msg,s);
- strlcpy(buffer,msg.c_str(),MAXBUF);
-
- for (int j = 0; j < 32; j++)
- {
- if (me[j] != NULL)
- {
- for (int k = 0; k < me[j]->connectors.size(); k++)
- {
- me[j]->SendPacket(buffer,me[j]->connectors[k].GetServerName().c_str());
- }
- }
- }
-}
-
-void NetSendToAllAlive(char* s)
-{
- char buffer[MAXBUF];
- if (*s == ':')
- {
- snprintf(buffer,MAXBUF,"%s",s);
- }
- else snprintf(buffer,MAXBUF,"%s %s",CreateSum().c_str(),s);
-
- log(DEBUG,"NetSendToAllAlive: '%s'",s);
-
- std::string msg = buffer;
- FOREACH_MOD OnPacketTransmit(msg,s);
- strlcpy(buffer,msg.c_str(),MAXBUF);
-
- for (int j = 0; j < 32; j++)
- {
- if (me[j] != NULL)
- {
- for (int k = 0; k < me[j]->connectors.size(); k++)
- {
- if (me[j]->connectors[k].GetState() != STATE_DISCONNECTED)
- {
- me[j]->SendPacket(buffer,me[j]->connectors[k].GetServerName().c_str());
- }
- else
- {
- log(DEBUG,"%s is dead, not sending to it.",me[j]->connectors[k].GetServerName().c_str());
- }
- }
- }
- }
-}
-
-
-void NetSendToOne(char* target,char* s)
-{
- char buffer[MAXBUF];
- if (*s == ':')
- {
- snprintf(buffer,MAXBUF,"%s",s);
- }
- else snprintf(buffer,MAXBUF,"%s %s",CreateSum().c_str(),s);
-
- log(DEBUG,"NetSendToOne: '%s' '%s'",target,s);
-
- std::string msg = buffer;
- FOREACH_MOD OnPacketTransmit(msg,s);
- strlcpy(buffer,msg.c_str(),MAXBUF);
-
- for (int j = 0; j < 32; j++)
- {
- if (me[j] != NULL)
- {
- for (int k = 0; k < me[j]->connectors.size(); k++)
- {
- if (!strcasecmp(me[j]->connectors[k].GetServerName().c_str(),target))
- {
- me[j]->SendPacket(buffer,me[j]->connectors[k].GetServerName().c_str());
- }
- }
- }
- }
-}
-
-void NetSendToAllExcept(const char* target,char* s)
-{
- char buffer[MAXBUF];
- if (*s == ':')
- {
- snprintf(buffer,MAXBUF,"%s",s);
- }
- else snprintf(buffer,MAXBUF,"%s %s",CreateSum().c_str(),s);
-
- log(DEBUG,"NetSendToAllExcept: '%s' '%s'",target,s);
-
- std::string msg = buffer;
- FOREACH_MOD OnPacketTransmit(msg,s);
- strlcpy(buffer,msg.c_str(),MAXBUF);
-
- for (int j = 0; j < 32; j++)
- {
- if (me[j] != NULL)
- {
- for (int k = 0; k < me[j]->connectors.size(); k++)
- {
- if (strcasecmp(me[j]->connectors[k].GetServerName().c_str(),target))
- {
- me[j]->SendPacket(buffer,me[j]->connectors[k].GetServerName().c_str());
- }
- }
- }
- }
-}
-
-void NetSendToAllExcept_WithSum(const char* target,char* s,char* u)
-{
- char buffer[MAXBUF];
- if (*s == ':')
- {
- snprintf(buffer,MAXBUF,"%s",s);
- }
- else snprintf(buffer,MAXBUF,":%s %s",u,s);
-
- log(DEBUG,"NetSendToAllExcept: '%s' '%s'",target,s);
-
- std::string msg = buffer;
- FOREACH_MOD OnPacketTransmit(msg,s);
- strlcpy(buffer,msg.c_str(),MAXBUF);
-
- for (int j = 0; j < 32; j++)
- {
- if (me[j] != NULL)
- {
- for (int k = 0; k < me[j]->connectors.size(); k++)
- {
- if (strcasecmp(me[j]->connectors[k].GetServerName().c_str(),target))
- {
- me[j]->SendPacket(buffer,me[j]->connectors[k].GetServerName().c_str());
- }
- }
- }
- }
-}
-
void WriteMode(const char* modes, int flags, const char* text, ...)
{
}
}
- if (!local_only)
- {
- char buffer[MAXBUF];
- snprintf(buffer,MAXBUF,"V %s * :%s",source->nick,textbuffer);
- NetSendToAll(buffer);
- }
-
}
}
}
}
-
- if (!local_only)
- {
- char buffer[MAXBUF];
- snprintf(buffer,MAXBUF,"@ %s :%s",source->nick,textbuffer);
- NetSendToAll(buffer);
- }
}
/* convert a string to lowercase. Note following special circumstances
if (n)
{
for (char* t = n; *t; t++)
- *t = lowermap[*t];
+ *t = lowermap[(unsigned)*t];
}
}
long GetMaxBans(char* name)
{
char CM[MAXBUF];
- for (int count = 0; count < ConfValueEnum("banlist",&config_f); count++)
+ for (int count = 0; count < ConfValueEnum("banlist",&Config->config_f); count++)
{
- ConfValue("banlist","chan",count,CM,&config_f);
+ ConfValue("banlist","chan",count,CM,&Config->config_f);
if (match(name,CM))
{
- ConfValue("banlist","limit",count,CM,&config_f);
+ ConfValue("banlist","limit",count,CM,&Config->config_f);
return atoi(CM);
}
}
int go_again = 1, purge = 0;
// firstly decrement the count on each channel
- for (int f = 0; f < MAXCHANS; f++)
+ for (unsigned int f = 0; f < u->chans.size(); f++)
{
if (u->chans[f].channel)
{
}
}
- for (int i = 0; i < MAXCHANS; i++)
+ for (unsigned int i = 0; i < u->chans.size(); i++)
{
if (u->chans[i].channel)
{
{
strlcat(scratch,"t",MAXMODES);
}
- if (chan->key[0])
+ if (*chan->key)
{
strlcat(scratch,"k",MAXMODES);
}
{
strlcat(scratch,"p",MAXMODES);
}
- if (chan->key[0])
+ if (*chan->key)
{
strlcat(sparam," ",MAXBUF);
strlcat(sparam,chan->key,MAXBUF);
snprintf(list,MAXBUF,"353 %s = %s :", user->nick, c->name);
std::vector<char*> *ulist = c->GetUsers();
- for (int i = 0; i < ulist->size(); i++)
+ for (unsigned int i = 0; i < ulist->size(); i++)
{
char* o = (*ulist)[i];
userrec* otheruser = (userrec*)o;
return 0;
}
- strcpy(list,"");
for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
{
if (i->second)
int c = 0;
for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
{
- if ((i->second->fd) && (isnick(i->second->nick))) c++;
+ if (i->second->registered == 7) c++;
}
return c;
}
int usercount_invisible(void)
{
int c = 0;
-
for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
{
- if ((i->second->fd) && (isnick(i->second->nick)) && (strchr(i->second->modes,'i'))) c++;
+ if ((isnick(i->second->nick)) && (strchr(i->second->modes,'i'))) c++;
}
return c;
}
int usercount_opers(void)
{
int c = 0;
-
for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
{
- if ((i->second->fd) && (isnick(i->second->nick)) && (strchr(i->second->modes,'o'))) c++;
+ if ((isnick(i->second->nick)) && (strchr(i->second->modes,'o'))) c++;
}
return c;
}
for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
{
- if ((i->second->fd) && (i->second->registered != 7))
+ if ((i->second->fd > -1) && (i->second->registered != 7))
c++;
}
return c;
return chanlist.size();
}
-long count_servs(void)
-{
- int c = 0;
- for (int i = 0; i < 32; i++)
- {
- if (me[i] != NULL)
- {
- for (vector<ircd_connector>::iterator j = me[i]->connectors.begin(); j != me[i]->connectors.end(); j++)
- {
- if (strcasecmp(j->GetServerName().c_str(),ServerName))
- {
- c++;
- }
- }
- }
- }
- return c;
-}
-
-long servercount(void)
-{
- return count_servs()+1;
-}
-
long local_count()
{
int c = 0;
for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
{
- if ((i->second->fd) && (isnick(i->second->nick)) && (!strcasecmp(i->second->server,ServerName))) c++;
+ if ((isnick(i->second->nick)) && (i->second->fd > -1)) c++;
}
return c;
}
WriteServ(user->fd,"422 %s :Message of the day file is missing.",user->nick);
return;
}
- snprintf(buf,65535,":%s 375 %s :- %s message of the day\r\n", ServerName, user->nick, ServerName);
+ snprintf(buf,65535,":%s 375 %s :- %s message of the day\r\n", Config->ServerName, user->nick, Config->ServerName);
WholeMOTD = WholeMOTD + buf;
- for (int i = 0; i != MOTD.size(); i++)
+ for (unsigned int i = 0; i != MOTD.size(); i++)
{
- snprintf(buf,65535,":%s 372 %s :- %s\r\n", ServerName, user->nick, MOTD[i].c_str());
+ snprintf(buf,65535,":%s 372 %s :- %s\r\n", Config->ServerName, user->nick, MOTD[i].c_str());
WholeMOTD = WholeMOTD + buf;
}
- snprintf(buf,65535,":%s 376 %s :End of message of the day.\r\n", ServerName, user->nick);
+ snprintf(buf,65535,":%s 376 %s :End of message of the day.\r\n", Config->ServerName, user->nick);
WholeMOTD = WholeMOTD + buf;
// only one write operation
user->AddWriteBuf(WholeMOTD);
- statsSent += WholeMOTD.length();
+ stats->statsSent += WholeMOTD.length();
}
void ShowRULES(userrec *user)
WriteServ(user->fd,"NOTICE %s :Rules file is missing.",user->nick);
return;
}
- WriteServ(user->fd,"NOTICE %s :%s rules",user->nick,ServerName);
- for (int i = 0; i != RULES.size(); i++)
+ WriteServ(user->fd,"NOTICE %s :%s rules",user->nick,Config->ServerName);
+ for (unsigned int i = 0; i != RULES.size(); i++)
{
WriteServ(user->fd,"NOTICE %s :%s",user->nick,RULES[i].c_str());
}
- WriteServ(user->fd,"NOTICE %s :End of %s rules.",user->nick,ServerName);
+ WriteServ(user->fd,"NOTICE %s :End of %s rules.",user->nick,Config->ServerName);
}
// this returns 1 when all modules are satisfied that the user should be allowed onto the irc server
return true;
}
-char islast(const char* s)
-{
- char c = '`';
- for (int j = 0; j < 32; j++)
- {
- if (me[j] != NULL)
- {
- for (int k = 0; k < me[j]->connectors.size(); k++)
- {
- if (strcasecmp(me[j]->connectors[k].GetServerName().c_str(),s))
- {
- c = '|';
- }
- if (!strcasecmp(me[j]->connectors[k].GetServerName().c_str(),s))
- {
- c = '`';
- }
- }
- }
- }
- return c;
-}
-
-long map_count(const char* s)
-{
- int c = 0;
- for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
- {
- if ((i->second->fd) && (isnick(i->second->nick)) && (!strcasecmp(i->second->server,s))) c++;
- }
- return c;
-}
-
void createcommand(char* cmd, handlerfunc f, char flags, int minparams,char* source)
{
command_t comm;