ash: make "jobs" work even in subshells

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2009-07-24 00:16:59 +02:00
parent 86e83ec487
commit e56f22ac60

View File

@ -4541,8 +4541,11 @@ clear_traps(void)
static void closescript(void); static void closescript(void);
/* Called after fork(), in child */ /* Called after fork(), in child */
#if !JOBS
# define forkchild(jp, n, mode) forkchild(jp, mode)
#endif
static void static void
forkchild(struct job *jp, /*union node *n,*/ int mode) forkchild(struct job *jp, union node *n, int mode)
{ {
int oldlvl; int oldlvl;
@ -4598,6 +4601,13 @@ forkchild(struct job *jp, /*union node *n,*/ int mode)
* Take care of the second rule: */ * Take care of the second rule: */
setsignal(SIGQUIT); setsignal(SIGQUIT);
} }
#if JOBS
if (n && n->type == NCMD && strcmp(n->ncmd.args->narg.text, "jobs") == 0) {
TRACE(("Job hack\n"));
freejob(curjob);
return;
}
#endif
for (jp = curjob; jp; jp = jp->prev_job) for (jp = curjob; jp; jp = jp->prev_job)
freejob(jp); freejob(jp);
jobless = 0; jobless = 0;
@ -4659,7 +4669,7 @@ forkshell(struct job *jp, union node *n, int mode)
ash_msg_and_raise_error("can't fork"); ash_msg_and_raise_error("can't fork");
} }
if (pid == 0) if (pid == 0)
forkchild(jp, /*n,*/ mode); forkchild(jp, n, mode);
else else
forkparent(jp, n, mode, pid); forkparent(jp, n, mode, pid);
return pid; return pid;