summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/command_parse.h5
-rw-r--r--include/exitcodes.h3
-rw-r--r--src/command_parse.cpp24
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);