Make sh(1) less aware of the bit fields returned by wait by

using the WIF* macros in sys/wait.h.

PR: bin/3668
Submitted by:	dholland@eecs.harvard.edu
This commit is contained in:
Steve Price 1997-05-24 21:04:55 +00:00
parent aeb6d603ae
commit 00fc54b03c

View File

@ -33,7 +33,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: jobs.c,v 1.13 1997/04/28 03:06:34 steve Exp $
* $Id: jobs.c,v 1.14 1997/05/19 00:18:42 steve Exp $
*/
#ifndef lint
@ -243,7 +243,7 @@ restartjob(jp)
INTOFF;
killpg(jp->ps[0].pid, SIGCONT);
for (ps = jp->ps, i = jp->nprocs ; --i >= 0 ; ps++) {
if ((ps->status & 0377) == 0177) {
if (WIFSTOPPED(ps->status)) {
ps->status = -1;
jp->state = 0;
}
@ -306,19 +306,20 @@ showjobs(change)
s[0] = '\0';
if (ps->status == -1) {
/* don't print anything */
} else if ((ps->status & 0xFF) == 0) {
fmtstr(s, 64, "Exit %d", ps->status >> 8);
} else if (WIFEXITED(ps->status)) {
fmtstr(s, 64, "Exit %d", WEXITSTATUS(ps->status));
} else {
i = ps->status;
#if JOBS
if ((i & 0xFF) == 0177)
i >>= 8;
if (WIFSTOPPED(ps->status))
i = WSTOPSIG(ps->status);
else
#endif
i = WTERMSIG(ps->status);
if ((i & 0x7F) < NSIG && sys_siglist[i & 0x7F])
scopy(sys_siglist[i & 0x7F], s);
else
fmtstr(s, 64, "Signal %d", i & 0x7F);
if (i & 0x80)
if (WCOREDUMP(ps->status))
strcat(s, " (core dumped)");
}
out1str(s);
@ -374,7 +375,7 @@ waitcmd(argc, argv)
char **argv;
{
struct job *job;
int status;
int status, retval;
struct job *jp;
if (argc > 1) {
@ -386,17 +387,17 @@ waitcmd(argc, argv)
if (job != NULL) {
if (job->state) {
status = job->ps[job->nprocs - 1].status;
if ((status & 0xFF) == 0)
status = status >> 8 & 0xFF;
if (WIFEXITED(status))
retval = WEXITSTATUS(status);
#if JOBS
else if ((status & 0xFF) == 0177)
status = (status >> 8 & 0x7F) + 128;
else if (WIFSTOPPED(status))
retval = WSTOPSIG(status) + 128;
#endif
else
status = (status & 0x7F) + 128;
retval = WTERMSIG(status) + 128;
if (! iflag)
freejob(job);
return status;
return retval;
}
} else {
for (jp = jobtab ; ; jp++) {
@ -714,18 +715,18 @@ waitforjob(jp)
#endif
status = jp->ps[jp->nprocs - 1].status;
/* convert to 8 bits */
if ((status & 0xFF) == 0)
st = status >> 8 & 0xFF;
if (WIFEXITED(status))
st = WEXITSTATUS(status);
#if JOBS
else if ((status & 0xFF) == 0177)
st = (status >> 8 & 0x7F) + 128;
else if (WIFSTOPPED(status))
st = WSTOPSIG(status) + 128;
#endif
else
st = (status & 0x7F) + 128;
st = WTERMSIG(status) + 128;
if (! JOBS || jp->state == JOBDONE)
freejob(jp);
CLEAR_PENDING_INT;
if ((status & 0x7F) == SIGINT)
if (WIFSIGNALED(status) && WTERMSIG(status) == SIGINT)
kill(getpid(), SIGINT);
INTON;
return st;
@ -750,6 +751,7 @@ dowait(block, job)
int done;
int stopped;
int core;
int sig;
TRACE(("dowait(%d) called\n", block));
do {
@ -768,13 +770,14 @@ dowait(block, job)
if (sp->pid == -1)
continue;
if (sp->pid == pid) {
TRACE(("Changin status of proc %d from 0x%x to 0x%x\n", pid, sp->status, status));
TRACE(("Changing status of proc %d from 0x%x to 0x%x\n",
pid, sp->status, status));
sp->status = status;
thisjob = jp;
}
if (sp->status == -1)
stopped = 0;
else if ((sp->status & 0377) == 0177)
else if (WIFSTOPPED(sp->status))
done = 0;
}
if (stopped) { /* stopped or done */
@ -792,29 +795,35 @@ dowait(block, job)
}
INTON;
if (! rootshell || ! iflag || (job && thisjob == job)) {
core = WCOREDUMP(status);
#if JOBS
if ((status & 0xFF) == 0177)
status >>= 8;
if (WIFSTOPPED(status))
sig = WSTOPSIG(status);
else
#endif
core = status & 0x80;
status &= 0x7F;
if (status != 0 && status != SIGINT && status != SIGPIPE) {
if (WIFEXITED(status))
sig = 0;
else
sig = WTERMSIG(status);
if (sig != 0 && sig != SIGINT && sig != SIGPIPE) {
if (thisjob != job)
outfmt(out2, "%d: ", pid);
#if JOBS
if (status == SIGTSTP && rootshell && iflag)
if (sig == SIGTSTP && rootshell && iflag)
outfmt(out2, "%%%d ", job - jobtab + 1);
#endif
if (status < NSIG && sys_siglist[status])
out2str(sys_siglist[status]);
if (sig < NSIG && sys_siglist[sig])
out2str(sys_siglist[sig]);
else
outfmt(out2, "Signal %d", status);
outfmt(out2, "Signal %d", sig);
if (core)
out2str(" - core dumped");
out2c('\n');
flushout(&errout);
} else {
TRACE(("Not printing status: status=%d\n", status));
TRACE(("Not printing status: status=%d, sig=%d\n",
status, sig));
}
} else {
TRACE(("Not printing status, rootshell=%d, job=0x%x\n", rootshell, job));