hush: preparatory patch for set -o pipefail support
authorDenys Vlasenko <vda.linux@googlemail.com>
Sun, 14 Nov 2010 00:59:55 +0000 (01:59 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 14 Nov 2010 00:59:55 +0000 (01:59 +0100)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/hush.c

index 9dd30c436e023df42b793df8bc73b449c743df9a..126aaf07440a3d2b9b2f4ea571905ee2bfe72ce4 100644 (file)
@@ -6309,7 +6309,8 @@ static int checkjobs(struct pipe *fg_pipe)
 #endif
                /* Were we asked to wait for fg pipe? */
                if (fg_pipe) {
-                       for (i = 0; i < fg_pipe->num_cmds; i++) {
+                       i = fg_pipe->num_cmds;
+                       while (--i >= 0) {
                                debug_printf_jobs("check pid %d\n", fg_pipe->cmds[i].pid);
                                if (fg_pipe->cmds[i].pid != childpid)
                                        continue;
@@ -6338,19 +6339,19 @@ static int checkjobs(struct pipe *fg_pipe)
                                }
                                debug_printf_jobs("fg_pipe: alive_cmds %d stopped_cmds %d\n",
                                                fg_pipe->alive_cmds, fg_pipe->stopped_cmds);
-                               if (fg_pipe->alive_cmds - fg_pipe->stopped_cmds <= 0) {
+                               if (fg_pipe->alive_cmds == fg_pipe->stopped_cmds) {
                                        /* All processes in fg pipe have exited or stopped */
 /* Note: *non-interactive* bash does not continue if all processes in fg pipe
  * are stopped. Testcase: "cat | cat" in a script (not on command line!)
  * and "killall -STOP cat" */
                                        if (G_interactive_fd) {
 #if ENABLE_HUSH_JOB
-                                               if (fg_pipe->alive_cmds)
+                                               if (fg_pipe->alive_cmds != 0)
                                                        insert_bg_job(fg_pipe);
 #endif
                                                return rcode;
                                        }
-                                       if (!fg_pipe->alive_cmds)
+                                       if (fg_pipe->alive_cmds == 0)
                                                return rcode;
                                }
                                /* There are still running processes in the fg pipe */