diff options
author | Tanaka Akira <akr@users.sourceforge.net> | 2000-01-18 12:29:11 +0000 |
---|---|---|
committer | Tanaka Akira <akr@users.sourceforge.net> | 2000-01-18 12:29:11 +0000 |
commit | d473a667b603c83fd6cf921f1942136f4e45ff04 (patch) | |
tree | e87178ee8750fd0a11de650e529b7f579053aadc /Src/jobs.c | |
parent | 2c4e618e968ece47dc19559c480b760b480f0693 (diff) | |
download | zsh-d473a667b603c83fd6cf921f1942136f4e45ff04.tar.gz zsh-d473a667b603c83fd6cf921f1942136f4e45ff04.tar.xz zsh-d473a667b603c83fd6cf921f1942136f4e45ff04.zip |
zsh-workers/9345
Diffstat (limited to 'Src/jobs.c')
-rw-r--r-- | Src/jobs.c | 19 |
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); |