Fix bug #180 - Crash after signal SIGHUP.

This commit is contained in:
Jan Vidar Krey 2012-01-19 02:58:20 +01:00
parent a9b5c6db38
commit 8607b40278
3 changed files with 32 additions and 7 deletions

View File

@ -20,7 +20,8 @@
#include "uhub.h"
#ifdef DEBUG
#define CRASH_DEBUG
// #define CRASH_DEBUG
// #define DEBUG_UNLOAD_PLUGINS
#endif
#define MAX_HELP_MSG 16384
@ -584,6 +585,23 @@ static int command_reload(struct command_base* cbase, struct hub_user* user, str
return command_status(cbase, user, cmd, cbuf_create_const("Reloading configuration..."));
}
#ifdef DEBUG_UNLOAD_PLUGINS
int hub_plugins_load(struct hub_info* hub);
int hub_plugins_unload(struct hub_info* hub);
static int command_load(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
{
hub_plugins_load(cbase->hub);
return command_status(cbase, user, cmd, cbuf_create_const("Loading plugins..."));
}
static int command_unload(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
{
hub_plugins_unload(cbase->hub);
return command_status(cbase, user, cmd, cbuf_create_const("Unloading plugins..."));
}
#endif /* DEBUG_UNLOAD_PLUGINS */
static int command_shutdown_hub(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
{
cbase->hub->status = hub_status_shutdown;
@ -918,7 +936,7 @@ void commands_builtin_add(struct command_base* cbase)
ADD_COMMAND("register", 8, "p", auth_cred_guest, command_register, "Register your username." );
ADD_COMMAND("reload", 6, "", auth_cred_admin, command_reload, "Reload configuration files." );
ADD_COMMAND("password", 8, "p", auth_cred_user, command_password, "Change your own password." );
ADD_COMMAND("shutdown", 8, "", auth_cred_admin, command_shutdown_hub, "Shutdown hub." );
ADD_COMMAND("shutdown", 8, "", auth_cred_admin, command_shutdown_hub, "Shutdown hub." );
ADD_COMMAND("stats", 5, "", auth_cred_super, command_stats, "Show hub statistics." );
ADD_COMMAND("unban", 5, "n", auth_cred_operator, command_unban, "Lift ban on a user" );
ADD_COMMAND("unmute", 6, "n", auth_cred_operator, command_mute, "Unmute user" );
@ -930,6 +948,11 @@ void commands_builtin_add(struct command_base* cbase)
ADD_COMMAND("userpass", 8, "np",auth_cred_operator, command_userpass, "Change password for a user." );
ADD_COMMAND("version", 7, "", auth_cred_guest, command_version, "Show hub version info." );
ADD_COMMAND("whoip", 5, "a", auth_cred_operator, command_whoip, "Show users matching IP range" );
#ifdef DEBUG_UNLOAD_PLUGINS
ADD_COMMAND("load", 4, "", auth_cred_admin, command_load, "Load plugins." );
ADD_COMMAND("unload", 6, "", auth_cred_admin, command_unload, "Unload plugins." );
#endif /* DEBUG_UNLOAD_PLUGINS */
}
void commands_builtin_remove(struct command_base* cbase)

View File

@ -127,9 +127,10 @@ static int cbfunc_command_add(struct plugin_handle* plugin, struct plugin_comman
command->origin = cmdh->origin;
command->handler = plugin_command_dispatch;
cmdh->internal_handle = data;
cmdh->internal_handle = command;
list_append(data->commands, cmdh);
command_add(plugin_get_hub(plugin)->commands, command, (void*) plugin);
printf("*** Add plugin command: %s (%p, %p)\n", command->prefix, command, cmdh);
return 0;
}
@ -138,11 +139,11 @@ static int cbfunc_command_del(struct plugin_handle* plugin, struct plugin_comman
struct plugin_callback_data* data = get_callback_data(plugin);
struct command_handle* command = (struct command_handle*) cmdh->internal_handle;
printf("*** Del plugin command: %s (%p, %p)\n", command->prefix, command, cmdh);
list_remove(data->commands, cmdh);
cmdh->internal_handle = 0;
command_del(plugin_get_hub(plugin)->commands, (void*) command);
command_del(plugin_get_hub(plugin)->commands, command);
hub_free(command);
cmdh->internal_handle = NULL;
return 0;
}

View File

@ -78,6 +78,7 @@ void plugin_close(struct uhub_plugin* plugin)
LOG_PLUGIN("plugin_close: \"%s\"", plugin->filename);
plugin_callback_data_destroy(internals->callback_data);
hub_free(internals);
plugin->internals = NULL;
#ifdef HAVE_DLOPEN
dlclose(plugin->handle);