1996-05-04 11:50:46 +04:00
/*
Unix SMB / Netbios implementation .
Version 1.9 .
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"
extern int DEBUGLEVEL ;
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 )
{
DEBUG ( 0 , ( " =============================================================== \n " ) ) ;
DEBUG ( 0 , ( " INTERNAL ERROR: Signal %d in pid %d (%s) " , sig , ( int ) getpid ( ) , VERSION ) ) ;
DEBUG ( 0 , ( " \n Please read the file BUGS.txt in the distribution \n " ) ) ;
DEBUG ( 0 , ( " =============================================================== \n " ) ) ;
# if AJT
ajt_panic ( ) ;
# endif
if ( cont_fn )
{
fault_setup ( cont_fn ) ;
cont_fn ( NULL ) ;
# ifdef SIGSEGV
1998-07-29 07:08:05 +04:00
CatchSignal ( SIGSEGV , SIGNAL_CAST SIG_DFL ) ;
1996-05-04 11:50:46 +04:00
# endif
# ifdef SIGBUS
1998-07-29 07:08:05 +04:00
CatchSignal ( SIGBUS , SIGNAL_CAST SIG_DFL ) ;
1996-05-04 11:50:46 +04:00
# endif
return ; /* this should cause a core dump */
}
exit ( 1 ) ;
}
/****************************************************************************
catch serious errors
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void sig_fault ( int sig )
{
fault_report ( sig ) ;
}
/*******************************************************************
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
{
cont_fn = fn ;
# ifdef SIGSEGV
1998-07-29 07:08:05 +04:00
CatchSignal ( SIGSEGV , SIGNAL_CAST sig_fault ) ;
1996-05-04 11:50:46 +04:00
# endif
# ifdef SIGBUS
1998-07-29 07:08:05 +04:00
CatchSignal ( SIGBUS , SIGNAL_CAST sig_fault ) ;
1996-05-04 11:50:46 +04:00
# endif
}