]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/command_parse.cpp
Pick up a few error conditions we didnt before in the config reader, and also increme...
[user/henk/code/inspircd.git] / src / command_parse.cpp
index 6be50dd9691878b808b0e69b841376da8bfb19a0..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)
@@ -512,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;
        }
 }
@@ -523,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);
 
@@ -541,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)
@@ -556,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));
 }