diff -ur netbsd-sh/jobs.c netbsd-sh-/jobs.c --- netbsd-sh/jobs.c Tue May 23 12:03:19 2000 +++ netbsd-sh-/jobs.c Mon Apr 23 23:31:47 2001 @@ -92,6 +92,7 @@ int initialpgrp; /* pgrp of shell on invocation */ short curjob; /* current job */ #endif +STATIC int intreceived; STATIC void restartjob __P((struct job *)); STATIC void freejob __P((struct job *)); @@ -101,8 +102,10 @@ STATIC int waitproc __P((int, int *)); STATIC void cmdtxt __P((union node *)); STATIC void cmdputs __P((const char *)); +STATIC void waitonint(int); +#if JOBS /* * Turn job control on and off. * @@ -171,6 +174,7 @@ } jobctl = on; } +#endif #ifdef mkinit @@ -594,9 +598,6 @@ TRACE(("Child shell %d\n", getpid())); wasroot = rootshell; rootshell = 0; - for (i = njobs, p = jobtab ; --i >= 0 ; p++) - if (p->used) - freejob(p); closescript(); INTON; clear_traps(); @@ -642,6 +643,9 @@ } } #endif + for (i = njobs, p = jobtab ; --i >= 0 ; p++) + if (p->used) + freejob(p); if (wasroot && iflag) { setsignal(SIGINT); setsignal(SIGQUIT); @@ -701,13 +705,33 @@ #endif int status; int st; + struct sigaction act, oact; INTOFF; + intreceived = 0; +#if JOBS + if (!jobctl) { +#else + if (!iflag) { +#endif + sigaction(SIGINT, 0, &act); + act.sa_handler = waitonint; + sigaction(SIGINT, &act, &oact); + } TRACE(("waitforjob(%%%d) called\n", jp - jobtab + 1)); while (jp->state == 0) { dowait(1, jp); } #if JOBS + if (!jobctl) { +#else + if (!iflag) { +#endif + extern char *trap[]; + sigaction(SIGINT, &oact, 0); + if (intreceived && trap[SIGINT]) kill(getpid(), SIGINT); + } +#if JOBS if (jp->jobctl) { #ifdef OLD_TTY_DRIVER if (ioctl(2, TIOCSPGRP, (char *)&mypgrp) < 0) @@ -896,10 +920,10 @@ #ifdef BSD int flags; -#if JOBS - flags = WUNTRACED; -#else flags = 0; +#if JOBS + if (jobctl) + flags |= WUNTRACED; #endif if (block == 0) flags |= WNOHANG; @@ -1139,4 +1163,9 @@ } } cmdnextc = q; +} + +STATIC void waitonint(int sig) { + intreceived = 1; + return; }