From 9a7ef6a1c617309f778a335f48c0100b1907bc45 Mon Sep 17 00:00:00 2001 From: kcwu Date: Mon, 29 Aug 2005 08:43:40 +0000 Subject: log crash events in signal handler. git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@3114 63ad8ddf-47c3-0310-b6dd-a9e9d9715204 --- mbbsd/mbbsd.c | 58 ++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 42 insertions(+), 16 deletions(-) (limited to 'mbbsd') 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); } -- cgit v1.2.3