added new smb.conf option "panic action". see my samba-technical
[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         smb_panic("internal error");
46
47         if (cont_fn) {
48                 cont_fn(NULL);
49 #ifdef SIGSEGV
50                 CatchSignal(SIGSEGV,SIGNAL_CAST SIG_DFL);
51 #endif
52 #ifdef SIGBUS
53                 CatchSignal(SIGBUS,SIGNAL_CAST SIG_DFL);
54 #endif
55                 return; /* this should cause a core dump */
56         }
57         exit(1);
58 }
59
60 /****************************************************************************
61 catch serious errors
62 ****************************************************************************/
63 static void sig_fault(int sig)
64 {
65         fault_report(sig);
66 }
67
68 /*******************************************************************
69 setup our fault handlers
70 ********************************************************************/
71 void fault_setup(void (*fn)(void *))
72 {
73         cont_fn = fn;
74
75 #ifdef SIGSEGV
76         CatchSignal(SIGSEGV,SIGNAL_CAST sig_fault);
77 #endif
78 #ifdef SIGBUS
79         CatchSignal(SIGBUS,SIGNAL_CAST sig_fault);
80 #endif
81 }
82
83
84