diff options
Diffstat (limited to 'app-shells/bash/files/bash-3.0-jobs.patch')
-rw-r--r-- | app-shells/bash/files/bash-3.0-jobs.patch | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/app-shells/bash/files/bash-3.0-jobs.patch b/app-shells/bash/files/bash-3.0-jobs.patch new file mode 100644 index 0000000..72c149c --- /dev/null +++ b/app-shells/bash/files/bash-3.0-jobs.patch @@ -0,0 +1,56 @@ +Ripped from Fedora + +* Wed Sep 8 2004 Tim Waugh <twaugh@redhat.com> 3.0-13 +- Check for EINVAL from waitpid() and avoid WCONTINUED in that case. +- Fixed jobs4 test. + +From: Tim Waugh +Subject: [patch] bash-3.0: avoid WCONTINUED if invalid +Date: Wed, 8 Sep 2004 16:52:38 +0100 +User-agent: Mutt/1.4.1i + +Hi, + +GNU libc defines WCONTINUED, but (at least on Linux 2.4.x kernels) +waitpid() returns -1 with errno set to EINVAL if WCONTINUED is +supplied in options. + +Here is a patch to retry without WCONTINUED set in that case. + +Tim. + +--- bash-3.0/tests/jobs4.sub ++++ bash-3.0/tests/jobs4.sub +@@ -18,5 +18,5 @@ + + wait + +-cat & ++sleep 100 & + kill -1 %% && echo i killed it || echo could not kill it +--- bash-3.0/jobs.c ++++ bash-3.0/jobs.c +@@ -2475,6 +2475,7 @@ + PROCESS *child; + pid_t pid; + int call_set_current, last_stopped_job, job, children_exited, waitpid_flags; ++ static int wcontinued_not_supported = 0; + + call_set_current = children_exited = 0; + last_stopped_job = NO_JOB; +@@ -2488,7 +2489,15 @@ + : 0; + if (sigchld || block == 0) + waitpid_flags |= WNOHANG; ++ retry: ++ if (wcontinued_not_supported) ++ waitpid_flags &= ~WCONTINUED; + pid = WAITPID (-1, &status, waitpid_flags); ++ if (pid == -1 && errno == EINVAL) ++ { ++ wcontinued_not_supported = 1; ++ goto retry; ++ } + + /* The check for WNOHANG is to make sure we decrement sigchld only + if it was non-zero before we called waitpid. */ |