Date: Thu, 12 Feb 1998 16:05:47 +1100 From: Bruce Evans <bde@zeta.org.au> To: bde@zeta.org.au, cracauer@cons.org Cc: freebsd-current@FreeBSD.ORG Subject: Re: cvs commit: src/bin/sh jobs.c Message-ID: <199802120505.QAA03695@godzilla.zeta.org.au>
next in thread | raw e-mail | index | archive | help
This version works bug-for-bug compatibly with bash-2 on tests 01-05.
It handles SIGINT "right". It ignores SIGQUIT unless SIGQUIT is
trapped.
SIGQUIT handling is currently not critical for emacs, due to a bug in
the tty driver. Emacs sets both the intr and the quit character to ^G.
I think the tty driver should generate both a SIGINT and a SIGQUIT when
^G is hit, but it only generates a SIGINT.
Another test:
#!./testshell
while :; cat; done
Sending a SIGINT to `cat' alone doesn't terminate bash. The change in
jobs.c is to make it not terminate sh.
Bruce
diff -c2 error.c~ error.c
*** error.c~ Tue Apr 29 04:24:04 1997
--- error.c Thu Feb 12 11:22:06 1998
***************
*** 90,97 ****
* that SIGINT is to be trapped or ignored using the trap builtin, then
* this routine is not called.) Suppressint is nonzero when interrupts
! * are held using the INTOFF macro. The call to _exit is necessary because
! * there is a short period after a fork before the signal handlers are
! * set to the appropriate value for the child. (The test for iflag is
! * just defensive programming.)
*/
--- 90,97 ----
* that SIGINT is to be trapped or ignored using the trap builtin, then
* this routine is not called.) Suppressint is nonzero when interrupts
! * are held using the INTOFF macro. If SIGINTs are not suppressed and
! * the shell is not a root shell, then we want to be terminated if we
! * get here, as if we were terminated directly by a SIGINT. Arrange for
! * this here.
*/
***************
*** 107,115 ****
sigemptyset(&sigset);
sigprocmask(SIG_SETMASK, &sigset, NULL);
! out2str("\n");
! if (rootshell && iflag)
exraise(EXINT);
! else
! _exit(128 + SIGINT);
}
--- 107,117 ----
sigemptyset(&sigset);
sigprocmask(SIG_SETMASK, &sigset, NULL);
! write(STDERR_FILENO, "\n", 1);
! if (rootshell /* && iflag ?? */)
exraise(EXINT);
! else {
! signal(SIGINT, SIG_DFL);
! kill(getpid(), SIGINT);
! }
}
diff -c2 jobs.c~ jobs.c
*** jobs.c~ Sun Feb 8 20:50:06 1998
--- jobs.c Thu Feb 12 11:19:43 1998
***************
*** 726,732 ****
if (! JOBS || jp->state == JOBDONE)
freejob(jp);
! CLEAR_PENDING_INT;
! if (WIFSIGNALED(status) && WTERMSIG(status) == SIGINT)
! kill(getpid(), SIGINT);
INTON;
return st;
--- 726,735 ----
if (! JOBS || jp->state == JOBDONE)
freejob(jp);
! if (int_pending()) {
! if (WIFSIGNALED(status) && WTERMSIG(status) == SIGINT)
! kill(getpid(), SIGINT);
! else
! CLEAR_PENDING_INT;
! }
INTON;
return st;
diff -c2 trap.c~ trap.c
*** trap.c~ Tue Nov 11 18:15:35 1997
--- trap.c Thu Feb 12 14:45:23 1998
***************
*** 220,228 ****
else
action = S_IGN;
! if (rootshell && action == S_DFL) {
switch (signo) {
case SIGINT:
! if (iflag)
! action = S_CATCH;
break;
case SIGQUIT:
--- 220,227 ----
else
action = S_IGN;
! if (action == S_DFL) {
switch (signo) {
case SIGINT:
! action = S_CATCH;
break;
case SIGQUIT:
***************
*** 235,241 ****
}
#endif
! /* FALLTHROUGH */
case SIGTERM:
! if (iflag)
action = S_IGN;
break;
--- 234,241 ----
}
#endif
! action = S_IGN;
! break;
case SIGTERM:
! if (rootshell && iflag)
action = S_IGN;
break;
***************
*** 243,247 ****
case SIGTSTP:
case SIGTTOU:
! if (mflag)
action = S_IGN;
break;
--- 243,247 ----
case SIGTSTP:
case SIGTTOU:
! if (rootshell && mflag)
action = S_IGN;
break;
***************
*** 402,406 ****
int on;
{
! static int is_interactive = 0;
if (on == is_interactive)
--- 402,406 ----
int on;
{
! static int is_interactive = -1;
if (on == is_interactive)
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199802120505.QAA03695>
