From 8683e1c80d9d37ee7ffae54c0d888195a5e8d1a7 Mon Sep 17 00:00:00 2001 From: brain Date: Sat, 11 Aug 2007 11:29:15 +0000 Subject: Provide error output on failure to load a core command; to console on startup, and to user on /reload git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@7708 e03df62e-2008-0410-955e-edbf42e46eb7 --- include/command_parse.h | 5 +++-- include/exitcodes.h | 3 ++- src/command_parse.cpp | 24 +++++++++++++++++------- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/include/command_parse.h b/include/command_parse.h index e8240fcf9..58f63a802 100644 --- a/include/command_parse.h +++ b/include/command_parse.h @@ -73,8 +73,9 @@ class CoreExport CommandParser : public classbase /** Load a command from a shared object on disk. * @param name The shared object to load (without path) + * @return NULL on success, pointer to dlerrr() error message on failure */ - void LoadCommand(const char* name); + const char* LoadCommand(const char* name); /** Removes a command if the sources match. Used as a helper for * safe hash_map delete while iter in RemoveCommands(const char* source). @@ -95,7 +96,7 @@ class CoreExport CommandParser : public classbase * @return True if the command was reloaded, false if it could not be found * or another error occured */ - bool ReloadCommand(const char* cmd); + bool ReloadCommand(const char* cmd, userrec* user); /** Default constructor. * @param Instance The creator of this class diff --git a/include/exitcodes.h b/include/exitcodes.h index d68301984..e0babb92b 100644 --- a/include/exitcodes.h +++ b/include/exitcodes.h @@ -33,7 +33,8 @@ enum ExitStatus EXIT_STATUS_DIETAG = 12, /* Found a die tag in the config file */ EXIT_STATUS_MODULE = 13, /* Couldn't load a required module */ EXIT_STATUS_CREATEPROCESS = 14, /* CreateProcess failed (windows) */ - EXIT_STATUS_SIGTERM = 15 /* Note: dont move this value. It corresponds with the value of #define SIGTERM. */ + EXIT_STATUS_SIGTERM = 15, /* Note: dont move this value. It corresponds with the value of #define SIGTERM. */ + EXIT_STATUS_BADHANDLER = 16 /* Bad command handler loaded */ }; /** Array that maps exit codes (ExitStatus types) to diff --git a/src/command_parse.cpp b/src/command_parse.cpp index 84850a880..a3b5b41c7 100644 --- a/src/command_parse.cpp +++ b/src/command_parse.cpp @@ -21,6 +21,7 @@ #include "socketengine.h" #include "socket.h" #include "command_parse.h" +#include "exitcodes.h" /* Directory Searching for Unix-Only */ #ifndef WIN32 @@ -459,7 +460,7 @@ bool CommandParser::FindSym(void** v, void* h) return true; } -bool CommandParser::ReloadCommand(const char* cmd) +bool CommandParser::ReloadCommand(const char* cmd, userrec* user) { char filename[MAXBUF]; char commandname[MAXBUF]; @@ -486,7 +487,9 @@ bool CommandParser::ReloadCommand(const char* cmd) RFCCommands.erase(command); snprintf(filename, MAXBUF, "cmd_%s.so", commandname); - this->LoadCommand(filename); + const char* err = this->LoadCommand(filename); + if (err) + user->WriteServ("NOTICE %s :*** Error loading 'cmd_%s.so': %s", user->nick, cmd, err); return true; } @@ -497,7 +500,7 @@ bool CommandParser::ReloadCommand(const char* cmd) CmdResult cmd_reload::Handle(const char** parameters, int pcnt, userrec *user) { user->WriteServ("NOTICE %s :*** Reloading command '%s'",user->nick, parameters[0]); - if (ServerInstance->Parser->ReloadCommand(parameters[0])) + if (ServerInstance->Parser->ReloadCommand(parameters[0], user)) { user->WriteServ("NOTICE %s :*** Successfully reloaded command '%s'", user->nick, parameters[0]); ServerInstance->WriteOpers("*** RELOAD: %s reloaded the '%s' command.", user->nick, parameters[0]); @@ -510,7 +513,7 @@ CmdResult cmd_reload::Handle(const char** parameters, int pcnt, userrec *user) } } -void CommandParser::LoadCommand(const char* name) +const char* CommandParser::LoadCommand(const char* name) { char filename[MAXBUF]; void* h; @@ -521,8 +524,9 @@ void CommandParser::LoadCommand(const char* name) if (!h) { - ServerInstance->Log(SPARSE, "Error loading core command: %s", dlerror()); - return; + const char* n = dlerror(); + ServerInstance->Log(SPARSE, "Error loading core command: %s", n); + return n; } if (this->FindSym((void **)&cmd_factory_func, h)) @@ -530,6 +534,7 @@ void CommandParser::LoadCommand(const char* name) command_t* newcommand = cmd_factory_func(ServerInstance); this->CreateCommand(newcommand, h); } + return NULL; } void CommandParser::SetupCommandTable() @@ -549,7 +554,12 @@ void CommandParser::SetupCommandTable() { printf("."); fflush(stdout); - this->LoadCommand(entry->d_name); + const char* err = this->LoadCommand(entry->d_name); + if (err) + { + printf("Error loading %s: %s", entry->d_name, err); + exit(EXIT_STATUS_BADHANDLER); + } } } closedir(library); -- cgit v1.2.3