Main Page | Namespace List | Class Hierarchy | Alphabetical List | Compound List | File List | Compound Members | File Members

modules.cpp

Go to the documentation of this file.
00001 /*       +------------------------------------+
00002  *       | Inspire Internet Relay Chat Daemon |
00003  *       +------------------------------------+
00004  *
00005  *  Inspire is copyright (C) 2002-2004 ChatSpike-Dev.
00006  *                       E-mail:
00007  *                <brain@chatspike.net>
00008  *                <Craig@chatspike.net>
00009  *     
00010  * Written by Craig Edwards, Craig McLure, and others.
00011  * This program is free but copyrighted software; see
00012  *            the file COPYING for details.
00013  *
00014  * ---------------------------------------------------
00015  */
00016 
00017 #include "inspircd.h"
00018 #include "inspircd_io.h"
00019 #include "inspircd_util.h"
00020 #include "inspircd_config.h"
00021 #include <unistd.h>
00022 #include <fcntl.h>
00023 #include <sys/errno.h>
00024 #include <sys/ioctl.h>
00025 #include <sys/utsname.h>
00026 #ifdef USE_KQUEUE
00027 #include <sys/types.h>
00028 #include <sys/event.h>
00029 #include <sys/time.h>
00030 #endif
00031 #include <cstdio>
00032 #include <time.h>
00033 #include <string>
00034 #ifdef GCC3
00035 #include <ext/hash_map>
00036 #else
00037 #include <hash_map>
00038 #endif
00039 #include <map>
00040 #include <sstream>
00041 #include <vector>
00042 #include <errno.h>
00043 #include <deque>
00044 #include <errno.h>
00045 #include <unistd.h>
00046 #include <sched.h>
00047 #include "connection.h"
00048 #include "users.h"
00049 #include "servers.h"
00050 #include "ctables.h"
00051 #include "globals.h"
00052 #include "modules.h"
00053 #include "dynamic.h"
00054 #include "wildcard.h"
00055 #include "message.h"
00056 #include "mode.h"
00057 #include "xline.h"
00058 #include "commands.h"
00059 #include "inspstring.h"
00060 
00061 #ifdef GCC3
00062 #define nspace __gnu_cxx
00063 #else
00064 #define nspace std
00065 #endif
00066 
00067 using namespace std;
00068 
00069 #ifdef USE_KQUEUE
00070 extern int kq;
00071 #endif
00072 
00073 extern int MODCOUNT;
00074 extern std::vector<Module*> modules;
00075 extern std::vector<ircd_module*> factory;
00076 
00077 extern time_t TIME;
00078 
00079 extern int LogLevel;
00080 extern char ServerName[MAXBUF];
00081 extern char Network[MAXBUF];
00082 extern char ServerDesc[MAXBUF];
00083 extern char AdminName[MAXBUF];
00084 extern char AdminEmail[MAXBUF];
00085 extern char AdminNick[MAXBUF];
00086 extern char diepass[MAXBUF];
00087 extern char restartpass[MAXBUF];
00088 extern char motd[MAXBUF];
00089 extern char rules[MAXBUF];
00090 extern char list[MAXBUF];
00091 extern char PrefixQuit[MAXBUF];
00092 extern char DieValue[MAXBUF];
00093 
00094 extern int debugging;
00095 extern int WHOWAS_STALE;
00096 extern int WHOWAS_MAX;
00097 extern int DieDelay;
00098 extern time_t startup_time;
00099 extern int NetBufferSize;
00100 extern int MaxWhoResults;
00101 extern time_t nb_start;
00102 
00103 extern std::vector<int> fd_reap;
00104 extern std::vector<std::string> module_names;
00105 
00106 extern int boundPortCount;
00107 extern int portCount;
00108 extern int SERVERportCount;
00109 extern int ports[MAXSOCKS];
00110 extern int defaultRoute;
00111 
00112 extern std::vector<long> auth_cookies;
00113 extern std::stringstream config_f;
00114 
00115 extern serverrec* me[32];
00116 
00117 extern FILE *log_file;
00118 
00119 extern userrec* fd_ref_table[65536];
00120 
00121 namespace nspace
00122 {
00123 #ifdef GCC34
00124         template<> struct hash<in_addr>
00125 #else
00126         template<> struct nspace::hash<in_addr>
00127 #endif
00128         {
00129                 size_t operator()(const struct in_addr &a) const
00130                 {
00131                         size_t q;
00132                         memcpy(&q,&a,sizeof(size_t));
00133                         return q;
00134                 }
00135         };
00136 #ifdef GCC34
00137         template<> struct hash<string>
00138 #else
00139         template<> struct nspace::hash<string>
00140 #endif
00141         {
00142                 size_t operator()(const string &s) const
00143                 {
00144                         char a[MAXBUF];
00145                         static struct hash<const char *> strhash;
00146                         strlcpy(a,s.c_str(),MAXBUF);
00147                         strlower(a);
00148                         return strhash(a);
00149                 }
00150         };
00151 }
00152 
00153 struct StrHashComp
00154 {
00155 
00156         bool operator()(const string& s1, const string& s2) const
00157         {
00158                 char a[MAXBUF],b[MAXBUF];
00159                 strlcpy(a,s1.c_str(),MAXBUF);
00160                 strlcpy(b,s2.c_str(),MAXBUF);
00161                 strlower(a);
00162                 strlower(b);
00163                 return (strcasecmp(a,b) == 0);
00164         }
00165 
00166 };
00167 
00168 struct InAddr_HashComp
00169 {
00170 
00171         bool operator()(const in_addr &s1, const in_addr &s2) const
00172         {
00173                 size_t q;
00174                 size_t p;
00175                 
00176                 memcpy(&q,&s1,sizeof(size_t));
00177                 memcpy(&p,&s2,sizeof(size_t));
00178                 
00179                 return (q == p);
00180         }
00181 
00182 };
00183 
00184 
00185 typedef nspace::hash_map<std::string, userrec*, nspace::hash<string>, StrHashComp> user_hash;
00186 typedef nspace::hash_map<std::string, chanrec*, nspace::hash<string>, StrHashComp> chan_hash;
00187 typedef nspace::hash_map<in_addr,string*, nspace::hash<in_addr>, InAddr_HashComp> address_cache;
00188 typedef std::deque<command_t> command_table;
00189 
00190 
00191 extern user_hash clientlist;
00192 extern chan_hash chanlist;
00193 extern user_hash whowas;
00194 extern command_table cmdlist;
00195 extern file_cache MOTD;
00196 extern file_cache RULES;
00197 extern address_cache IP;
00198 
00199 
00200 // class type for holding an extended mode character - internal to core
00201 
00202 class ExtMode : public classbase
00203 {
00204 public:
00205         char modechar;
00206         int type;
00207         int params_when_on;
00208         int params_when_off;
00209         bool needsoper;
00210         bool list;
00211         ExtMode(char mc, int ty, bool oper, int p_on, int p_off) : modechar(mc), type(ty), needsoper(oper), params_when_on(p_on), params_when_off(p_off) { };
00212 };                                     
00213 
00214 typedef std::vector<ExtMode> ExtModeList;
00215 typedef ExtModeList::iterator ExtModeListIter;
00216 
00217 
00218 ExtModeList EMode;
00219 
00220 // returns true if an extended mode character is in use
00221 bool ModeDefined(char modechar, int type)
00222 {
00223         for (ExtModeListIter i = EMode.begin(); i < EMode.end(); i++)
00224         {
00225                 if ((i->modechar == modechar) && (i->type == type))
00226                 {
00227                         return true;
00228                 }
00229         }
00230         return false;
00231 }
00232 
00233 bool ModeIsListMode(char modechar, int type)
00234 {
00235         for (ExtModeListIter i = EMode.begin(); i < EMode.end(); i++)
00236         {
00237                 if ((i->modechar == modechar) && (i->type == type) && (i->list == true))
00238                 {
00239                         return true;
00240                 }
00241         }
00242         return false;
00243 }
00244 
00245 bool ModeDefinedOper(char modechar, int type)
00246 {
00247         for (ExtModeListIter i = EMode.begin(); i < EMode.end(); i++)
00248         {
00249                 if ((i->modechar == modechar) && (i->type == type) && (i->needsoper == true))
00250                 {
00251                         return true;
00252                 }
00253         }
00254         return false;
00255 }
00256 
00257 // returns number of parameters for a custom mode when it is switched on
00258 int ModeDefinedOn(char modechar, int type)
00259 {
00260         for (ExtModeListIter i = EMode.begin(); i < EMode.end(); i++)
00261         {
00262                 if ((i->modechar == modechar) && (i->type == type))
00263                 {
00264                         return i->params_when_on;
00265                 }
00266         }
00267         return 0;
00268 }
00269 
00270 // returns number of parameters for a custom mode when it is switched on
00271 int ModeDefinedOff(char modechar, int type)
00272 {
00273         for (ExtModeListIter i = EMode.begin(); i < EMode.end(); i++)
00274         {
00275                 if ((i->modechar == modechar) && (i->type == type))
00276                 {
00277                         return i->params_when_off;
00278                 }
00279         }
00280         return 0;
00281 }
00282 
00283 // returns true if an extended mode character is in use
00284 bool DoAddExtendedMode(char modechar, int type, bool requires_oper, int params_on, int params_off)
00285 {
00286         if (ModeDefined(modechar,type)) {
00287                 return false;
00288         }
00289         EMode.push_back(ExtMode(modechar,type,requires_oper,params_on,params_off));
00290         return true;
00291 }
00292 
00293 // turns a mode into a listmode
00294 void ModeMakeList(char modechar)
00295 {
00296         for (ExtModeListIter i = EMode.begin(); i < EMode.end(); i++)
00297         {
00298                 if ((i->modechar == modechar) && (i->type == MT_CHANNEL))
00299                 {
00300                         i->list = true;
00301                         return;
00302                 }
00303         }
00304         return;
00305 }
00306 
00307 // version is a simple class for holding a modules version number
00308 
00309 Version::Version(int major, int minor, int revision, int build, int flags) : Major(major), Minor(minor), Revision(revision), Build(build), Flags(flags) { };
00310 
00311 // admin is a simple class for holding a server's administrative info
00312 
00313 Admin::Admin(std::string name, std::string email, std::string nick) : Name(name), Email(email), Nick(nick) { };
00314 
00315 Request::Request(char* anydata, Module* src, Module* dst) : data(anydata), source(src), dest(dst) { };
00316 
00317 char* Request::GetData()
00318 {
00319         return this->data;
00320 }
00321 
00322 Module* Request::GetSource()
00323 {
00324         return this->source;
00325 }
00326 
00327 Module* Request::GetDest()
00328 {
00329         return this->dest;
00330 }
00331 
00332 char* Request::Send()
00333 {
00334         if (this->dest)
00335         {
00336                 return dest->OnRequest(this);
00337         }
00338         else
00339         {
00340                 return NULL;
00341         }
00342 }
00343 
00344 Event::Event(char* anydata, Module* src, std::string eventid) : data(anydata), source(src), id(eventid) { };
00345 
00346 char* Event::GetData()
00347 {
00348         return this->data;
00349 }
00350 
00351 Module* Event::GetSource()
00352 {
00353         return this->source;
00354 }
00355 
00356 char* Event::Send()
00357 {
00358         FOREACH_MOD OnEvent(this);
00359         return NULL;
00360 }
00361 
00362 std::string Event::GetEventID()
00363 {
00364         return this->id;
00365 }
00366 
00367 
00368 // These declarations define the behavours of the base class Module (which does nothing at all)
00369                 Module::Module() { }
00370                 Module::~Module() { }
00371 void            Module::OnUserConnect(userrec* user) { }
00372 void            Module::OnUserQuit(userrec* user) { }
00373 void            Module::OnUserDisconnect(userrec* user) { }
00374 void            Module::OnUserJoin(userrec* user, chanrec* channel) { }
00375 void            Module::OnUserPart(userrec* user, chanrec* channel) { }
00376 void            Module::OnPacketTransmit(std::string &data, std::string serv) { }
00377 void            Module::OnPacketReceive(std::string &data, std::string serv) { }
00378 void            Module::OnRehash() { }
00379 void            Module::OnServerRaw(std::string &raw, bool inbound, userrec* user) { }
00380 int             Module::OnUserPreJoin(userrec* user, chanrec* chan, const char* cname) { return 0; }
00381 int             Module::OnExtendedMode(userrec* user, void* target, char modechar, int type, bool mode_on, string_list &params) { return false; }
00382 Version         Module::GetVersion() { return Version(1,0,0,0,VF_VENDOR); }
00383 void            Module::OnOper(userrec* user) { };
00384 void            Module::OnInfo(userrec* user) { };
00385 void            Module::OnWhois(userrec* source, userrec* dest) { };
00386 int             Module::OnUserPreInvite(userrec* source,userrec* dest,chanrec* channel) { return 0; };
00387 int             Module::OnUserPreMessage(userrec* user,void* dest,int target_type, std::string &text) { return 0; };
00388 int             Module::OnUserPreNotice(userrec* user,void* dest,int target_type, std::string &text) { return 0; };
00389 int             Module::OnUserPreNick(userrec* user, std::string newnick) { return 0; };
00390 void            Module::OnUserPostNick(userrec* user, std::string oldnick) { };
00391 int             Module::OnAccessCheck(userrec* source,userrec* dest,chanrec* channel,int access_type) { return ACR_DEFAULT; };
00392 string_list     Module::OnUserSync(userrec* user) { string_list empty; return empty; }
00393 string_list     Module::OnChannelSync(chanrec* chan) { string_list empty; return empty; }
00394 void            Module::On005Numeric(std::string &output) { };
00395 int             Module::OnKill(userrec* source, userrec* dest, std::string reason) { return 0; };
00396 void            Module::OnLoadModule(Module* mod,std::string name) { };
00397 void            Module::OnBackgroundTimer(time_t curtime) { };
00398 void            Module::OnSendList(userrec* user, chanrec* channel, char mode) { };
00399 int             Module::OnPreCommand(std::string command, char **parameters, int pcnt, userrec *user) { return 0; };
00400 bool            Module::OnCheckReady(userrec* user) { return true; };
00401 void            Module::OnUserRegister(userrec* user) { };
00402 int             Module::OnUserPreKick(userrec* source, userrec* user, chanrec* chan, std::string reason) { return 0; };
00403 void            Module::OnUserKick(userrec* source, userrec* user, chanrec* chan, std::string reason) { };
00404 int             Module::OnRawMode(userrec* user, chanrec* chan, char mode, std::string param, bool adding, int pcnt) { return 0; };
00405 int             Module::OnCheckInvite(userrec* user, chanrec* chan) { return 0; };
00406 int             Module::OnCheckKey(userrec* user, chanrec* chan, std::string keygiven) { return 0; };
00407 int             Module::OnCheckLimit(userrec* user, chanrec* chan) { return 0; };
00408 int             Module::OnCheckBan(userrec* user, chanrec* chan) { return 0; };
00409 void            Module::OnStats(char symbol) { };
00410 int             Module::OnChangeLocalUserHost(userrec* user, std::string newhost) { return 0; };
00411 int             Module::OnChangeLocalUserGECOS(userrec* user, std::string newhost) { return 0; };
00412 int             Module::OnLocalTopicChange(userrec* user, chanrec* chan, std::string topic) { return 0; };
00413 int             Module::OnMeshToken(char token,string_list params,serverrec* source,serverrec* reply, std::string tcp_host,std::string ipaddr,int port) { return 0; };
00414 void            Module::OnEvent(Event* event) { return; };
00415 char*           Module::OnRequest(Request* request) { return NULL; };
00416 int             Module::OnOperCompare(std::string password, std::string input) { return 0; };
00417 void            Module::OnGlobalOper(userrec* user) { };
00418 void            Module::OnGlobalConnect(userrec* user) { };
00419 int             Module::OnAddBan(userrec* source, chanrec* channel,std::string banmask) { return 0; };
00420 int             Module::OnDelBan(userrec* source, chanrec* channel,std::string banmask) { return 0; };
00421 void            Module::OnRawSocketAccept(int fd, std::string ip, int localport) { };
00422 int             Module::OnRawSocketWrite(int fd, char* buffer, int count) { return 0; };
00423 void            Module::OnRawSocketClose(int fd) { };
00424 int             Module::OnRawSocketRead(int fd, char* buffer, unsigned int count, int &readresult) { return 0; };
00425 
00426 // server is a wrapper class that provides methods to all of the C-style
00427 // exports in the core
00428 //
00429 
00430 Server::Server()
00431 {
00432 }
00433 
00434 Server::~Server()
00435 {
00436 }
00437 
00438 void Server::SendOpers(std::string s)
00439 {
00440         WriteOpers("%s",s.c_str());
00441 }
00442 
00443 bool Server::MatchText(std::string sliteral, std::string spattern)
00444 {
00445         char literal[MAXBUF],pattern[MAXBUF];
00446         strlcpy(literal,sliteral.c_str(),MAXBUF);
00447         strlcpy(pattern,spattern.c_str(),MAXBUF);
00448         return match(literal,pattern);
00449 }
00450 
00451 void Server::SendToModeMask(std::string modes, int flags, std::string text)
00452 {
00453         WriteMode(modes.c_str(),flags,"%s",text.c_str());
00454 }
00455 
00456 chanrec* Server::JoinUserToChannel(userrec* user, std::string cname, std::string key)
00457 {
00458         return add_channel(user,cname.c_str(),key.c_str(),false);
00459 }
00460 
00461 chanrec* Server::PartUserFromChannel(userrec* user, std::string cname, std::string reason)
00462 {
00463         return del_channel(user,cname.c_str(),reason.c_str(),false);
00464 }
00465 
00466 chanuserlist Server::GetUsers(chanrec* chan)
00467 {
00468         chanuserlist userl;
00469         userl.clear();
00470         std::vector<char*> *list = chan->GetUsers();
00471         for (std::vector<char*>::iterator i = list->begin(); i != list->end(); i++)
00472         {
00473                 char* o = *i;
00474                 userl.push_back((userrec*)o);
00475         }
00476         return userl;
00477 }
00478 void Server::ChangeUserNick(userrec* user, std::string nickname)
00479 {
00480         force_nickchange(user,nickname.c_str());
00481 }
00482 
00483 void Server::QuitUser(userrec* user, std::string reason)
00484 {
00485         kill_link(user,reason.c_str());
00486 }
00487 
00488 bool Server::IsUlined(std::string server)
00489 {
00490         return is_uline(server.c_str());
00491 }
00492 
00493 void Server::CallCommandHandler(std::string commandname, char** parameters, int pcnt, userrec* user)
00494 {
00495         call_handler(commandname.c_str(),parameters,pcnt,user);
00496 }
00497 
00498 void Server::Log(int level, std::string s)
00499 {
00500         log(level,"%s",s.c_str());
00501 }
00502 
00503 void Server::AddCommand(char* cmd, handlerfunc f, char flags, int minparams, char* source)
00504 {
00505         createcommand(cmd,f,flags,minparams,source);
00506 }
00507 
00508 void Server::SendMode(char **parameters, int pcnt, userrec *user)
00509 {
00510         server_mode(parameters,pcnt,user);
00511 }
00512 
00513 void Server::Send(int Socket, std::string s)
00514 {
00515         Write(Socket,"%s",s.c_str());
00516 }
00517 
00518 void Server::SendServ(int Socket, std::string s)
00519 {
00520         WriteServ(Socket,"%s",s.c_str());
00521 }
00522 
00523 void Server::SendFrom(int Socket, userrec* User, std::string s)
00524 {
00525         WriteFrom(Socket,User,"%s",s.c_str());
00526 }
00527 
00528 void Server::SendTo(userrec* Source, userrec* Dest, std::string s)
00529 {
00530         if (!Source)
00531         {
00532                 // if source is NULL, then the message originates from the local server
00533                 Write(Dest->fd,":%s %s",this->GetServerName().c_str(),s.c_str());
00534         }
00535         else
00536         {
00537                 // otherwise it comes from the user specified
00538                 WriteTo(Source,Dest,"%s",s.c_str());
00539         }
00540 }
00541 
00542 void Server::SendChannelServerNotice(std::string ServName, chanrec* Channel, std::string text)
00543 {
00544         WriteChannelWithServ((char*)ServName.c_str(), Channel, "%s", text.c_str());
00545 }
00546 
00547 void Server::SendChannel(userrec* User, chanrec* Channel, std::string s,bool IncludeSender)
00548 {
00549         if (IncludeSender)
00550         {
00551                 WriteChannel(Channel,User,"%s",s.c_str());
00552         }
00553         else
00554         {
00555                 ChanExceptSender(Channel,User,"%s",s.c_str());
00556         }
00557 }
00558 
00559 bool Server::CommonChannels(userrec* u1, userrec* u2)
00560 {
00561         return (common_channels(u1,u2) != 0);
00562 }
00563 
00564 void Server::SendCommon(userrec* User, std::string text,bool IncludeSender)
00565 {
00566         if (IncludeSender)
00567         {
00568                 WriteCommon(User,"%s",text.c_str());
00569         }
00570         else
00571         {
00572                 WriteCommonExcept(User,"%s",text.c_str());
00573         }
00574 }
00575 
00576 void Server::SendWallops(userrec* User, std::string text)
00577 {
00578         WriteWallOps(User,false,"%s",text.c_str());
00579 }
00580 
00581 void Server::ChangeHost(userrec* user, std::string host)
00582 {
00583         ChangeDisplayedHost(user,host.c_str());
00584 }
00585 
00586 void Server::ChangeGECOS(userrec* user, std::string gecos)
00587 {
00588         ChangeName(user,gecos.c_str());
00589 }
00590 
00591 bool Server::IsNick(std::string nick)
00592 {
00593         return (isnick(nick.c_str()) != 0);
00594 }
00595 
00596 userrec* Server::FindNick(std::string nick)
00597 {
00598         return Find(nick);
00599 }
00600 
00601 userrec* Server::FindDescriptor(int socket)
00602 {
00603         return (socket < 65536 ? fd_ref_table[socket] : NULL);
00604 }
00605 
00606 chanrec* Server::FindChannel(std::string channel)
00607 {
00608         return FindChan(channel.c_str());
00609 }
00610 
00611 std::string Server::ChanMode(userrec* User, chanrec* Chan)
00612 {
00613         return cmode(User,Chan);
00614 }
00615 
00616 bool Server::IsOnChannel(userrec* User, chanrec* Chan)
00617 {
00618         return has_channel(User,Chan);
00619 }
00620 
00621 std::string Server::GetServerName()
00622 {
00623         return getservername();
00624 }
00625 
00626 std::string Server::GetNetworkName()
00627 {
00628         return getnetworkname();
00629 }
00630 
00631 Admin Server::GetAdmin()
00632 {
00633         return Admin(getadminname(),getadminemail(),getadminnick());
00634 }
00635 
00636 
00637 
00638 bool Server::AddExtendedMode(char modechar, int type, bool requires_oper, int params_when_on, int params_when_off)
00639 {
00640         if (((modechar >= 'A') && (modechar <= 'Z')) || ((modechar >= 'a') && (modechar <= 'z')))
00641         {
00642                 if (type == MT_SERVER)
00643                 {
00644                         log(DEBUG,"*** API ERROR *** Modes of type MT_SERVER are reserved for future expansion");
00645                         return false;
00646                 }
00647                 if (((params_when_on>0) || (params_when_off>0)) && (type == MT_CLIENT))
00648                 {
00649                         log(DEBUG,"*** API ERROR *** Parameters on MT_CLIENT modes are not supported");
00650                         return false;
00651                 }
00652                 if ((params_when_on>1) || (params_when_off>1))
00653                 {
00654                         log(DEBUG,"*** API ERROR *** More than one parameter for an MT_CHANNEL mode is not yet supported");
00655                         return false;
00656                 }
00657                 return DoAddExtendedMode(modechar,type,requires_oper,params_when_on,params_when_off);
00658         }
00659         else
00660         {
00661                 log(DEBUG,"*** API ERROR *** Muppet modechar detected.");
00662         }
00663         return false;
00664 }
00665 
00666 bool Server::AddExtendedListMode(char modechar)
00667 {
00668         bool res = DoAddExtendedMode(modechar,MT_CHANNEL,false,1,1);
00669         if (res)
00670                 ModeMakeList(modechar);
00671         return res;
00672 }
00673 
00674 int Server::CountUsers(chanrec* c)
00675 {
00676         return usercount(c);
00677 }
00678 
00679 
00680 bool Server::UserToPseudo(userrec* user,std::string message)
00681 {
00682         unsigned int old_fd = user->fd;
00683         user->fd = FD_MAGIC_NUMBER;
00684         user->ClearBuffer();
00685         Write(old_fd,"ERROR :Closing link (%s@%s) [%s]",user->ident,user->host,message.c_str());
00686 #ifdef USE_KQUEUE
00687         struct kevent ke;
00688         EV_SET(&ke, old_fd, EVFILT_READ, EV_DELETE, 0, 0, NULL);
00689         int i = kevent(kq, &ke, 1, 0, 0, NULL);
00690         if (i == -1)
00691         {
00692                 log(DEBUG,"kqueue: Failed to remove user from queue!");
00693         }
00694 #endif
00695         shutdown(old_fd,2);
00696         close(old_fd);
00697 }
00698 
00699 bool Server::PseudoToUser(userrec* alive,userrec* zombie,std::string message)
00700 {
00701         zombie->fd = alive->fd;
00702         alive->fd = FD_MAGIC_NUMBER;
00703         alive->ClearBuffer();
00704         Write(zombie->fd,":%s!%s@%s NICK %s",alive->nick,alive->ident,alive->host,zombie->nick);
00705         kill_link(alive,message.c_str());
00706         fd_ref_table[zombie->fd] = zombie;
00707         for (int i = 0; i != MAXCHANS; i++)
00708         {
00709                 if (zombie->chans[i].channel != NULL)
00710                 {
00711                         if (zombie->chans[i].channel->name)
00712                         {
00713                                 chanrec* Ptr = zombie->chans[i].channel;
00714                                 WriteFrom(zombie->fd,zombie,"JOIN %s",Ptr->name);
00715                                 if (Ptr->topicset)
00716                                 {
00717                                         WriteServ(zombie->fd,"332 %s %s :%s", zombie->nick, Ptr->name, Ptr->topic);
00718                                         WriteServ(zombie->fd,"333 %s %s %s %d", zombie->nick, Ptr->name, Ptr->setby, Ptr->topicset);
00719                                 }
00720                                 userlist(zombie,Ptr);
00721                                 WriteServ(zombie->fd,"366 %s %s :End of /NAMES list.", zombie->nick, Ptr->name);
00722 
00723                         }
00724                 }
00725         }
00726 
00727 }
00728 
00729 void Server::AddGLine(long duration, std::string source, std::string reason, std::string hostmask)
00730 {
00731         add_gline(duration, source.c_str(), reason.c_str(), hostmask.c_str());
00732 }
00733 
00734 void Server::AddQLine(long duration, std::string source, std::string reason, std::string nickname)
00735 {
00736         add_qline(duration, source.c_str(), reason.c_str(), nickname.c_str());
00737 }
00738 
00739 void Server::AddZLine(long duration, std::string source, std::string reason, std::string ipaddr)
00740 {
00741         add_zline(duration, source.c_str(), reason.c_str(), ipaddr.c_str());
00742 }
00743 
00744 void Server::AddKLine(long duration, std::string source, std::string reason, std::string hostmask)
00745 {
00746         add_kline(duration, source.c_str(), reason.c_str(), hostmask.c_str());
00747 }
00748 
00749 void Server::AddELine(long duration, std::string source, std::string reason, std::string hostmask)
00750 {
00751         add_eline(duration, source.c_str(), reason.c_str(), hostmask.c_str());
00752 }
00753 
00754 bool Server::DelGLine(std::string hostmask)
00755 {
00756         del_gline(hostmask.c_str());
00757 }
00758 
00759 bool Server::DelQLine(std::string nickname)
00760 {
00761         del_qline(nickname.c_str());
00762 }
00763 
00764 bool Server::DelZLine(std::string ipaddr)
00765 {
00766         del_zline(ipaddr.c_str());
00767 }
00768 
00769 bool Server::DelKLine(std::string hostmask)
00770 {
00771         del_kline(hostmask.c_str());
00772 }
00773 
00774 bool Server::DelELine(std::string hostmask)
00775 {
00776         del_eline(hostmask.c_str());
00777 }
00778 
00779 long Server::CalcDuration(std::string delta)
00780 {
00781         return duration(delta.c_str());
00782 }
00783 
00784 bool Server::IsValidMask(std::string mask)
00785 {
00786         const char* dest = mask.c_str();
00787         if (strchr(dest,'!')==0)
00788                 return false;
00789         if (strchr(dest,'@')==0)
00790                 return false;
00791         for (int i = 0; i < strlen(dest); i++)
00792                 if (dest[i] < 32)
00793                         return false;
00794         for (int i = 0; i < strlen(dest); i++)
00795                 if (dest[i] > 126)
00796                         return false;
00797         int c = 0;
00798         for (int i = 0; i < strlen(dest); i++)
00799                 if (dest[i] == '!')
00800                         c++;
00801         if (c>1)
00802                 return false;
00803         c = 0;
00804         for (int i = 0; i < strlen(dest); i++)
00805                 if (dest[i] == '@')
00806                         c++;
00807         if (c>1)
00808                 return false;
00809 
00810         return true;
00811 }
00812 
00813 void Server::MeshSendAll(std::string text)
00814 {
00815         NetSendToAll((char*)text.c_str());
00816 }
00817 
00818 void Server::MeshSendCommon(userrec* user, std::string text)
00819 {
00820         if (user)
00821                 NetSendToCommon(user,(char*)text.c_str());
00822 }
00823 
00824 void Server::MeshSendAllAlive(std::string text)
00825 {
00826         NetSendToAllAlive((char*)text.c_str());
00827 }
00828 
00829 void Server::MeshSendUnicast(std::string destination, std::string text)
00830 {
00831         NetSendToOne((char*)destination.c_str(),(char*)text.c_str());
00832 }
00833 
00834 void Server::MeshSendAllExcept(std::string target, std::string text)
00835 {
00836         NetSendToAllExcept(target.c_str(),(char*)text.c_str());
00837 }
00838 
00839 bool Server::MeshCheckChan(chanrec *c,std::string servername)
00840 {
00841         if (c)
00842         {
00843                 return ChanAnyOnThisServer(c,(char*)servername.c_str());
00844         }
00845         else return false;
00846 }
00847 
00848 bool Server::MeshCheckCommon(userrec* u,std::string servername)
00849 {
00850         if (u)
00851         {
00852                 return CommonOnThisServer(u,(char*)servername.c_str());
00853         }
00854         else return false;
00855 }
00856 
00857 Module* Server::FindModule(std::string name)
00858 {
00859         for (int i = 0; i <= MODCOUNT; i++)
00860         {
00861                 if (module_names[i] == name)
00862                 {
00863                         return modules[i];
00864                 }
00865         }
00866         return NULL;
00867 }
00868 
00869 ConfigReader::ConfigReader()
00870 {
00871         this->cache = new std::stringstream(std::stringstream::in | std::stringstream::out);
00872         this->errorlog = new std::stringstream(std::stringstream::in | std::stringstream::out);
00873         this->readerror = LoadConf(CONFIG_FILE,this->cache,this->errorlog);
00874         if (!this->readerror)
00875                 this->error = CONF_FILE_NOT_FOUND;
00876 }
00877 
00878 
00879 ConfigReader::~ConfigReader()
00880 {
00881         if (this->cache)
00882                 delete this->cache;
00883         if (this->errorlog)
00884                 delete this->errorlog;
00885 }
00886 
00887 
00888 ConfigReader::ConfigReader(std::string filename)
00889 {
00890         this->cache = new std::stringstream(std::stringstream::in | std::stringstream::out);
00891         this->errorlog = new std::stringstream(std::stringstream::in | std::stringstream::out);
00892         this->readerror = LoadConf(filename.c_str(),this->cache,this->errorlog);
00893         if (!this->readerror)
00894                 this->error = CONF_FILE_NOT_FOUND;
00895 };
00896 
00897 std::string ConfigReader::ReadValue(std::string tag, std::string name, int index)
00898 {
00899         char val[MAXBUF];
00900         char t[MAXBUF];
00901         char n[MAXBUF];
00902         strlcpy(t,tag.c_str(),MAXBUF);
00903         strlcpy(n,name.c_str(),MAXBUF);
00904         int res = ReadConf(cache,t,n,index,val);
00905         if (!res)
00906         {
00907                 this->error = CONF_VALUE_NOT_FOUND;
00908                 return "";
00909         }
00910         return val;
00911 }
00912 
00913 bool ConfigReader::ReadFlag(std::string tag, std::string name, int index)
00914 {
00915         char val[MAXBUF];
00916         char t[MAXBUF];
00917         char n[MAXBUF];
00918         strlcpy(t,tag.c_str(),MAXBUF);
00919         strlcpy(n,name.c_str(),MAXBUF);
00920         int res = ReadConf(cache,t,n,index,val);
00921         if (!res)
00922         {
00923                 this->error = CONF_VALUE_NOT_FOUND;
00924                 return false;
00925         }
00926         std::string s = val;
00927         return ((s == "yes") || (s == "YES") || (s == "true") || (s == "TRUE") || (s == "1"));
00928 }
00929 
00930 long ConfigReader::ReadInteger(std::string tag, std::string name, int index, bool needs_unsigned)
00931 {
00932         char val[MAXBUF];
00933         char t[MAXBUF];
00934         char n[MAXBUF];
00935         strlcpy(t,tag.c_str(),MAXBUF);
00936         strlcpy(n,name.c_str(),MAXBUF);
00937         int res = ReadConf(cache,t,n,index,val);
00938         if (!res)
00939         {
00940                 this->error = CONF_VALUE_NOT_FOUND;
00941                 return 0;
00942         }
00943         for (int i = 0; i < strlen(val); i++)
00944         {
00945                 if (!isdigit(val[i]))
00946                 {
00947                         this->error = CONF_NOT_A_NUMBER;
00948                         return 0;
00949                 }
00950         }
00951         if ((needs_unsigned) && (atoi(val)<0))
00952         {
00953                 this->error = CONF_NOT_UNSIGNED;
00954                 return 0;
00955         }
00956         return atoi(val);
00957 }
00958 
00959 long ConfigReader::GetError()
00960 {
00961         long olderr = this->error;
00962         this->error = 0;
00963         return olderr;
00964 }
00965 
00966 void ConfigReader::DumpErrors(bool bail, userrec* user)
00967 {
00968         if (bail)
00969         {
00970                 printf("There were errors in your configuration:\n%s",errorlog->str().c_str());
00971                 exit(0);
00972         }
00973         else
00974         {
00975                 char dataline[1024];
00976                 if (user)
00977                 {
00978                         WriteServ(user->fd,"NOTICE %s :There were errors in the configuration file:",user->nick);
00979                         while (!errorlog->eof())
00980                         {
00981                                 errorlog->getline(dataline,1024);
00982                                 WriteServ(user->fd,"NOTICE %s :%s",user->nick,dataline);
00983                         }
00984                 }
00985                 else
00986                 {
00987                         WriteOpers("There were errors in the configuration file:",user->nick);
00988                         while (!errorlog->eof())
00989                         {
00990                                 errorlog->getline(dataline,1024);
00991                                 WriteOpers(dataline);
00992                         }
00993                 }
00994                 return;
00995         }
00996 }
00997 
00998 
00999 int ConfigReader::Enumerate(std::string tag)
01000 {
01001         return EnumConf(cache,tag.c_str());
01002 }
01003 
01004 int ConfigReader::EnumerateValues(std::string tag, int index)
01005 {
01006         return EnumValues(cache, tag.c_str(), index);
01007 }
01008 
01009 bool ConfigReader::Verify()
01010 {
01011         return this->readerror;
01012 }
01013 
01014 
01015 FileReader::FileReader(std::string filename)
01016 {
01017         file_cache c;
01018         readfile(c,filename.c_str());
01019         this->fc = c;
01020 }
01021 
01022 FileReader::FileReader()
01023 {
01024 }
01025 
01026 void FileReader::LoadFile(std::string filename)
01027 {
01028         file_cache c;
01029         readfile(c,filename.c_str());
01030         this->fc = c;
01031 }
01032 
01033 
01034 FileReader::~FileReader()
01035 {
01036 }
01037 
01038 bool FileReader::Exists()
01039 {
01040         if (fc.size() == 0)
01041         {
01042                 return(false);
01043         }
01044         else
01045         {
01046                 return(true);
01047         }
01048 }
01049 
01050 std::string FileReader::GetLine(int x)
01051 {
01052         if ((x<0) || (x>fc.size()))
01053                 return "";
01054         return fc[x];
01055 }
01056 
01057 int FileReader::FileSize()
01058 {
01059         return fc.size();
01060 }
01061 
01062 
01063 std::vector<Module*> modules(255);
01064 std::vector<ircd_module*> factory(255);
01065 
01066 int MODCOUNT  = -1;
01067 
01068 

Generated on Thu May 12 02:25:12 2005 for InspIRCd by doxygen 1.3.3