summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkcwu <kcwu@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2005-08-29 16:43:40 +0800
committerkcwu <kcwu@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2005-08-29 16:43:40 +0800
commit9a7ef6a1c617309f778a335f48c0100b1907bc45 (patch)
tree770188514a3a5575dcdfb610100ccb8040d722b7
parentabee8287194afc9a5c95b56c2ca21d5ebbab8cc2 (diff)
downloadpttbbs-9a7ef6a1c617309f778a335f48c0100b1907bc45.tar
pttbbs-9a7ef6a1c617309f778a335f48c0100b1907bc45.tar.gz
pttbbs-9a7ef6a1c617309f778a335f48c0100b1907bc45.tar.bz2
pttbbs-9a7ef6a1c617309f778a335f48c0100b1907bc45.tar.lz
pttbbs-9a7ef6a1c617309f778a335f48c0100b1907bc45.tar.xz
pttbbs-9a7ef6a1c617309f778a335f48c0100b1907bc45.tar.zst
pttbbs-9a7ef6a1c617309f778a335f48c0100b1907bc45.zip
log crash events in signal handler.
git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@3114 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
-rw-r--r--mbbsd/mbbsd.c58
1 files changed, 42 insertions, 16 deletions
diff --git a/mbbsd/mbbsd.c b/mbbsd/mbbsd.c
index 1e029394..30ba77ac 100644
--- a/mbbsd/mbbsd.c
+++ b/mbbsd/mbbsd.c
@@ -203,12 +203,13 @@ abort_bbs(int sig)
static void abort_bbs_debug(int sig) GCC_NORETURN;
#endif
+/* NOTE: It's better to use signal-safe functions. Avoid to call
+ * functions with global/static variable -- data may be corrupted */
static void
abort_bbs_debug(int sig)
{
-#ifdef DEBUGSLEEP
- static int reentrant = 0;
-#endif
+ int i;
+ sigset_t sigset;
switch(sig) {
case SIGINT: STATINC(STAT_SIGINT); break;
@@ -219,24 +220,49 @@ abort_bbs_debug(int sig)
case SIGBUS: STATINC(STAT_SIGBUS); break;
case SIGSEGV: STATINC(STAT_SIGSEGV); break;
}
+ /* ignore normal signals */
+ Signal(SIGALRM, SIG_IGN);
+ Signal(SIGUSR1, SIG_IGN);
+ Signal(SIGUSR2, SIG_IGN);
+ Signal(SIGHUP, SIG_IGN);
+ Signal(SIGTERM, SIG_IGN);
+ Signal(SIGPIPE, SIG_IGN);
+
+ /* unblock */
+ sigemptyset(&sigset);
+ sigaddset(&sigset, SIGINT);
+ sigaddset(&sigset, SIGQUIT);
+ sigaddset(&sigset, SIGILL);
+ sigaddset(&sigset, SIGABRT);
+ sigaddset(&sigset, SIGFPE);
+ sigaddset(&sigset, SIGBUS);
+ sigaddset(&sigset, SIGSEGV);
+ sigprocmask(SIG_UNBLOCK, &sigset, NULL);
+
#define CRASH_MSG ANSI_COLOR(0) "\r\n程式異常, 立刻斷線. 請洽 PttBug 板詳述你發生的問題.\n"
- /* NOTE: It's better to use signal-safe functions. Avoid to call
- * functions with global/static variable -- data may be corrupted */
write(1, CRASH_MSG, sizeof(CRASH_MSG));
+
+ /* close all file descriptors (including the network connection) */
+ for (i = 0; i < 256; ++i)
+ close(i);
+
+ /* log */
+ /* assume vsnprintf() in log_file() is signal-safe, is it? */
+ log_file("log/crash.log", LOG_VF|LOG_CREAT, "%ld %d\n", time4(NULL), getpid());
+
+ /* try logout... not a good idea, maybe crash again. now disabled */
+ /*
+ if (currmode) {
+ currmode = 0;
+ u_exit("AXXED");
+ }
+ */
+
#ifdef DEBUGSLEEP
- if (!reentrant) {
- int i;
- reentrant = 1;
- /* close all file descriptors (including the network connection) */
- for (i = 0; i < 256; ++i)
- close(i);
- if (currmode)
- u_exit("AXXED");
#ifndef VALGRIND
- setproctitle("debug me!(%d)(%s,%d)", sig, cuser.userid, currstat);
+ setproctitle("debug me!(%d)(%s,%d)", sig, cuser.userid, currstat);
#endif
- sleep(3600); /* wait 60 mins for debug */
- }
+ sleep(3600); /* wait 60 mins for debug */
#endif
exit(0);
}