about summary refs log tree commit diff
path: root/Src/jobs.c
diff options
context:
space:
mode:
authorTanaka Akira <akr@users.sourceforge.net>2000-01-18 12:29:11 +0000
committerTanaka Akira <akr@users.sourceforge.net>2000-01-18 12:29:11 +0000
commitd473a667b603c83fd6cf921f1942136f4e45ff04 (patch)
treee87178ee8750fd0a11de650e529b7f579053aadc /Src/jobs.c
parent2c4e618e968ece47dc19559c480b760b480f0693 (diff)
downloadzsh-d473a667b603c83fd6cf921f1942136f4e45ff04.tar.gz
zsh-d473a667b603c83fd6cf921f1942136f4e45ff04.tar.xz
zsh-d473a667b603c83fd6cf921f1942136f4e45ff04.zip
zsh-workers/9345
Diffstat (limited to 'Src/jobs.c')
-rw-r--r--Src/jobs.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/Src/jobs.c b/Src/jobs.c
index e66d3b3fd..d519da00c 100644
--- a/Src/jobs.c
+++ b/Src/jobs.c
@@ -64,7 +64,13 @@ struct tms shtms;
  
 /**/
 int ttyfrozen;
- 
+
+/* Previous values of errflag and breaks if the signal handler had to
+ * change them. And a flag saying if it did that. */
+
+/**/
+int prev_errflag, prev_breaks, errbrk_saved;
+
 static struct timeval dtimeval, now;
 
 /* Diff two timevals for elapsed-time computations */
@@ -311,6 +317,11 @@ update_job(Job jn)
 		/* If we have `foo|while true; (( x++ )); done', and hit
 		 * ^C, we have to stop the loop, too. */
 		if ((val & 0200) && inforeground == 1) {
+		    if (!errbrk_saved) {
+			errbrk_saved = 1;
+			prev_breaks = breaks;
+			prev_errflag = errflag;
+		    }
 		    breaks = loops;
 		    errflag = 1;
 		    inerrflush();
@@ -322,6 +333,11 @@ update_job(Job jn)
 	    }
 	}
     } else if (list_pipe && (val & 0200) && inforeground == 1) {
+	if (!errbrk_saved) {
+	    errbrk_saved = 1;
+	    prev_breaks = breaks;
+	    prev_errflag = errflag;
+	}
 	breaks = loops;
 	errflag = 1;
 	inerrflush();
@@ -1296,6 +1312,7 @@ bin_fg(char *name, char **argv, char *ops, int func)
 		    thisjob = job;
 		    if ((jobtab[job].stat & STAT_SUPERJOB) &&
 			((!jobtab[job].procs->next ||
+			  (jobtab[job].stat & STAT_SUBLEADER) ||
 			  killpg(jobtab[job].gleader, 0) == -1)) &&
 			jobtab[jobtab[job].other].gleader)
 			attachtty(jobtab[jobtab[job].other].gleader);