From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11543 invoked by alias); 19 Aug 2010 20:19:16 -0000 Mailing-List: contact zsh-users-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Users List List-Post: List-Help: X-Seq: 15300 Received: (qmail 4855 invoked from network); 19 Aug 2010 20:19:13 -0000 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received-SPF: pass (ns1.primenet.com.au: SPF record at ntlworld.com designates 81.103.221.48 as permitted sender) Date: Thu, 19 Aug 2010 21:18:53 +0100 From: Peter Stephenson To: zsh-users@zsh.org Subject: Re: process substitution and Ctrl-C Message-ID: <20100819211853.33d720d8@pws-pc> In-Reply-To: <20100819181556.4a3e6589@csr.com> References: <20100819124142.GQ16075@prunille.vinc17.org> <20100819140730.70daeb3b@csr.com> <20100819181556.4a3e6589@csr.com> X-Mailer: Claws Mail 3.7.6 (GTK+ 2.18.9; x86_64-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Cloudmark-Analysis: v=1.1 cv=DhNl2YeytwJssBBGe49HJX82LNDFEEVkpVB34RXKaPo= c=1 sm=0 a=s8Rmg4McYNwA:10 a=DogomfpGjd0A:10 a=kj9zAlcOel0A:10 a=NLZqzBF-AAAA:8 a=KxuyrqvvmJV3ajkmAAYA:9 a=hzL2OSFfDBCkPTWlwpEA:7 a=ji5YQeKyUU6v_GIdzHMLgwNZC4cA:4 a=CjuIK1q_8ugA:10 a=_dQi-Dcv4p4A:10 a=HpAAvcLHHh0Zw7uRqdWCyQ==:117 I'm now wondering if we should do the same in the case where the shell actually does get the SIGINT and abort processing as a result? Theories welcome. Index: Src/jobs.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/jobs.c,v retrieving revision 1.78 diff -p -u -r1.78 jobs.c --- Src/jobs.c 18 Aug 2010 21:21:17 -0000 1.78 +++ Src/jobs.c 19 Aug 2010 20:16:53 -0000 @@ -320,6 +320,36 @@ update_process(Process pn, int status) } #endif +/* + * Called when the current shell is behaving as if it received + * a interactively generated signal (sig). + * + * As we got the signal or are pretending we did, we need to pretend + * anything attached to a CURSH process got it, too. + */ +/**/ +void +check_cursh_sig(int sig) +{ + int i, j; + + if (!errflag) + return; + for (i = 1; i <= maxjob; i++) { + if ((jobtab[i].stat & (STAT_CURSH|STAT_DONE)) == + STAT_CURSH) { + for (j = 0; j < 2; j++) { + Process pn = j ? jobtab[i].auxprocs : jobtab[i].procs; + for (; pn; pn = pn->next) { + if (pn->status == SP_RUNNING) { + kill(pn->pid, sig); + } + } + } + } + } +} + /* Update status of job, possibly printing it */ /**/ @@ -496,6 +526,7 @@ update_job(Job jn) breaks = loops; errflag = 1; } + check_cursh_sig(sig); } } } Index: Src/signals.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/signals.c,v retrieving revision 1.58 diff -p -u -r1.58 signals.c --- Src/signals.c 12 May 2010 10:07:01 -0000 1.58 +++ Src/signals.c 19 Aug 2010 20:16:53 -0000 @@ -580,6 +580,7 @@ zhandler(int sig) breaks = loops; errflag = 1; inerrflush(); + check_cursh_sig(SIGINT); } } break; -- Peter Stephenson Web page now at http://homepage.ntlworld.com/p.w.stephenson/