|
|
@@ -175,3 +175,53 @@ Index: lib/sh/strftime.c
|
|
|
off = -zone.tz_minuteswest;
|
|
|
#endif /* !HAVE_TZNAME */
|
|
|
|
|
|
+-----------------------------------------------------------------------------
|
|
|
+
|
|
|
+On brain-dead Linux platforms somewhere between glibc 2.3.3 (20040405)
|
|
|
+and glibc 2.3.3 (20040917) (e.g. between SuSE 9.1 and SuSE 9.2 or
|
|
|
+between Gentoo 1.4.x and 1.5.x) the system headers provide the
|
|
|
+waitpid(2) option WCONTINUED although the underlying Linux kernels 2.4
|
|
|
+and 2.6 still do not support this option and return EINVAL on waitpid(2)
|
|
|
+using WCONTINUED.
|
|
|
+
|
|
|
+As a side-effect the GNU Bash goes into an endless loop with waitpid(3)
|
|
|
+calls after the first executed command terminated. The following
|
|
|
+patch is derived from Gentoo Portage and workarounds this problems by
|
|
|
+gracefully and efficiently degrading the options on waitpid(2) calls.
|
|
|
+
|
|
|
+Well, it's just another great example of how good Linux provides
|
|
|
+standardized APIs -- actually they are nothing more than Potemkin
|
|
|
+villages. Ggrrrrr!
|
|
|
+
|
|
|
+Index: jobs.c
|
|
|
+--- jobs.c.orig 2004-11-04 10:29:23 +0100
|
|
|
++++ jobs.c 2004-11-04 10:32:47 +0100
|
|
|
+@@ -2476,6 +2476,9 @@
|
|
|
+ PROCESS *child;
|
|
|
+ pid_t pid;
|
|
|
+ int call_set_current, last_stopped_job, job, children_exited, waitpid_flags;
|
|
|
++#ifdef __linux__
|
|
|
++ static int wcontinued_not_supported = 0;
|
|
|
++#endif
|
|
|
+
|
|
|
+ call_set_current = children_exited = 0;
|
|
|
+ last_stopped_job = NO_JOB;
|
|
|
+@@ -2489,7 +2492,18 @@
|
|
|
+ : 0;
|
|
|
+ if (sigchld || block == 0)
|
|
|
+ waitpid_flags |= WNOHANG;
|
|
|
++#ifdef __linux__
|
|
|
++ retry:
|
|
|
++ if (wcontinued_not_supported)
|
|
|
++ waitpid_flags &= ~WCONTINUED;
|
|
|
++#endif
|
|
|
+ pid = WAITPID (-1, &status, waitpid_flags);
|
|
|
++#ifdef __linux__
|
|
|
++ if (pid == -1 && errno == EINVAL) {
|
|
|
++ wcontinued_not_supported = 1;
|
|
|
++ goto retry;
|
|
|
++ }
|
|
|
++#endif
|
|
|
+
|
|
|
+ /* The check for WNOHANG is to make sure we decrement sigchld only
|
|
|
+ if it was non-zero before we called waitpid. */
|