9b665f65c79e80a5267160a3e45c6285e452a3ee
[samba.git] / source3 / lib / fault.c
1 /* 
2    Unix SMB/Netbios implementation.
3    Version 1.9.
4    Critical Fault handling
5    Copyright (C) Andrew Tridgell 1992-1998
6    
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11    
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16    
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22 #include "includes.h"
23 extern int DEBUGLEVEL;
24
25
26 static void (*cont_fn)(void *);
27
28
29 /*******************************************************************
30 report a fault
31 ********************************************************************/
32 static void fault_report(int sig)
33 {
34         static int counter;
35
36         if (counter) _exit(1);
37
38         counter++;
39
40         DEBUG(0,("===============================================================\n"));
41         DEBUG(0,("INTERNAL ERROR: Signal %d in pid %d (%s)",sig,(int)getpid(),VERSION));
42         DEBUG(0,("\nPlease read the file BUGS.txt in the distribution\n"));
43         DEBUG(0,("===============================================================\n"));
44   
45 #if AJT
46         ajt_panic();
47 #endif  
48
49         if (cont_fn) {
50                 cont_fn(NULL);
51 #ifdef SIGSEGV
52                 CatchSignal(SIGSEGV,SIGNAL_CAST SIG_DFL);
53 #endif
54 #ifdef SIGBUS
55                 CatchSignal(SIGBUS,SIGNAL_CAST SIG_DFL);
56 #endif
57                 return; /* this should cause a core dump */
58         }
59         exit(1);
60 }
61
62 /****************************************************************************
63 catch serious errors
64 ****************************************************************************/
65 static void sig_fault(int sig)
66 {
67         fault_report(sig);
68 }
69
70 /*******************************************************************
71 setup our fault handlers
72 ********************************************************************/
73 void fault_setup(void (*fn)(void *))
74 {
75         cont_fn = fn;
76
77 #ifdef SIGSEGV
78         CatchSignal(SIGSEGV,SIGNAL_CAST sig_fault);
79 #endif
80 #ifdef SIGBUS
81         CatchSignal(SIGBUS,SIGNAL_CAST sig_fault);
82 #endif
83 }
84
85
86