]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/command_parse.cpp
* Fixed bug in m_banredirect where removing a ban on a channel with maxbans set would...
[user/henk/code/inspircd.git] / src / command_parse.cpp
index a3b5b41c7336bb82aba6362f7d0351788ffbefcf..b333084e75ab47a438ff908165d9e69553ee2d48 100644 (file)
@@ -325,6 +325,8 @@ void CommandParser::ProcessCommand(userrec *user, std::string &cmd)
                        {
                                /* command is disabled! */
                                user->WriteServ("421 %s %s :This command has been disabled.",user->nick,command.c_str());
+                               ServerInstance->SNO->WriteToSnoMask('d', "%s denied for %s (%s@%s)",
+                                               command.c_str(), user->nick, user->ident, user->host);
                                return;
                        }
                        if (items < cm->second->min_params)
@@ -445,7 +447,6 @@ bool CommandParser::CreateCommand(command_t *f, void* so_handle)
 CommandParser::CommandParser(InspIRCd* Instance) : ServerInstance(Instance)
 {
        para.resize(128);
-       this->SetupCommandTable();
 }
 
 bool CommandParser::FindSym(void** v, void* h)
@@ -489,7 +490,11 @@ bool CommandParser::ReloadCommand(const char* cmd, userrec* user)
                snprintf(filename, MAXBUF, "cmd_%s.so", commandname);
                const char* err = this->LoadCommand(filename);
                if (err)
-                       user->WriteServ("NOTICE %s :*** Error loading 'cmd_%s.so': %s", user->nick, cmd, err);
+               {
+                       if (user)
+                               user->WriteServ("NOTICE %s :*** Error loading 'cmd_%s.so': %s", user->nick, cmd, err);
+                       return false;
+               }
 
                return true;
        }
@@ -508,7 +513,7 @@ CmdResult cmd_reload::Handle(const char** parameters, int pcnt, userrec *user)
        }
        else
        {
-               user->WriteServ("NOTICE %s :*** Could not reload command '%s'", user->nick, parameters[0]);
+               user->WriteServ("NOTICE %s :*** Could not reload command '%s' -- fix this problem, then /REHASH as soon as possible!", user->nick, parameters[0]);
                return CMD_FAILURE;
        }
 }
@@ -519,6 +524,13 @@ const char* CommandParser::LoadCommand(const char* name)
        void* h;
        command_t* (*cmd_factory_func)(InspIRCd*);
 
+       /* Command already exists? Succeed silently - this is needed for REHASH */
+       if (RFCCommands.find(name) != RFCCommands.end())
+       {
+               ServerInstance->Log(DEBUG,"Not reloading command %s/%s, it already exists", LIBRARYDIR, name);
+               return NULL;
+       }
+
        snprintf(filename, MAXBUF, "%s/%s", LIBRARYDIR, name);
        h = dlopen(filename, RTLD_NOW | RTLD_GLOBAL);
 
@@ -537,12 +549,15 @@ const char* CommandParser::LoadCommand(const char* name)
        return NULL;
 }
 
-void CommandParser::SetupCommandTable()
+void CommandParser::SetupCommandTable(userrec* user)
 {
        RFCCommands.clear();
 
-       printf("\nLoading core commands");
-       fflush(stdout);
+       if (!user)
+       {
+               printf("\nLoading core commands");
+               fflush(stdout);
+       }
 
        DIR* library = opendir(LIBRARYDIR);
        if (library)
@@ -552,20 +567,32 @@ void CommandParser::SetupCommandTable()
                {
                        if (match(entry->d_name, "cmd_*.so"))
                        {
-                               printf(".");
-                               fflush(stdout);
+                               if (!user)
+                               {
+                                       printf(".");
+                                       fflush(stdout);
+                               }
                                const char* err = this->LoadCommand(entry->d_name);
                                if (err)
                                {
-                                       printf("Error loading %s: %s", entry->d_name, err);
-                                       exit(EXIT_STATUS_BADHANDLER);
+                                       if (user)
+                                       {
+                                               user->WriteServ("NOTICE %s :*** Failed to load core command %s: %s", user->nick, entry->d_name, err);
+                                       }
+                                       else
+                                       {
+                                               printf("Error loading %s: %s", entry->d_name, err);
+                                               exit(EXIT_STATUS_BADHANDLER);
+                                       }
                                }
                        }
                }
                closedir(library);
-               printf("\n");
+               if (!user)
+                       printf("\n");
        }
 
-       this->CreateCommand(new cmd_reload(ServerInstance));
+       if (cmdlist.find("RELOAD") == cmdlist.end())
+               this->CreateCommand(new cmd_reload(ServerInstance));
 }