#include "modules.h"
#include "command_parse.h"
-extern SocketEngine* SE;
extern ServerConfig *Config;
extern InspIRCd* ServerInstance;
extern int MODCOUNT;
extern std::vector<Module*> modules;
extern std::vector<ircd_module*> factory;
extern std::vector<InspSocket*> module_sockets;
-
+extern std::vector<userrec*> local_users;
extern time_t TIME;
class Server;
-extern userrec* fd_ref_table[65536];
+extern userrec* fd_ref_table[MAX_DESCRIPTORS];
extern user_hash clientlist;
extern chan_hash chanlist;
extern command_table cmdlist;
ExtModeList EMode;
-Module* IOHookModule = NULL;
-
// returns true if an extended mode character is in use
bool ModeDefined(char modechar, int type)
{
char* Event::Send()
{
- FOREACH_MOD OnEvent(this);
+ FOREACH_MOD(I_OnEvent,OnEvent(this));
return NULL;
}
void Module::OnUnloadModule(Module* mod,std::string name) { };
void Module::OnBackgroundTimer(time_t curtime) { };
void Module::OnSendList(userrec* user, chanrec* channel, char mode) { };
-int Module::OnPreCommand(std::string command, char **parameters, int pcnt, userrec *user) { return 0; };
+int Module::OnPreCommand(std::string command, char **parameters, int pcnt, userrec *user, bool validated) { return 0; };
bool Module::OnCheckReady(userrec* user) { return true; };
void Module::OnUserRegister(userrec* user) { };
int Module::OnUserPreKick(userrec* source, userrec* user, chanrec* chan, std::string reason) { return 0; };
int Module::OnCheckKey(userrec* user, chanrec* chan, std::string keygiven) { return 0; };
int Module::OnCheckLimit(userrec* user, chanrec* chan) { return 0; };
int Module::OnCheckBan(userrec* user, chanrec* chan) { return 0; };
-void Module::OnStats(char symbol) { };
+int Module::OnStats(char symbol, userrec* user) { return 0; };
int Module::OnChangeLocalUserHost(userrec* user, std::string newhost) { return 0; };
int Module::OnChangeLocalUserGECOS(userrec* user, std::string newhost) { return 0; };
int Module::OnLocalTopicChange(userrec* user, chanrec* chan, std::string topic) { return 0; };
void Module::OnDelQLine(userrec* source, std::string nickmask) { };
void Module::OnDelELine(userrec* source, std::string hostmask) { };
void Module::OnCleanup(int target_type, void* item) { };
+void Module::Implements(char* Implements) { for (int j = 0; j < 255; j++) Implements[j] = 0; };
+Priority Module::Prioritize() { return PRIORITY_DONTCARE; }
/* server is a wrapper class that provides methods to all of the C-style
* exports in the core
module_sockets.push_back(sock);
}
+void Server::RemoveSocket(InspSocket* sock)
+{
+ for (std::vector<InspSocket*>::iterator a = module_sockets.begin(); a < module_sockets.end(); a++)
+ {
+ InspSocket* s = (InspSocket*)*a;
+ if (s == sock)
+ {
+ log(DEBUG,"Forcibly removed socket");
+ ServerInstance->SE->DelFd(s->GetFd());
+ s->Close();
+ module_sockets.erase(a);
+ delete s;
+ return;
+ }
+ }
+}
+
void Server::RehashServer()
{
WriteOpers("*** Rehashing config file");
{
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;
void Server::CallCommandHandler(std::string commandname, char** parameters, int pcnt, userrec* user)
{
- call_handler(commandname,parameters,pcnt,user);
+ ServerInstance->Parser->CallHandler(commandname,parameters,pcnt,user);
}
bool Server::IsValidModuleCommand(std::string commandname, int pcnt, userrec* user)
{
- return is_valid_cmd(commandname, pcnt, user);
+ return ServerInstance->Parser->IsValidCommand(commandname, pcnt, user);
}
void Server::Log(int level, std::string s)
log(level,"%s",s.c_str());
}
-void Server::AddCommand(char* cmd, handlerfunc f, char flags, int minparams, char* source)
+void Server::AddCommand(command_t *f)
{
- createcommand(cmd,f,flags,minparams,source);
+ ServerInstance->Parser->CreateCommand(f);
}
void Server::SendMode(char **parameters, int pcnt, userrec *user)
{
- server_mode(parameters,pcnt,user);
+ ServerInstance->ModeGrok->ServerMode(parameters,pcnt,user);
}
void Server::Send(int Socket, std::string s)
{
- Write(Socket,"%s",s.c_str());
+ Write_NoFormat(Socket,s.c_str());
}
void Server::SendServ(int Socket, std::string s)
{
- WriteServ(Socket,"%s",s.c_str());
+ WriteServ_NoFormat(Socket,s.c_str());
}
void Server::SendFrom(int Socket, userrec* User, std::string s)
{
- WriteFrom(Socket,User,"%s",s.c_str());
+ WriteFrom_NoFormat(Socket,User,s.c_str());
}
void Server::SendTo(userrec* Source, userrec* Dest, std::string s)
else
{
// otherwise it comes from the user specified
- WriteTo(Source,Dest,"%s",s.c_str());
+ WriteTo_NoFormat(Source,Dest,s.c_str());
}
}
void Server::SendChannelServerNotice(std::string ServName, chanrec* Channel, std::string text)
{
- WriteChannelWithServ((char*)ServName.c_str(), Channel, "%s", text.c_str());
+ WriteChannelWithServ_NoFormat((char*)ServName.c_str(), Channel, text.c_str());
}
void Server::SendChannel(userrec* User, chanrec* Channel, std::string s,bool IncludeSender)
{
if (IncludeSender)
{
- WriteChannel(Channel,User,"%s",s.c_str());
+ WriteChannel_NoFormat(Channel,User,s.c_str());
}
else
{
- ChanExceptSender(Channel,User,"%s",s.c_str());
+ ChanExceptSender_NoFormat(Channel,User,s.c_str());
}
}
{
if (IncludeSender)
{
- WriteCommon(User,"%s",text.c_str());
+ WriteCommon_NoFormat(User,text.c_str());
}
else
{
- WriteCommonExcept(User,"%s",text.c_str());
+ WriteCommonExcept_NoFormat(User,text.c_str());
}
}
bool Server::UserToPseudo(userrec* user,std::string message)
{
unsigned int old_fd = user->fd;
- user->fd = FD_MAGIC_NUMBER;
- user->ClearBuffer();
Write(old_fd,"ERROR :Closing link (%s@%s) [%s]",user->ident,user->host,message.c_str());
- SE->DelFd(old_fd);
+ user->FlushWriteBuf();
+ user->ClearBuffer();
+ user->fd = FD_MAGIC_NUMBER;
+
+ if (find(local_users.begin(),local_users.end(),user) != local_users.end())
+ {
+ local_users.erase(find(local_users.begin(),local_users.end(),user));
+ log(DEBUG,"Delete local user");
+ }
+
+ ServerInstance->SE->DelFd(old_fd);
shutdown(old_fd,2);
close(old_fd);
return true;
bool Server::PseudoToUser(userrec* alive,userrec* zombie,std::string message)
{
+ log(DEBUG,"PseudoToUser");
zombie->fd = alive->fd;
+ FOREACH_MOD(I_OnUserQuit,OnUserQuit(alive,message));
alive->fd = FD_MAGIC_NUMBER;
+ alive->FlushWriteBuf();
alive->ClearBuffer();
Write(zombie->fd,":%s!%s@%s NICK %s",alive->nick,alive->ident,alive->host,zombie->nick);
kill_link(alive,message.c_str());
+
+ if (find(local_users.begin(),local_users.end(),alive) != local_users.end())
+ {
+ local_users.erase(find(local_users.begin(),local_users.end(),alive));
+ log(DEBUG,"Delete local user");
+ }
+
fd_ref_table[zombie->fd] = zombie;
for (unsigned int i = 0; i < zombie->chans.size(); i++)
{
}
}
}
+ if ((find(local_users.begin(),local_users.end(),zombie) == local_users.end()) && (zombie->fd != FD_MAGIC_NUMBER))
+ local_users.push_back(zombie);
+
return true;
}