summaryrefslogtreecommitdiff
blob: 72c149c71cf581886c6c24d4b899a0b24242ad36 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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. */