diff options
Diffstat (limited to 'source/ap/ash/patches/ash-jobs.patch')
-rw-r--r-- | source/ap/ash/patches/ash-jobs.patch | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/source/ap/ash/patches/ash-jobs.patch b/source/ap/ash/patches/ash-jobs.patch new file mode 100644 index 000000000..9e89118f5 --- /dev/null +++ b/source/ap/ash/patches/ash-jobs.patch @@ -0,0 +1,108 @@ +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; + } |