diff --git a/source4/client/smbspool.c b/source4/client/smbspool.c index 21dc5c0e108..cb95c0d5a31 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 e39c8e964d4..53bb7b5a8cf 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 f3a9e78f398..22efb4825d7 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 @@ -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 00000000000..0ba8c0eaad1 --- /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 3f1bea75f1e..673e6a06a8f 100755 --- a/source4/script/tests/selftest.sh +++ b/source4/script/tests/selftest.sh @@ -92,6 +92,7 @@ cat >$CONFFILE<