-#include <sstream>
-#include <vector>
-#include <deque>
-#include <stdarg.h>
-#include "connection.h"
-#include "users.h"
-#include "servers.h"
-#include "ctables.h"
-#include "globals.h"
-#include "modules.h"
-#include "dynamic.h"
-#include "wildcard.h"
-#include "message.h"
-#include "mode.h"
-#include "xline.h"
-#include "commands.h"
-#include "inspstring.h"
-#include "helperfuncs.h"
-#include "hashcomp.h"
-
-extern int MODCOUNT;
-extern std::vector<Module*, __single_client_alloc> modules;
-
-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;
-extern userrec* fd_ref_table[65536];
-
-extern int statsAccept, statsRefused, statsUnknown, statsCollisions, statsDns, statsDnsGood, statsDnsBad, statsConnects, statsSent, statsRecv;
-
-static char already_sent[65536];
-extern std::vector<userrec*, __single_client_alloc> all_opers;
-
-extern ClassVector Classes;
-
-typedef nspace::hash_map<std::string, userrec*, nspace::hash<string>, irc::StrHashComp, __single_client_alloc> user_hash;
-typedef nspace::hash_map<std::string, chanrec*, nspace::hash<string>, irc::StrHashComp, __single_client_alloc> chan_hash;
-typedef std::deque<command_t, __single_client_alloc> 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, ...)
-{
- char textbuffer[MAXBUF];
- va_list argsPtr;
- time_t rawtime;
- struct tm * timeinfo;
- if (level < LogLevel)
- return;
-
- time(&rawtime);
- timeinfo = localtime (&rawtime);
-
- if (log_file)
- {
- char b[MAXBUF];
- va_start (argsPtr, text);
- vsnprintf(textbuffer, MAXBUF, text, argsPtr);
- 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)
- {
- // nofork enabled? display it on terminal too
- printf("%s %s\n",b,textbuffer);
- }
- }
-}
-
-void readfile(file_cache &F, const char* fname)
-{
- FILE* file;
- char linebuf[MAXBUF];
-
- log(DEBUG,"readfile: loading %s",fname);
- F.clear();
- file = fopen(fname,"r");
- if (file)
- {
- while (!feof(file))
- {
- fgets(linebuf,sizeof(linebuf),file);
- linebuf[strlen(linebuf)-1]='\0';
- if (linebuf[0] == 0)
- {
- strcpy(linebuf," ");
- }
- if (!feof(file))
- {
- F.push_back(linebuf);
- }
- }
- fclose(file);
- }
- else
- {
- log(DEBUG,"readfile: failed to load file: %s",fname);
- }
- log(DEBUG,"readfile: loaded %s, %lu lines",fname,(unsigned long)F.size());
-}
-
-void Write(int sock,char *text, ...)
-{
- if (sock < 0)
- return;
- if (!text)
- {
- log(DEFAULT,"*** BUG *** Write was given an invalid parameter");
- return;
- }
- char textbuffer[MAXBUF];
- va_list argsPtr;
- char tb[MAXBUF];
- int res;
-
- va_start (argsPtr, text);
- vsnprintf(textbuffer, MAXBUF, text, argsPtr);
- va_end(argsPtr);
- int bytes = snprintf(tb,MAXBUF,"%s\r\n",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;
- }
- else log(DEFAULT,"ERROR! attempted write to a user with no fd_ref_table entry!!!");
-}
-
-/* write a server formatted numeric response to a single socket */
-
-void WriteServ(int sock, char* text, ...)
-{
- if (sock < 0)
- return;
- if (!text)
- {
- log(DEFAULT,"*** BUG *** WriteServ was given an invalid parameter");
- 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);
- 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;
- }
- else log(DEFAULT,"ERROR! attempted write to a user with no fd_ref_table entry!!!");
-}
-
-/* write text from an originating user to originating user */
-
-void WriteFrom(int sock, userrec *user,char* text, ...)
-{
- if (sock < 0)
- return;
- if ((!text) || (!user))
- {
- log(DEFAULT,"*** BUG *** WriteFrom was given an invalid parameter");
- return;
- }
- char textbuffer[MAXBUF],tb[MAXBUF];
- va_list argsPtr;
- int res;
- va_start (argsPtr, text);
-
- vsnprintf(textbuffer, MAXBUF, text, argsPtr);
- va_end(argsPtr);
- int bytes = snprintf(tb,MAXBUF,":%s!%s@%s %s\r\n",user->nick,user->ident,user->dhost,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;
- }
- else log(DEFAULT,"ERROR! attempted write to a user with no fd_ref_table entry!!!");
-}
-
-/* write text to an destination user from a source user (e.g. user privmsg) */
-
-void WriteTo(userrec *source, userrec *dest,char *data, ...)
-{
- if ((!dest) || (!data))
- {
- log(DEFAULT,"*** BUG *** WriteTo was given an invalid parameter");
- return;
- }
- if (dest->fd == FD_MAGIC_NUMBER)
- return;
- char textbuffer[MAXBUF],tb[MAXBUF];
- va_list argsPtr;
- va_start (argsPtr, data);
- vsnprintf(textbuffer, MAXBUF, data, argsPtr);
- va_end(argsPtr);
- chop(tb);
-
- // if no source given send it from the server.
- if (!source)
- {
- WriteServ(dest->fd,":%s %s",ServerName,textbuffer);
- }
- else
- {
- WriteFrom(dest->fd,source,"%s",textbuffer);
- }
-}
-
-/* write formatted text from a source user to all users on a channel
- * including the sender (NOT for privmsg, notice etc!) */
-
-void WriteChannel(chanrec* Ptr, userrec* user, char* text, ...)
-{
- if ((!Ptr) || (!user) || (!text))
- {
- log(DEFAULT,"*** BUG *** WriteChannel was given an invalid parameter");
- return;
- }
- char textbuffer[MAXBUF];
- va_list argsPtr;
- va_start (argsPtr, text);
- vsnprintf(textbuffer, MAXBUF, text, argsPtr);
- va_end(argsPtr);
-
- std::vector<char*, __single_client_alloc> *ulist = Ptr->GetUsers();
- for (int j = 0; j < ulist->size(); j++)
- {
- char* o = (*ulist)[j];
- userrec* otheruser = (userrec*)o;
- if (otheruser->fd != FD_MAGIC_NUMBER)
- WriteTo(user,otheruser,"%s",textbuffer);
- }
-}
-
-/* write formatted text from a source user to all users on a channel
- * including the sender (NOT for privmsg, notice etc!) doesnt send to
- * users on remote servers */
-
-void WriteChannelLocal(chanrec* Ptr, userrec* user, char* text, ...)
-{
- if ((!Ptr) || (!text))
- {
- log(DEFAULT,"*** BUG *** WriteChannel was given an invalid parameter");
- return;
- }
- char textbuffer[MAXBUF];
- va_list argsPtr;
- va_start (argsPtr, text);
- vsnprintf(textbuffer, MAXBUF, text, argsPtr);
- va_end(argsPtr);
-
- std::vector<char*, __single_client_alloc> *ulist = Ptr->GetUsers();
- for (int j = 0; j < ulist->size(); j++)
- {
- char* o = (*ulist)[j];
- userrec* otheruser = (userrec*)o;
- if ((otheruser->fd != FD_MAGIC_NUMBER) && (otheruser->fd != -1) && (otheruser != user))
- {
- if (!user)
- {
- WriteServ(otheruser->fd,"%s",textbuffer);
- }
- else
- {
- WriteTo(user,otheruser,"%s",textbuffer);
- }
- }
- }
-}
-
-void WriteChannelWithServ(char* ServName, chanrec* Ptr, char* text, ...)
-{
- if ((!Ptr) || (!text))
- {
- log(DEFAULT,"*** BUG *** WriteChannelWithServ was given an invalid parameter");
- return;
- }
- char textbuffer[MAXBUF];
- va_list argsPtr;
- va_start (argsPtr, text);
- vsnprintf(textbuffer, MAXBUF, text, argsPtr);
- va_end(argsPtr);
-
-
- std::vector<char*, __single_client_alloc> *ulist = Ptr->GetUsers();
- for (int j = 0; j < ulist->size(); j++)
- {
- char* o = (*ulist)[j];
- userrec* otheruser = (userrec*)o;
- if (otheruser->fd != FD_MAGIC_NUMBER)
- WriteServ(otheruser->fd,"%s",textbuffer);
- }
-}
-
-/* write formatted text from a source user to all users on a channel except
- * for the sender (for privmsg etc) */
-
-void ChanExceptSender(chanrec* Ptr, userrec* user, char* text, ...)
-{
- if ((!Ptr) || (!user) || (!text))
- {
- log(DEFAULT,"*** BUG *** ChanExceptSender was given an invalid parameter");
- return;
- }
- char textbuffer[MAXBUF];
- va_list argsPtr;
- va_start (argsPtr, text);
- vsnprintf(textbuffer, MAXBUF, text, argsPtr);
- va_end(argsPtr);
-
- std::vector<char*, __single_client_alloc> *ulist = Ptr->GetUsers();
- for (int j = 0; j < ulist->size(); j++)
- {
- char* o = (*ulist)[j];
- userrec* otheruser = (userrec*)o;
- if ((otheruser->fd != FD_MAGIC_NUMBER) && (user != otheruser))
- WriteFrom(otheruser->fd,user,"%s",textbuffer);
- }
-}
-
-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.
- }
-}
-
-/* write a formatted string to all users who share at least one common
- * channel, including the source user e.g. for use in NICK */
-
-void WriteCommon(userrec *u, char* text, ...)
-{
- if (!u)
- {
- log(DEFAULT,"*** BUG *** WriteCommon was given an invalid parameter");
- return;
- }
-
- if (u->registered != 7) {
- log(DEFAULT,"*** BUG *** WriteCommon on an unregistered user");
- return;
- }
-
- char textbuffer[MAXBUF];
- va_list argsPtr;
- va_start (argsPtr, text);
- vsnprintf(textbuffer, MAXBUF, text, argsPtr);
- va_end(argsPtr);
-
- // FIX: Stops a message going to the same person more than once
- bzero(&already_sent,65536);
-
- bool sent_to_at_least_one = false;
-
- for (int i = 0; i < MAXCHANS; i++)
- {
- if (u->chans[i].channel)
- {
- std::vector<char*, __single_client_alloc> *ulist = u->chans[i].channel->GetUsers();
- for (int j = 0; j < ulist->size(); j++)
- {
- char* o = (*ulist)[j];
- userrec* otheruser = (userrec*)o;
- if ((otheruser->fd > 0) && (!already_sent[otheruser->fd]))
- {
- already_sent[otheruser->fd] = 1;
- WriteFrom(otheruser->fd,u,"%s",textbuffer);
- sent_to_at_least_one = true;
- }
- }
- }
- }
- // if the user was not in any channels, no users will receive the text. Make sure the user
- // receives their OWN message for WriteCommon
- if (!sent_to_at_least_one)
- {
- WriteFrom(u->fd,u,"%s",textbuffer);
- }
-}
-
-/* write a formatted string to all users who share at least one common
- * channel, NOT including the source user e.g. for use in QUIT */
-
-void WriteCommonExcept(userrec *u, char* text, ...)
-{
- if (!u)
- {
- log(DEFAULT,"*** BUG *** WriteCommon was given an invalid parameter");
- return;
- }
-
- if (u->registered != 7) {
- log(DEFAULT,"*** BUG *** WriteCommon on an unregistered user");
- return;
- }
-
- char textbuffer[MAXBUF];
- va_list argsPtr;
- va_start (argsPtr, text);
- vsnprintf(textbuffer, MAXBUF, text, argsPtr);
- va_end(argsPtr);
-
- bzero(&already_sent,65536);
-
- for (int i = 0; i < MAXCHANS; i++)
- {
- if (u->chans[i].channel)
- {
- std::vector<char*, __single_client_alloc> *ulist = u->chans[i].channel->GetUsers();
- for (int j = 0; j < ulist->size(); j++)
- {
- char* o = (*ulist)[j];
- userrec* otheruser = (userrec*)o;
- if (u != otheruser)
- {
- if ((otheruser->fd > 0) && (!already_sent[otheruser->fd]))
- {
- already_sent[otheruser->fd] = 1;
- WriteFrom(otheruser->fd,u,"%s",textbuffer);
- }
- }
- }
- }
- }
-}
-
-void WriteOpers(char* text, ...)
-{
- if (!text)
- {
- log(DEFAULT,"*** BUG *** WriteOpers was given an invalid parameter");
- return;
- }
-
- char textbuffer[MAXBUF];
- va_list argsPtr;
- va_start (argsPtr, text);
- vsnprintf(textbuffer, MAXBUF, text, argsPtr);
- va_end(argsPtr);
-
- for (std::vector<userrec*, __single_client_alloc>::iterator i = all_opers.begin(); i != all_opers.end(); i++)
- {
- userrec* a = *i;
- if ((a) && (a->fd != FD_MAGIC_NUMBER))
- {
- if (strchr(a->modes,'s'))
- {
- // send server notices to all with +s
- WriteServ(a->fd,"NOTICE %s :%s",a->nick,textbuffer);
- }
- }
- }
-}
-
-void NoticeAllOpers(userrec *source, bool local_only, char* text, ...)
-{
- if ((!text) || (!source))
- {
- log(DEFAULT,"*** BUG *** NoticeAllOpers was given an invalid parameter");
- return;
- }
-
- char textbuffer[MAXBUF];
- va_list argsPtr;
- va_start (argsPtr, text);
- vsnprintf(textbuffer, MAXBUF, text, argsPtr);
- va_end(argsPtr);
-
- for (std::vector<userrec*,__single_client_alloc>::iterator i = all_opers.begin(); i != all_opers.end(); i++)
- {
- userrec* a = *i;
- if ((a) && (a->fd != FD_MAGIC_NUMBER))
- {
- if (strchr(a->modes,'s'))
- {
- // send server notices to all with +s
- WriteServ(a->fd,"NOTICE %s :*** Notice From %s: %s",a->nick,source->nick,textbuffer);
- }
- }
- }
-
- 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'.
-
-bool ChanAnyOnThisServer(chanrec *c,char* servername)
-{
- log(DEBUG,"ChanAnyOnThisServer");
-
- std::vector<char*, __single_client_alloc> *ulist = c->GetUsers();
- for (int j = 0; j < ulist->size(); j++)
- {
- char* o = (*ulist)[j];
- userrec* user = (userrec*)o;
- if (!strcasecmp(user->server,servername))
- return true;
- }
- return false;
-}
-
-// returns true if user 'u' shares any common channels with any users on server 'servername'
-
-bool CommonOnThisServer(userrec* u,const char* servername)
-{
- log(DEBUG,"ChanAnyOnThisServer");
-
- for (int i = 0; i < MAXCHANS; i++)
- {
- if (u->chans[i].channel)
- {
- std::vector<char*, __single_client_alloc> *ulist = u->chans[i].channel->GetUsers();
- for (int j = 0; j < ulist->size(); j++)
- {
- char* o = (*ulist)[j];
- userrec* user = (userrec*)o;
- if (!strcasecmp(user->server,servername))
- return true;
- }
- }
- }
- return false;
-}
-
-void NetSendToCommon(userrec* u, char* s)
-{
- char buffer[MAXBUF];
- 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];
- 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];
- 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];
- 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];
- 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];
- 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];
- 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 ((!text) || (!modes) || (!flags))
- {
- log(DEFAULT,"*** BUG *** WriteMode was given an invalid parameter");
- return;
- }
-
- char textbuffer[MAXBUF];
- va_list argsPtr;
- va_start (argsPtr, text);
- vsnprintf(textbuffer, MAXBUF, text, argsPtr);
- va_end(argsPtr);
- int modelen = strlen(modes);
-
- for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
- {
- if ((i->second) && (i->second->fd != FD_MAGIC_NUMBER))
- {
- bool send_to_user = false;
-
- if (flags == WM_AND)
- {
- send_to_user = true;
- for (int n = 0; n < modelen; n++)
- {
- if (!hasumode(i->second,modes[n]))
- {
- send_to_user = false;
- break;
- }
- }
- }
- else if (flags == WM_OR)
- {
- send_to_user = false;
- for (int n = 0; n < modelen; n++)
- {
- if (hasumode(i->second,modes[n]))
- {
- send_to_user = true;
- break;
- }
- }
- }
-
- if (send_to_user)
- {
- WriteServ(i->second->fd,"NOTICE %s :%s",i->second->nick,textbuffer);
- }
- }
- }
-}
-
-void NoticeAll(userrec *source, bool local_only, char* text, ...)
-{
- if ((!text) || (!source))
- {
- log(DEFAULT,"*** BUG *** NoticeAll was given an invalid parameter");
- 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))
- {
- WriteFrom(i->second->fd,source,"NOTICE $* :%s",textbuffer);
- }
- }
-
- if (!local_only)
- {
- char buffer[MAXBUF];
- snprintf(buffer,MAXBUF,"V %s * :%s",source->nick,textbuffer);
- NetSendToAll(buffer);
- }
-
-}
-
-
-void WriteWallOps(userrec *source, bool local_only, char* text, ...)
-{
- if ((!text) || (!source))
- {
- log(DEFAULT,"*** BUG *** WriteOpers was given an invalid parameter");
- 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))
- {
- if (strchr(i->second->modes,'w'))
- {
- WriteTo(source,i->second,"WALLOPS :%s",textbuffer);
- }
- }
- }
-
- 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
- * taken from RFC 1459. Many "official" server branches still hold to this
- * rule so i will too;
- *
- * Because of IRC's scandanavian origin, the characters {}| are
- * considered to be the lower case equivalents of the characters []\,
- * respectively. This is a critical issue when determining the
- * equivalence of two nicknames.
- */