diff options
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | os/osinit.c | 20 |
2 files changed, 21 insertions, 1 deletions
diff --git a/configure.ac b/configure.ac index f4e1dbb04..93ef0bd23 100644 --- a/configure.ac +++ b/configure.ac @@ -105,7 +105,7 @@ AM_CONDITIONAL(XSERVER_DTRACE, [test "x$WDTRACE" != "xno"]) AC_HEADER_DIRENT AC_HEADER_STDC -AC_CHECK_HEADERS([fcntl.h stdlib.h string.h unistd.h]) +AC_CHECK_HEADERS([fcntl.h stdlib.h string.h unistd.h dlfcn.h]) dnl Checks for typedefs, structures, and compiler characteristics. AC_C_CONST diff --git a/os/osinit.c b/os/osinit.c index 34d8378a6..b7bd0763b 100644 --- a/os/osinit.c +++ b/os/osinit.c @@ -56,6 +56,9 @@ SOFTWARE. #include <X11/Xos.h> #include <signal.h> #include <errno.h> +#ifdef HAVE_DLFCN_H +# include <dlfcn.h> +#endif #include "dixstruct.h" @@ -113,6 +116,14 @@ OsSigHandler(int signo, siginfo_t *sip, void *unused) OsSigHandler(int signo) #endif { +#ifdef RTLD_DI_SETSIGNAL + const char *dlerr = dlerror(); + + if (dlerr) { + LogMessage(X_ERROR, "Dynamic loader error: %s\n", dlerr); + } +#endif /* RTLD_DI_SETSIGNAL */ + if (OsSigWrapper != NULL) { if (OsSigWrapper(signo) == 0) { /* ddx handled signal and wants us to continue */ @@ -180,6 +191,15 @@ OsInit(void) } } +#ifdef RTLD_DI_SETSIGNAL + /* Tell runtime linker to send a signal we can catch instead of SIGKILL + * for failures to load libraries/modules at runtime so we can clean up + * after ourselves. + */ + int failure_signal = SIGQUIT; + dlinfo(RTLD_SELF, RTLD_DI_SETSIGNAL, &failure_signal); +#endif + #if !defined(__SCO__) && !defined(__CYGWIN__) && !defined(__UNIXWARE__) fclose(stdin); fclose(stdout); |