From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15531 invoked from network); 19 Jun 1997 06:47:26 -0000 Received: from euclid.skiles.gatech.edu (list@130.207.146.50) by ns1.primenet.com.au with SMTP; 19 Jun 1997 06:47:26 -0000 Received: (from list@localhost) by euclid.skiles.gatech.edu (8.7.3/8.7.3) id CAA08992; Thu, 19 Jun 1997 02:21:05 -0400 (EDT) Resent-Date: Thu, 19 Jun 1997 02:21:05 -0400 (EDT) Date: Thu, 19 Jun 97 15:24:32 JST Message-Id: <9706190624.AA05850@oz.fantasy.otsl.oki.co.jp> To: zsh-workers@math.gatech.edu Subject: zsh-3.0.3: another problem in Src/jobs.c From: suzuki@otsl.oki.co.jp (SUZUKI Hisao) Organization: Oki Technosystems Laboratory, Inc., Nagoya, Japan Resent-Message-ID: <"FlqmH.0.RC2.B_Cgp"@euclid> Resent-From: zsh-workers@math.gatech.edu X-Mailing-List: archive/latest/3257 X-Loop: zsh-workers@math.gatech.edu Precedence: list Resent-Sender: zsh-workers-request@math.gatech.edu Jo napot kivanok! (...or "Jo reggelt kivanok") I reported a problem of zsh-3.0.3/Src/jobs.c by e-mail <9706180710.AA10798@oz.fantasy.otsl.oki.co.jp> yesterday. Now I found another problem. It is like this: ares:~% stty speed 9600 baud; line = 0; intr = ^G; erase = ^H; -brkint ixoff -imaxbel -iexten -echoctl ares:~% emacs -nw & [1] 2537 ares:~% [1] + suspended (tty output) emacs -nw ares:~% fg [1] + continued emacs -nw zsh: suspended emacs -nw ares:~% stty speed 9600 baud; line = 0; intr = ^G; quit = ; erase = ^H; susp = ; lnext = ; flush = ; -brkint inlcr ixoff -imaxbel -iexten -echoctl This is similar to what I reported yesterday in that the tty setting is modified unexpectedly by a background job. Really they are the same _annoying_ problem of the same cause in a sense. Again, for the time being, I made a hack to fix it rather in a clean way (at least I think so :-) this time. I hope the problem will be fixed soon in any way. ---------------------------------------------------------------- *** zsh-3.0.3/Src/jobs.c.ORIG Tue Jun 3 05:11:27 1997 --- zsh-3.0.3/Src/jobs.c Thu Jun 19 02:35:37 1997 *************** *** 121,135 **** int job; int val = 0, status = 0; int somestopped = 0, inforeground = 0; for (pn = jn->procs; pn; pn = pn->next) { if (pn->status == SP_RUNNING) /* some processes in this job are running */ return; /* so no need to update job table entry */ if (WIFSTOPPED(pn->status)) /* some processes are stopped */ somestopped = 1; /* so job is not done, but entry needs updating */ ! if (!pn->next) /* last job in pipeline determines exit status */ val = (WIFSIGNALED(pn->status)) ? 0200 | WTERMSIG(pn->status) : WEXITSTATUS(pn->status); if (pn->pid == jn->gleader) /* if this process is process group leader */ status = pn->status; } --- 121,140 ---- int job; int val = 0, status = 0; int somestopped = 0, inforeground = 0; + pid_t pgrp = -1; + int is_foreground = 0; /* is this job in the foreground actually? */ + int is_stopped = 0; /* is this job stopped? */ for (pn = jn->procs; pn; pn = pn->next) { if (pn->status == SP_RUNNING) /* some processes in this job are running */ return; /* so no need to update job table entry */ if (WIFSTOPPED(pn->status)) /* some processes are stopped */ somestopped = 1; /* so job is not done, but entry needs updating */ ! if (!pn->next) { /* last job in pipeline determines exit status */ val = (WIFSIGNALED(pn->status)) ? 0200 | WTERMSIG(pn->status) : WEXITSTATUS(pn->status); + is_stopped = WIFSTOPPED(pn->status); + } if (pn->pid == jn->gleader) /* if this process is process group leader */ status = pn->status; } *************** *** 154,168 **** } } ! if (shout && !ttyfrozen && !jn->stty_in_env) ! gettyinfo(&shttyinfo); ! if (isset(MONITOR)) { ! pid_t pgrp = gettygrp(); /* get process group of tty */ ! /* is this job in the foreground of an interactive shell? */ ! if (mypgrp != pgrp && inforeground && ! (jn->gleader == pgrp || (pgrp > 1 && kill(-pgrp, 0) == -1))) { attachtty(mypgrp); adjustwinsize(); /* check window size and adjust if necessary */ } --- 159,179 ---- } } ! if (shout && !ttyfrozen && !jn->stty_in_env && !is_stopped) { ! pgrp = gettygrp(); /* get process group of tty */ ! is_foreground = (jn->gleader == pgrp || ! (pgrp > 1 && kill(-pgrp, 0) == -1)); ! if (is_foreground) ! gettyinfo(&shttyinfo); ! } if (isset(MONITOR)) { ! if (pgrp == -1) { ! pgrp = gettygrp(); ! is_foreground = (jn->gleader == pgrp || ! (pgrp > 1 && kill(-pgrp, 0) == -1)); ! } /* is this job in the foreground of an interactive shell? */ ! if (mypgrp != pgrp && inforeground && is_foreground) { attachtty(mypgrp); adjustwinsize(); /* check window size and adjust if necessary */ } ---------------------------------------------------------------- Regards, Hisao Suzuki