mirror of
git://slackware.nl/current.git
synced 2025-02-05 20:46:11 +01:00
109 lines
2 KiB
Diff
109 lines
2 KiB
Diff
![]() |
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;
|
||
|
}
|