mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-24 11:29:10 +00:00
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:
parent
aeb6d603ae
commit
00fc54b03c
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=26104
@ -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));
|
||||
|
Loading…
Reference in New Issue
Block a user