X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fcommand_parse.cpp;h=ab935559d9be0374bc972ad0e9a017eae8ff45ba;hb=234c7cd851229d94eb8c26a8a68ca6967f20aff8;hp=f842ee49e1f81f7bccfacddb5c7d680564b3465f;hpb=9206364b1c35c7eb616ade4354808392683e15e0;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/command_parse.cpp b/src/command_parse.cpp index f842ee49e..ab935559d 100644 --- a/src/command_parse.cpp +++ b/src/command_parse.cpp @@ -14,8 +14,6 @@ #include "inspircd.h" #include "configreader.h" #include -#include -#include #include "users.h" #include "modules.h" #include "wildcard.h" @@ -24,6 +22,12 @@ #include "socket.h" #include "command_parse.h" +/* Directory Searching for Unix-Only */ +#ifndef WIN32 +#include +#include +#endif + bool InspIRCd::ULine(const char* server) { if (!server) @@ -31,22 +35,33 @@ bool InspIRCd::ULine(const char* server) if (!*server) return true; - return (find(Config->ulines.begin(),Config->ulines.end(),server) != Config->ulines.end()); + return (Config->ulines.find(server) != Config->ulines.end()); +} + +bool InspIRCd::SilentULine(const char* server) +{ + std::map::iterator n = Config->ulines.find(server); + if (n != Config->ulines.end()) + return n->second; + else return false; } int InspIRCd::OperPassCompare(const char* data,const char* input, int tagnumber) { int MOD_RESULT = 0; FOREACH_RESULT_I(this,I_OnOperCompare,OnOperCompare(data, input, tagnumber)) - Log(DEBUG,"OperPassCompare: %d",MOD_RESULT); if (MOD_RESULT == 1) return 0; if (MOD_RESULT == -1) return 1; - Log(DEBUG,"strcmp fallback: '%s' '%s' %d",data,input,strcmp(data,input)); return strcmp(data,input); } +std::string InspIRCd::TimeString(time_t curtime) +{ + return std::string(ctime(&curtime),24); +} + long InspIRCd::Duration(const char* str) { char n_field[MAXBUF]; @@ -155,8 +170,7 @@ int CommandParser::LoopCall(userrec* user, command_t* CommandObj, const char** p new_parameters[splithere] = item.c_str(); new_parameters[extra] = extrastuff.c_str(); - if (CommandObj->Handle(new_parameters,pcnt,user) == CMD_USER_DELETED) - return 1; + CommandObj->Handle(new_parameters,pcnt,user); dupes[item.c_str()] = true; } @@ -175,7 +189,6 @@ int CommandParser::LoopCall(userrec* user, command_t* CommandObj, const char** p std::map dupes; /* Only one commasepstream here */ - ServerInstance->Log(DEBUG,"Splitting '%s'",parameters[splithere]); irc::commasepstream items1(parameters[splithere]); std::string item = "*"; unsigned int max = 0; @@ -201,8 +214,7 @@ int CommandParser::LoopCall(userrec* user, command_t* CommandObj, const char** p * record out from under us (e.g. if we /kill a comma sep list, and we're * in that list ourselves) abort if we're gone. */ - if (CommandObj->Handle(new_parameters,pcnt,user) == CMD_USER_DELETED) - return 1; + CommandObj->Handle(new_parameters,pcnt,user); dupes[item.c_str()] = true; } @@ -216,7 +228,7 @@ int CommandParser::LoopCall(userrec* user, command_t* CommandObj, const char** p bool CommandParser::IsValidCommand(const std::string &commandname, int pcnt, userrec * user) { - nspace::hash_map::iterator n = cmdlist.find(commandname); + command_table::iterator n = cmdlist.find(commandname); if (n != cmdlist.end()) { @@ -237,7 +249,7 @@ bool CommandParser::IsValidCommand(const std::string &commandname, int pcnt, use command_t* CommandParser::GetHandler(const std::string &commandname) { - nspace::hash_map::iterator n = cmdlist.find(commandname); + command_table::iterator n = cmdlist.find(commandname); if (n != cmdlist.end()) return n->second; @@ -248,7 +260,7 @@ command_t* CommandParser::GetHandler(const std::string &commandname) CmdResult CommandParser::CallHandler(const std::string &commandname,const char** parameters, int pcnt, userrec *user) { - nspace::hash_map::iterator n = cmdlist.find(commandname); + command_table::iterator n = cmdlist.find(commandname); if (n != cmdlist.end()) { @@ -278,9 +290,18 @@ void CommandParser::ProcessCommand(userrec *user, std::string &cmd) const char *command_p[127]; int items = 0; irc::tokenstream tokens(cmd); - std::string command = tokens.GetToken(); + std::string command; + tokens.GetToken(command); + + /* A client sent a nick prefix on their command (ick) + * rhapsody and some braindead bouncers do this -- + * the rfc says they shouldnt but also says the ircd should + * discard it if they do. + */ + if (*command.c_str() == ':') + tokens.GetToken(command); - while (((para[items] = tokens.GetToken()) != "") && (items < 127)) + while (tokens.GetToken(para[items]) && (items < 127)) { command_p[items] = para[items].c_str(); items++; @@ -294,7 +315,7 @@ void CommandParser::ProcessCommand(userrec *user, std::string &cmd) return; } - nspace::hash_map::iterator cm = cmdlist.find(command); + command_table::iterator cm = cmdlist.find(command); if (cm != cmdlist.end()) { @@ -306,16 +327,16 @@ void CommandParser::ProcessCommand(userrec *user, std::string &cmd) { if (!user->IsModeSet(cm->second->flags_needed)) { - user->WriteServ("481 %s :Permission Denied- You do not have the required operator privileges",user->nick); + user->WriteServ("481 %s :Permission Denied - You do not have the required operator privileges",user->nick); return; } if (!user->HasPermission(command)) { - user->WriteServ("481 %s :Permission Denied- Oper type %s does not have access to command %s",user->nick,user->oper,command.c_str()); + user->WriteServ("481 %s :Permission Denied - Oper type %s does not have access to command %s",user->nick,user->oper,command.c_str()); return; } } - if ((user->registered == REG_ALL) && (!*user->oper) && (cm->second->IsDisabled())) + if ((user->registered == REG_ALL) && (!IS_OPER(user)) && (cm->second->IsDisabled())) { /* command is disabled! */ user->WriteServ("421 %s %s :This command has been disabled.",user->nick,command.c_str()); @@ -325,7 +346,7 @@ void CommandParser::ProcessCommand(userrec *user, std::string &cmd) { user->WriteServ("461 %s %s :Not enough parameters.", user->nick, command.c_str()); /* If syntax is given, display this as the 461 reply */ - if ((ServerInstance->Config->SyntaxHints) && (cm->second->syntax.length())) + if ((ServerInstance->Config->SyntaxHints) && (user->registered == REG_ALL) && (cm->second->syntax.length())) user->WriteServ("304 %s :SYNTAX %s %s", user->nick, cm->second->command.c_str(), cm->second->syntax.c_str()); return; } @@ -347,10 +368,7 @@ void CommandParser::ProcessCommand(userrec *user, std::string &cmd) */ CmdResult result = cm->second->Handle(command_p,items,user); - if (result != CMD_USER_DELETED) - { - FOREACH_MOD(I_OnPostCommand,OnPostCommand(command, command_p, items, user, result,cmd)); - } + FOREACH_MOD(I_OnPostCommand,OnPostCommand(command, command_p, items, user, result,cmd)); return; } else @@ -369,7 +387,7 @@ void CommandParser::ProcessCommand(userrec *user, std::string &cmd) bool CommandParser::RemoveCommands(const char* source) { - nspace::hash_map::iterator i,safei; + command_table::iterator i,safei; for (i = cmdlist.begin(); i != cmdlist.end(); i++) { safei = i; @@ -387,7 +405,7 @@ bool CommandParser::RemoveCommands(const char* source) return true; } -void CommandParser::RemoveCommand(nspace::hash_map::iterator safei, const char* source) +void CommandParser::RemoveCommand(command_table::iterator safei, const char* source) { command_t* x = safei->second; if (x->source == std::string(source)) @@ -410,8 +428,11 @@ void CommandParser::ProcessBuffer(std::string &buffer,userrec *user) if (buffer.length()) { - ServerInstance->Log(DEBUG,"CMDIN: %s %s",user->nick,buffer.c_str()); - this->ProcessCommand(user,buffer); + if (!user->muted) + { + ServerInstance->Log(DEBUG,"C[%d] -> :%s %s",user->GetFd(), user->nick, buffer.c_str()); + this->ProcessCommand(user,buffer); + } } } @@ -420,10 +441,7 @@ bool CommandParser::CreateCommand(command_t *f, void* so_handle) if (so_handle) { if (RFCCommands.find(f->command) == RFCCommands.end()) - { RFCCommands[f->command] = so_handle; - ServerInstance->Log(DEBUG,"Monitoring RFC-specified reloadable command at %8x",so_handle); - } else { ServerInstance->Log(DEFAULT,"ERK! Somehow, we loaded a cmd_*.so file twice! Only the first instance is being recorded."); @@ -435,7 +453,6 @@ bool CommandParser::CreateCommand(command_t *f, void* so_handle) if (cmdlist.find(f->command) == cmdlist.end()) { cmdlist[f->command] = f; - ServerInstance->Log(DEBUG,"Added command %s (%d parameters)", f->command.c_str(), f->min_params); return true; } else return false; @@ -451,7 +468,7 @@ bool CommandParser::FindSym(void** v, void* h) { *v = dlsym(h, "init_command"); const char* err = dlerror(); - if (err) + if (err && !(*v)) { ServerInstance->Log(SPARSE, "Error loading core command: %s\n", err); return false; @@ -517,8 +534,6 @@ void CommandParser::LoadCommand(const char* name) command_t* (*cmd_factory_func)(InspIRCd*); snprintf(filename, MAXBUF, "%s/%s", LIBRARYDIR, name); - ServerInstance->Log(DEBUG,"Load command: %s", filename); - h = dlopen(filename, RTLD_NOW | RTLD_GLOBAL); if (!h) @@ -538,6 +553,9 @@ void CommandParser::SetupCommandTable() { RFCCommands.clear(); + printf("\nLoading core commands"); + fflush(stdout); + DIR* library = opendir(LIBRARYDIR); if (library) { @@ -546,10 +564,13 @@ void CommandParser::SetupCommandTable() { if (match(entry->d_name, "cmd_*.so")) { + printf("."); + fflush(stdout); this->LoadCommand(entry->d_name); } } closedir(library); + printf("\n"); } this->CreateCommand(new cmd_reload(ServerInstance));