Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 7 Feb 1998 06:28:44 +1100
From:      Bruce Evans <bde@zeta.org.au>
To:        cracauer@FreeBSD.ORG, cvs-all@FreeBSD.ORG, cvs-bin@FreeBSD.ORG, cvs-committers@FreeBSD.ORG
Subject:   Re: cvs commit: src/bin/sh jobs.c
Message-ID:  <199802061928.GAA07506@godzilla.zeta.org.au>

next in thread | raw e-mail | index | archive | help
>  Modified files:
>    bin/sh               jobs.c 
>  Log:
>  Fix handling of SIGINT/SIGQUIT for foreground subprocesses. Most
>  urgent need is when you run sh around a program that intentionally
>  uses SIGQUIT/SIGINT for asynchronous events, i.e. $EDITOR started from
>  system(2), like many mailers do. This fixes PR bin/1206 and possibly
>  bin/4241.
>  
>  The solution committed has been tested for a large number of possible
>  cases (see recent discussion on cvs-committers). I completed a make
>  world, made sure 'make world' is interruptable and used the changed
>  /bin/sh as a login shell all day, including job control and using
>  SIGQUIT-catching programs (to write this message :-).
>  
>  PR:		bin/1206
>  Reviewed by:	discussion on cvs-commiters

I thought we were still discussing it.  I didn't like it before, and
like it less now.  The committed version has the following bugs:

1) SIGINT/SIGQUIT are not restored after fork failure.
2) SIGINT/SIGQUIT are always reset to SIG_DFL in the child.  This is
   wrong if these signals are ignored on entry to the shell.
3) SIGTERM apparently needs to be handled like SIGINT/SIGQUIT.  bash
   seems to handle it like that.

I'm testing the following fix:

diff -c2 trap.c~ trap.c
*** trap.c~	Tue Nov 11 18:15:35 1997
--- trap.c	Fri Feb  6 23:51:08 1998
***************
*** 223,228 ****
  		switch (signo) {
  		case SIGINT:
! 			if (iflag)
! 				action = S_CATCH;
  			break;
  		case SIGQUIT:
--- 223,227 ----
  		switch (signo) {
  		case SIGINT:
! 			action = S_CATCH;
  			break;
  		case SIGQUIT:
***************
*** 239,242 ****
--- 238,243 ----
  			if (iflag)
  				action = S_IGN;
+ 			else
+ 				action = S_CATCH;
  			break;
  #if JOBS
***************
*** 402,406 ****
  	int on;
  {
! 	static int is_interactive = 0;
  
  	if (on == is_interactive)
--- 403,407 ----
  	int on;
  {
! 	static int is_interactive = -1;
  
  	if (on == is_interactive)

Bruce



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199802061928.GAA07506>