diff options
-rw-r--r-- | source4/client/smbspool.c | 2 | ||||
-rw-r--r-- | source4/lib/cmdline/popt_common.c | 3 | ||||
-rw-r--r-- | source4/lib/fault.c | 35 | ||||
-rwxr-xr-x | source4/script/gdb_backtrace | 17 | ||||
-rwxr-xr-x | source4/script/tests/selftest.sh | 1 | ||||
-rw-r--r-- | source4/scripting/ejs/smbscript.c | 1 | ||||
-rw-r--r-- | source4/smbd/server.c | 4 |
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, |