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);
/* Called after fork(), in child */
#if !JOBS
# define forkchild(jp, n, mode) forkchild(jp, mode)
#endif
static void
forkchild(struct job *jp, /*union node *n,*/ int mode)
forkchild(struct job *jp, union node *n, int mode)
{
int oldlvl;
@ -4598,6 +4601,13 @@ forkchild(struct job *jp, /*union node *n,*/ int mode)
* Take care of the second rule: */
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)
freejob(jp);
jobless = 0;
@ -4659,7 +4669,7 @@ forkshell(struct job *jp, union node *n, int mode)
ash_msg_and_raise_error("can't fork");
}
if (pid == 0)
forkchild(jp, /*n,*/ mode);
forkchild(jp, n, mode);
else
forkparent(jp, n, mode, pid);
return pid;