diff options
-rw-r--r-- | m4/jm-macros.m4 | 2 | ||||
-rw-r--r-- | src/timeout.c | 24 |
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. */ |