1996-05-04 11:50:46 +04:00
/*
2002-01-30 09:08:46 +03:00
Unix SMB / CIFS implementation .
1996-05-04 11:50:46 +04:00
Critical Fault handling
1998-01-22 16:27:43 +03:00
Copyright ( C ) Andrew Tridgell 1992 - 1998
1996-05-04 11:50:46 +04:00
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 2 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the Free Software
Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
# include "includes.h"
1998-04-13 23:24:06 +04:00
static void ( * cont_fn ) ( void * ) ;
1996-05-04 11:50:46 +04:00
/*******************************************************************
report a fault
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void fault_report ( int sig )
{
1998-08-11 17:55:16 +04:00
static int counter ;
if ( counter ) _exit ( 1 ) ;
counter + + ;
DEBUG ( 0 , ( " =============================================================== \n " ) ) ;
2003-08-20 21:13:38 +04:00
DEBUG ( 0 , ( " INTERNAL ERROR: Signal %d in pid %d (%s) " , sig , ( int ) sys_getpid ( ) , SAMBA_VERSION_STRING ) ) ;
2005-08-17 10:01:38 +04:00
DEBUG ( 0 , ( " \n Please read the Trouble-Shooting section of the Samba3-HOWTO \n " ) ) ;
DEBUG ( 0 , ( " \n From: http://www.samba.org/samba/docs/Samba3-HOWTO.pdf \n " ) ) ;
1998-08-11 17:55:16 +04:00
DEBUG ( 0 , ( " =============================================================== \n " ) ) ;
1996-05-04 11:50:46 +04:00
1998-08-21 15:37:40 +04:00
smb_panic ( " internal error " ) ;
1996-05-04 11:50:46 +04:00
1998-08-11 17:55:16 +04:00
if ( cont_fn ) {
cont_fn ( NULL ) ;
1996-05-04 11:50:46 +04:00
# ifdef SIGSEGV
1998-08-11 17:55:16 +04:00
CatchSignal ( SIGSEGV , SIGNAL_CAST SIG_DFL ) ;
1996-05-04 11:50:46 +04:00
# endif
# ifdef SIGBUS
1998-08-11 17:55:16 +04:00
CatchSignal ( SIGBUS , SIGNAL_CAST SIG_DFL ) ;
2004-01-22 04:50:58 +03:00
# endif
# ifdef SIGABRT
CatchSignal ( SIGABRT , SIGNAL_CAST SIG_DFL ) ;
1996-05-04 11:50:46 +04:00
# endif
1998-08-11 17:55:16 +04:00
return ; /* this should cause a core dump */
}
exit ( 1 ) ;
1996-05-04 11:50:46 +04:00
}
/****************************************************************************
catch serious errors
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void sig_fault ( int sig )
{
1998-08-11 17:55:16 +04:00
fault_report ( sig ) ;
1996-05-04 11:50:46 +04:00
}
/*******************************************************************
setup our fault handlers
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-04-13 23:24:06 +04:00
void fault_setup ( void ( * fn ) ( void * ) )
1996-05-04 11:50:46 +04:00
{
1998-08-11 17:55:16 +04:00
cont_fn = fn ;
1996-05-04 11:50:46 +04:00
# ifdef SIGSEGV
1998-08-11 17:55:16 +04:00
CatchSignal ( SIGSEGV , SIGNAL_CAST sig_fault ) ;
1996-05-04 11:50:46 +04:00
# endif
# ifdef SIGBUS
1998-08-11 17:55:16 +04:00
CatchSignal ( SIGBUS , SIGNAL_CAST sig_fault ) ;
1996-05-04 11:50:46 +04:00
# endif
2004-01-22 04:50:58 +03:00
# ifdef SIGABRT
CatchSignal ( SIGABRT , SIGNAL_CAST sig_fault ) ;
# endif
1996-05-04 11:50:46 +04:00
}