0001-01-01 02:30:17 +02:30
/*
Unix SMB / Netbios implementation .
Version 1.9 .
Critical Fault handling
0001-01-01 02:30:17 +02:30
Copyright ( C ) Andrew Tridgell 1992 - 1998
0001-01-01 02:30:17 +02:30
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 ;
0001-01-01 02:30:17 +02:30
static void ( * cont_fn ) ( void * ) ;
0001-01-01 02:30:17 +02:30
/*******************************************************************
report a fault
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void fault_report ( int sig )
{
0001-01-01 02:30:17 +02:30
static int counter ;
if ( counter ) _exit ( 1 ) ;
counter + + ;
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 " ) ) ;
0001-01-01 02:30:17 +02:30
0001-01-01 02:30:17 +02:30
smb_panic ( " internal error " ) ;
0001-01-01 02:30:17 +02:30
0001-01-01 02:30:17 +02:30
if ( cont_fn ) {
cont_fn ( NULL ) ;
0001-01-01 02:30:17 +02:30
# ifdef SIGSEGV
0001-01-01 02:30:17 +02:30
CatchSignal ( SIGSEGV , SIGNAL_CAST SIG_DFL ) ;
0001-01-01 02:30:17 +02:30
# endif
# ifdef SIGBUS
0001-01-01 02:30:17 +02:30
CatchSignal ( SIGBUS , SIGNAL_CAST SIG_DFL ) ;
0001-01-01 02:30:17 +02:30
# endif
0001-01-01 02:30:17 +02:30
return ; /* this should cause a core dump */
}
exit ( 1 ) ;
0001-01-01 02:30:17 +02:30
}
/****************************************************************************
catch serious errors
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void sig_fault ( int sig )
{
0001-01-01 02:30:17 +02:30
fault_report ( sig ) ;
0001-01-01 02:30:17 +02:30
}
/*******************************************************************
setup our fault handlers
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
0001-01-01 02:30:17 +02:30
void fault_setup ( void ( * fn ) ( void * ) )
0001-01-01 02:30:17 +02:30
{
0001-01-01 02:30:17 +02:30
cont_fn = fn ;
0001-01-01 02:30:17 +02:30
# ifdef SIGSEGV
0001-01-01 02:30:17 +02:30
CatchSignal ( SIGSEGV , SIGNAL_CAST sig_fault ) ;
0001-01-01 02:30:17 +02:30
# endif
# ifdef SIGBUS
0001-01-01 02:30:17 +02:30
CatchSignal ( SIGBUS , SIGNAL_CAST sig_fault ) ;
0001-01-01 02:30:17 +02:30
# endif
}