s4-fault: changed to use %d for PID, instead of %PID%
[Samba/gebeck_regimport.git] / lib / util / fault.c
blobed7684aaf37c66166bd3e3dc136038b2c1a76ab5
1 /*
2 Unix SMB/CIFS implementation.
3 Critical Fault handling
4 Copyright (C) Andrew Tridgell 1992-1998
5 Copyright (C) Tim Prouty 2009
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 3 of the License, or
10 (at your option) any later version.
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.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>.
21 #include "includes.h"
22 #include "system/filesys.h"
23 #include "version.h"
25 #ifdef HAVE_SYS_SYSCTL_H
26 #include <sys/sysctl.h>
27 #endif
30 #ifdef HAVE_SYS_PRCTL_H
31 #include <sys/prctl.h>
32 #endif
34 static struct {
35 bool disabled;
36 smb_panic_handler_t panic_handler;
37 } fault_state;
40 /*******************************************************************
41 setup variables used for fault handling
42 ********************************************************************/
43 void fault_configure(smb_panic_handler_t panic_handler)
45 fault_state.panic_handler = panic_handler;
49 /**
50 disable setting up fault handlers
51 This is used for the bind9 dlz module, as we
52 don't want a Samba module in bind9 to override the bind
53 fault handling
54 **/
55 _PUBLIC_ void fault_setup_disable(void)
57 fault_state.disabled = true;
61 /*******************************************************************
62 report a fault
63 ********************************************************************/
64 static void fault_report(int sig)
66 static int counter;
68 if (counter) _exit(1);
70 counter++;
72 DEBUGSEP(0);
73 DEBUG(0,("INTERNAL ERROR: Signal %d in pid %d (%s)",sig,(int)sys_getpid(),SAMBA_VERSION_STRING));
74 DEBUG(0,("\nPlease read the Trouble-Shooting section of the Samba HOWTO\n"));
75 DEBUGSEP(0);
77 smb_panic("internal error");
79 /* smb_panic() never returns, so this is really redundent */
80 exit(1);
83 /****************************************************************************
84 catch serious errors
85 ****************************************************************************/
86 static void sig_fault(int sig)
88 fault_report(sig);
91 /*******************************************************************
92 setup our fault handlers
93 ********************************************************************/
94 void fault_setup(void)
96 if (fault_state.disabled) {
97 return;
99 #ifdef SIGSEGV
100 CatchSignal(SIGSEGV, sig_fault);
101 #endif
102 #ifdef SIGBUS
103 CatchSignal(SIGBUS, sig_fault);
104 #endif
105 #ifdef SIGABRT
106 CatchSignal(SIGABRT, sig_fault);
107 #endif
110 _PUBLIC_ const char *panic_action = NULL;
113 default smb_panic() implementation
115 static void smb_panic_default(const char *why)
117 int result;
119 if (panic_action && *panic_action) {
120 char pidstr[20];
121 char cmdstring[200];
122 strlcpy(cmdstring, panic_action, sizeof(cmdstring));
123 snprintf(pidstr, sizeof(pidstr), "%d", (int) getpid());
124 all_string_sub(cmdstring, "%d", pidstr, sizeof(cmdstring));
125 DEBUG(0, ("smb_panic(): calling panic action [%s]\n", cmdstring));
126 result = system(cmdstring);
128 if (result == -1)
129 DEBUG(0, ("smb_panic(): fork failed in panic action: %s\n",
130 strerror(errno)));
131 else
132 DEBUG(0, ("smb_panic(): action returned status %d\n",
133 WEXITSTATUS(result)));
135 DEBUG(0,("PANIC: %s\n", why));
137 #ifdef SIGABRT
138 CatchSignal(SIGABRT, SIG_DFL);
139 #endif
140 abort();
145 Something really nasty happened - panic !
147 _PUBLIC_ void smb_panic(const char *why)
149 if (fault_state.panic_handler) {
150 fault_state.panic_handler(why);
151 _exit(1);
153 smb_panic_default(why);