diff options
Diffstat (limited to '')
-rw-r--r-- | src/jobs.c | 10 | ||||
-rw-r--r-- | src/main.c | 3 | ||||
-rw-r--r-- | src/main.h | 6 |
3 files changed, 10 insertions, 9 deletions
diff --git a/src/jobs.c b/src/jobs.c index 132c47a..b82bf50 100644 --- a/src/jobs.c +++ b/src/jobs.c @@ -838,19 +838,19 @@ growjobtab(void) STATIC inline void forkchild(struct job *jp, union node *n, int mode) { - int wasroot; + int oldlvl; pid_t pgrp; TRACE(("Child shell %d\n", getpid())); - wasroot = rootshell; - rootshell = 0; + oldlvl = shlvl; + shlvl++; closescript(); clear_traps(); #if JOBS /* do job control only in root shell */ jobctl = 0; - if (mode != FORK_NOJOB && jp->jobctl && wasroot) { + if (mode != FORK_NOJOB && jp->jobctl && !oldlvl) { if (jp->nprocs == 0) pgrp = getpid(); else @@ -872,7 +872,7 @@ forkchild(struct job *jp, union node *n, int mode) error("Can't open %s", _PATH_DEVNULL); } } - if (wasroot && iflag) { + if (!oldlvl && iflag) { setsignal(SIGINT); setsignal(SIGQUIT); setsignal(SIGTERM); diff --git a/src/main.c b/src/main.c index cbba6c4..0d69e4f 100644 --- a/src/main.c +++ b/src/main.c @@ -85,7 +85,7 @@ __RCSID("$NetBSD: main.c,v 1.46 2002/12/11 19:12:18 christos Exp $"); #define PROFILE 0 int rootpid; -int rootshell; +int shlvl; #ifdef __GLIBC__ int *dash_errno; #endif @@ -174,7 +174,6 @@ main(int argc, char **argv) trputs("Shell args: "); trargs(argv); #endif rootpid = getpid(); - rootshell = 1; init(); setstackmark(&smark); procargs(argc, argv); diff --git a/src/main.h b/src/main.h index c305ab7..6b8e71c 100644 --- a/src/main.h +++ b/src/main.h @@ -42,8 +42,10 @@ /* pid of main shell */ extern int rootpid; -/* true if we aren't a child of the main shell */ -extern int rootshell; +/* shell level: 0 for the main shell, 1 for its children, and so on */ +extern int shlvl; +#define rootshell (!shlvl) + #ifdef __GLIBC__ /* glibc sucks */ extern int *dash_errno; |