summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--m4/jm-macros.m42
-rw-r--r--src/timeout.c24
2 files changed, 25 insertions, 1 deletions
diff --git a/m4/jm-macros.m4 b/m4/jm-macros.m4
index ec553105f..9bb6fa425 100644
--- a/m4/jm-macros.m4
+++ b/m4/jm-macros.m4
@@ -65,6 +65,8 @@ AC_DEFUN([coreutils_MACROS],
# Used by sort.c.
AC_CHECK_FUNCS_ONCE([nl_langinfo])
+ # Used by timeout.c
+ AC_CHECK_FUNCS_ONCE([setrlimit])
# Used by tail.c.
AC_CHECK_FUNCS([inotify_init],
diff --git a/src/timeout.c b/src/timeout.c
index ab54ed675..ef660a717 100644
--- a/src/timeout.c
+++ b/src/timeout.c
@@ -58,6 +58,12 @@
#include "error.h"
#include "quote.h"
+#if HAVE_SETRLIMIT
+/* FreeBSD 5.0 at least needs <sys/types.h> and <sys/time.h> included
+ before <sys/resource.h>. Currently "system.h" includes <sys/time.h>. */
+# include <sys/resource.h>
+#endif
+
#define PROGRAM_NAME "timeout"
#define AUTHORS proper_name_utf8 ("Padraig Brady", "P\303\241draig Brady")
@@ -370,7 +376,23 @@ main (int argc, char **argv)
if (WIFEXITED (status))
status = WEXITSTATUS (status);
else if (WIFSIGNALED (status))
- status = WTERMSIG (status) + 128; /* what sh does at least. */
+ {
+ int sig = WTERMSIG (status);
+#if HAVE_SETRLIMIT && defined RLIMIT_CORE
+ if (!timed_out)
+ {
+ /* exit with the signal flag set, but avoid core files. */
+ if (setrlimit (RLIMIT_CORE, &(struct rlimit) {0,0}) == 0)
+ {
+ signal (sig, SIG_DFL);
+ raise (sig);
+ }
+ else
+ error (0, errno, _("warning: disabling core dumps failed"));
+ }
+#endif
+ status = sig + 128; /* what sh returns for signaled processes. */
+ }
else
{
/* shouldn't happen. */