summaryrefslogtreecommitdiffstats
path: root/source/ap/ash/patches/ash-jobs.patch
diff options
context:
space:
mode:
Diffstat (limited to 'source/ap/ash/patches/ash-jobs.patch')
-rw-r--r--source/ap/ash/patches/ash-jobs.patch108
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;
+ }