Module: wine Branch: refs/heads/master Commit: 0cd0626de019c8ca288ed8a61a053c0f485c5c5c URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=0cd0626de019c8ca288ed8a6...
Author: Mike McCormack mike@codeweavers.com Date: Wed Mar 1 01:07:04 2006 +0900
server: Print a message if wineserver crashes and we don't dump cores.
---
configure | 2 ++ configure.ac | 1 + include/config.h.in | 3 +++ server/signal.c | 26 ++++++++++++++++++++++++++ 4 files changed, 32 insertions(+), 0 deletions(-)
diff --git a/configure b/configure index 392808f..9e163c8 100755 --- a/configure +++ b/configure @@ -7038,6 +7038,7 @@ done
+ for ac_header in \ IOKit/IOKitLib.h \ alsa/asoundlib.h \ @@ -7119,6 +7120,7 @@ for ac_header in \ sys/poll.h \ sys/ptrace.h \ sys/reg.h \ + sys/resource.h \ sys/scsiio.h \ sys/shm.h \ sys/signal.h \ diff --git a/configure.ac b/configure.ac index e88d337..f2f910d 100644 --- a/configure.ac +++ b/configure.ac @@ -252,6 +252,7 @@ AC_CHECK_HEADERS(\ sys/poll.h \ sys/ptrace.h \ sys/reg.h \ + sys/resource.h \ sys/scsiio.h \ sys/shm.h \ sys/signal.h \ diff --git a/include/config.h.in b/include/config.h.in index 18f1127..d2c9f3b 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -734,6 +734,9 @@ /* Define to 1 if you have the <sys/reg.h> header file. */ #undef HAVE_SYS_REG_H
+/* Define to 1 if you have the <sys/resource.h> header file. */ +#undef HAVE_SYS_RESOURCE_H + /* Define to 1 if you have the <sys/scsiio.h> header file. */ #undef HAVE_SYS_SCSIIO_H
diff --git a/server/signal.c b/server/signal.c index 0c2a579..e12532e 100644 --- a/server/signal.c +++ b/server/signal.c @@ -28,6 +28,9 @@ #ifdef HAVE_SYS_POLL_H #include <sys/poll.h> #endif +#ifdef HAVE_SYS_RESOURCE_H +#include <sys/resource.h> +#endif #include <unistd.h>
#include "file.h" @@ -215,6 +218,13 @@ static void do_sigchld( int signum ) do_signal( handler_sigchld ); }
+/* SIGSEGV handler */ +static void do_sigsegv( int signum ) +{ + fprintf( stderr, "wineserver crashed, please report this.\n"); + abort(); +} + /* SIGIO handler */ #ifdef HAVE_SIGINFO_T_SI_FD static void do_sigio( int signum, siginfo_t *si, void *x ) @@ -241,6 +251,17 @@ int watchdog_triggered(void) return watchdog != 0; }
+static int core_dump_disabled( void ) +{ + int r = 0; +#ifdef RLIMIT_CORE + struct rlimit lim; + + r = !getrlimit(RLIMIT_CORE, &lim) && (lim.rlim_cur == 0); +#endif + return r; +} + void init_signals(void) { struct sigaction action; @@ -279,6 +300,11 @@ void init_signals(void) action.sa_handler = do_sigterm; sigaction( SIGQUIT, &action, NULL ); sigaction( SIGTERM, &action, NULL ); + if (core_dump_disabled()) + { + action.sa_handler = do_sigsegv; + sigaction( SIGSEGV, &action, NULL ); + } action.sa_handler = SIG_IGN; sigaction( SIGXFSZ, &action, NULL ); #ifdef HAVE_SIGINFO_T_SI_FD