summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrob rob@31f1291d-b8d6-0310-a050-a5561fc1590b <rob rob@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>2005-11-08 20:47:50 +0000
committerrob rob@31f1291d-b8d6-0310-a050-a5561fc1590b <rob rob@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>2005-11-08 20:47:50 +0000
commitfbf820b4e6e597502b71f6ada16e4e9b667d1030 (patch)
treeb8902a1b17d0281a3ef1446deb9afe9073474b0b
parent2cfdc0869594a6e4f69b103cd321e52f24ad98ab (diff)
Remove tmp modules from the runtime folder when we can. Currently we cant remove them if we segfaulted, pretty much every other instance is now dealt with.
git-svn-id: svn://svn.anope.org/anope/trunk@936 31f1291d-b8d6-0310-a050-a5561fc1590b git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@670 5417fbe8-f217-4b02-8779-1006273d7864
-rw-r--r--Changes1
-rw-r--r--include/extern.h2
-rw-r--r--src/main.c6
-rw-r--r--src/modules.c40
4 files changed, 28 insertions, 21 deletions
diff --git a/Changes b/Changes
index 2851cf591..3a237af5b 100644
--- a/Changes
+++ b/Changes
@@ -1,6 +1,7 @@
Anope Version S V N
--------------------
Provided by Anope Dev. <dev@anope.org> - 2005
+11/08 F Remove tmp modules from runtime folder when we can. [ #00]
11/02 F !protect/!deprotect no longer work for a number of ircds. [#403]
11/02 F segfault when os modloading a non-existing module. [ #00]
11/01 F /os reload - BSFantasyChar was not sstrduped if not defined. [ #00]
diff --git a/include/extern.h b/include/extern.h
index 11af90253..90c01744e 100644
--- a/include/extern.h
+++ b/include/extern.h
@@ -841,7 +841,7 @@ E void ntoa(struct in_addr addr, char *ipaddr, int len);
/**** modules.c ****/
E void modules_core_init(int number, char **list);
-E void modules_unload_all(void); /* Read warnings near function source */
+E void modules_unload_all(boolean fini); /* Read warnings near function source */
E void moduleCallBackRun(void);
E void moduleCleanStruct(ModuleData **moduleData);
diff --git a/src/main.c b/src/main.c
index 23167e0e9..e274e2504 100644
--- a/src/main.c
+++ b/src/main.c
@@ -223,6 +223,7 @@ static void services_restart(void)
#if defined(LINUX20) || defined(LINUX22)
pthread_kill_other_threads_np();
#endif
+ modules_unload_all(true);
execve(SERVICES_BIN, my_av, my_envp);
if (!readonly) {
open_log();
@@ -275,7 +276,7 @@ static void services_shutdown(void)
}
send_event(EVENT_SHUTDOWN, 1, EVENT_STOP);
disconn(servsock);
- modules_unload_all(); /* Only legitimate use of this function */
+ modules_unload_all(true); /* Only legitimate use of this function */
}
/*************************************************************************/
@@ -355,6 +356,7 @@ void sighandler(int signum)
inbuf[448] = 0;
}
wallops(NULL, "PANIC! buffer = %s\r\n", inbuf);
+ modules_unload_all(false);
} else if (waiting < 0) {
/* This is static on the off-chance we run low on stack */
static char buf[BUFSIZE];
@@ -412,6 +414,7 @@ void sighandler(int signum)
}
wallops(NULL, "PANIC! %s (%s)", buf, strsignal(signum));
alog("PANIC! %s (%s)", buf, strsignal(signum));
+ modules_unload_all(false);
}
}
@@ -433,6 +436,7 @@ void sighandler(int signum)
if (signum == SIGSEGV) {
do_backtrace(1);
+ modules_unload_all(false); /* probably cant do this, but might as well try, we have nothing left to loose */
}
/* Should we send the signum here as well? -GD */
send_event(EVENT_SIGNAL, 1, quitmsg);
diff --git a/src/modules.c b/src/modules.c
index 6825bb1db..8c37fb61c 100644
--- a/src/modules.c
+++ b/src/modules.c
@@ -207,36 +207,38 @@ void modules_delayed_init(void)
* And if that isn't enough discouragement, you'll wake up with your
* both legs broken tomorrow ;) -GD
*/
-void modules_unload_all(void)
+void modules_unload_all(boolean fini)
{
#ifdef USE_MODULES
int idx;
ModuleHash *mh, *next;
- void (*func) (void);
-
+ void (*func) (void);
+
for (idx = 0; idx < MAX_CMD_HASH; idx++) {
mh = MODULE_HASH[idx];
while (mh) {
next = mh->next;
-
- if (prepForUnload(mh->m) != MOD_ERR_OK) {
- mh = next;
+ if(fini) {
+ if (prepForUnload(mh->m) != MOD_ERR_OK) {
+ mh = next;
continue;
- }
+ }
- func = (void (*)(void))ano_modsym(mh->m->handle, "AnopeFini");
- if (func) {
- mod_current_module_name = mh->m->name;
- func(); /* exec AnopeFini */
- mod_current_module_name = NULL;
- }
-
- if ((ano_modclose(mh->m->handle)) != 0)
- alog(ano_moderr());
- else
- delModule(mh->m);
+ func = (void (*)(void))ano_modsym(mh->m->handle, "AnopeFini");
+ if (func) {
+ mod_current_module_name = mh->m->name;
+ func(); /* exec AnopeFini */
+ mod_current_module_name = NULL;
+ }
- mh = next;
+ if ((ano_modclose(mh->m->handle)) != 0)
+ alog(ano_moderr());
+ else
+ delModule(mh->m);
+ } else {
+ delModule(mh->m);
+ }
+ mh = next;
}
}
#endif