summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/client/smbspool.c2
-rw-r--r--source4/lib/cmdline/popt_common.c3
-rw-r--r--source4/lib/fault.c35
-rwxr-xr-xsource4/script/gdb_backtrace17
-rwxr-xr-xsource4/script/tests/selftest.sh1
-rw-r--r--source4/scripting/ejs/smbscript.c1
-rw-r--r--source4/smbd/server.c4
7 files changed, 39 insertions, 24 deletions
diff --git a/source4/client/smbspool.c b/source4/client/smbspool.c
index 21dc5c0e10..cb95c0d5a3 100644
--- a/source4/client/smbspool.c
+++ b/source4/client/smbspool.c
@@ -175,7 +175,7 @@ static int smb_print(struct smbcli_state *, char *, FILE *);
* Setup the SAMBA server state...
*/
- setup_logging("smbspool", DEBUG_STDOUT);
+ setup_logging(argv[0], DEBUG_STDOUT);
if (!lp_load()) {
fprintf(stderr, "ERROR: Can't load %s - run testparm to debug it\n", lp_config_file());
diff --git a/source4/lib/cmdline/popt_common.c b/source4/lib/cmdline/popt_common.c
index e39c8e964d..53bb7b5a8c 100644
--- a/source4/lib/cmdline/popt_common.c
+++ b/source4/lib/cmdline/popt_common.c
@@ -48,6 +48,9 @@ static void popt_common_callback(poptContext con,
const char *arg, const void *data)
{
const char *pname;
+
+ /* setup for panics */
+ fault_setup(poptGetInvocationName(con));
if (reason == POPT_CALLBACK_REASON_POST) {
/* Hook any 'every Samba program must do this, after
diff --git a/source4/lib/fault.c b/source4/lib/fault.c
index f3a9e78f39..22efb4825d 100644
--- a/source4/lib/fault.c
+++ b/source4/lib/fault.c
@@ -23,14 +23,13 @@
#include "system/wait.h"
#include "system/filesys.h"
-static void (*cont_fn)(void *);
-
/* the registered fault handler */
static struct {
const char *name;
void (*fault_handler)(int sig);
} fault_handlers;
+static const char *progname;
#ifdef HAVE_BACKTRACE
#include <execinfo.h>
@@ -111,8 +110,16 @@ void smb_panic(const char *why)
int result;
if (cmd && *cmd) {
- DEBUG(0, ("smb_panic(): calling panic action [%s]\n", cmd));
- result = system(cmd);
+ char pidstr[20];
+ char cmdstring[200];
+ safe_strcpy(cmdstring, cmd, sizeof(cmdstring));
+ snprintf(pidstr, sizeof(pidstr), "%u", getpid());
+ all_string_sub(cmdstring, "%PID%", pidstr, sizeof(cmdstring));
+ if (progname) {
+ all_string_sub(cmdstring, "%PROG%", progname, sizeof(cmdstring));
+ }
+ DEBUG(0, ("smb_panic(): calling panic action [%s]\n", cmdstring));
+ result = system(cmdstring);
if (result == -1)
DEBUG(0, ("smb_panic(): fork failed in panic action: %s\n",
@@ -147,19 +154,6 @@ static void fault_report(int sig)
smb_panic("internal error");
- if (cont_fn) {
- cont_fn(NULL);
-#ifdef SIGSEGV
- CatchSignal(SIGSEGV,SIGNAL_CAST SIG_DFL);
-#endif
-#ifdef SIGBUS
- CatchSignal(SIGBUS,SIGNAL_CAST SIG_DFL);
-#endif
-#ifdef SIGABRT
- CatchSignal(SIGABRT,SIGNAL_CAST SIG_DFL);
-#endif
- return; /* this should cause a core dump */
- }
exit(1);
}
@@ -179,10 +173,11 @@ static void sig_fault(int sig)
/*******************************************************************
setup our fault handlers
********************************************************************/
-void fault_setup(void (*fn)(void *))
+void fault_setup(const char *pname)
{
- cont_fn = fn;
-
+ if (progname == NULL) {
+ progname = pname;
+ }
#ifdef SIGSEGV
CatchSignal(SIGSEGV,SIGNAL_CAST sig_fault);
#endif
diff --git a/source4/script/gdb_backtrace b/source4/script/gdb_backtrace
new file mode 100755
index 0000000000..0ba8c0eaad
--- /dev/null
+++ b/source4/script/gdb_backtrace
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+# we want everything on stderr, so the program is not disturbed
+exec 1>&2
+
+PID=$1
+PROG=$2
+
+TMPFILE=/tmp/gdb.$$
+cat << EOF > $TMPFILE
+set height 1000
+bt full
+quit
+EOF
+
+gdb -batch -x $TMPFILE $PROG $PID < /dev/null
+/bin/rm -f $TMPFILE
diff --git a/source4/script/tests/selftest.sh b/source4/script/tests/selftest.sh
index 3f1bea75f1..673e6a06a8 100755
--- a/source4/script/tests/selftest.sh
+++ b/source4/script/tests/selftest.sh
@@ -92,6 +92,7 @@ cat >$CONFFILE<<EOF
name resolve order = bcast
interfaces = lo*
tls enabled = $TLS_ENABLED
+ panic action = $SRCDIR/script/gdb_backtrace %PID% %PROG%
[tmp]
path = $TMPDIR
diff --git a/source4/scripting/ejs/smbscript.c b/source4/scripting/ejs/smbscript.c
index c6155dcbeb..b16536a575 100644
--- a/source4/scripting/ejs/smbscript.c
+++ b/source4/scripting/ejs/smbscript.c
@@ -45,6 +45,7 @@ void ejs_exception(const char *reason)
struct MprVar *return_var;
int exit_status, i;
+ fault_setup(argv[0]);
smbscript_init_subsystems;
mprSetCtx(mem_ctx);
diff --git a/source4/smbd/server.c b/source4/smbd/server.c
index f5f37a55cf..a176b59d8d 100644
--- a/source4/smbd/server.c
+++ b/source4/smbd/server.c
@@ -96,8 +96,6 @@ static void cleanup_tmp_files(void)
*/
static void setup_signals(void)
{
- fault_setup(NULL);
-
/* we are never interested in SIGPIPE */
BlockSignals(True,SIGPIPE);
@@ -175,7 +173,7 @@ static int binary_smbd_main(int argc, const char *argv[])
poptFreeContext(pc);
- setup_logging(NULL, interactive?DEBUG_STDOUT:DEBUG_FILE);
+ setup_logging(argv[0], interactive?DEBUG_STDOUT:DEBUG_FILE);
setup_signals();
/* we want total control over the permissions on created files,