You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.4 KiB
57 lines
1.4 KiB
10 years ago
|
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. */
|