X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fcommand_parse.cpp;h=ab935559d9be0374bc972ad0e9a017eae8ff45ba;hb=234c7cd851229d94eb8c26a8a68ca6967f20aff8;hp=f013e0cd5a052f35d9c12be6b0384416fcccdf45;hpb=0ff8bc01c2c467b16a3b6ac35bfa67b64cb2f45a;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/command_parse.cpp b/src/command_parse.cpp index f013e0cd5..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) @@ -224,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()) { @@ -245,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; @@ -256,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()) { @@ -289,6 +293,14 @@ void CommandParser::ProcessCommand(userrec *user, std::string &cmd) 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 (tokens.GetToken(para[items]) && (items < 127)) { command_p[items] = para[items].c_str(); @@ -303,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()) { @@ -315,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()); @@ -375,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; @@ -393,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)) @@ -418,7 +430,7 @@ void CommandParser::ProcessBuffer(std::string &buffer,userrec *user) { if (!user->muted) { - ServerInstance->Log(DEBUG,"-> :%s %s",user->nick,buffer.c_str()); + ServerInstance->Log(DEBUG,"C[%d] -> :%s %s",user->GetFd(), user->nick, buffer.c_str()); this->ProcessCommand(user,buffer); } } @@ -456,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; @@ -541,6 +553,9 @@ void CommandParser::SetupCommandTable() { RFCCommands.clear(); + printf("\nLoading core commands"); + fflush(stdout); + DIR* library = opendir(LIBRARYDIR); if (library) { @@ -549,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));