diff options
author | Peter Stephenson <pws@users.sourceforge.net> | 2003-03-07 12:17:49 +0000 |
---|---|---|
committer | Peter Stephenson <pws@users.sourceforge.net> | 2003-03-07 12:17:49 +0000 |
commit | a7dc5d386cb46ba7fc3fec583442d63c1cee4f75 (patch) | |
tree | e25b14241c7f62f317916b539450077d0279a08f /Src/exec.c | |
parent | 1c300357f50b3786b3086b6d729bdef1abac7e08 (diff) | |
download | zsh-a7dc5d386cb46ba7fc3fec583442d63c1cee4f75.tar.gz zsh-a7dc5d386cb46ba7fc3fec583442d63c1cee4f75.tar.xz zsh-a7dc5d386cb46ba7fc3fec583442d63c1cee4f75.zip |
18319: Philippe Troin: fix use of process groups with su and suspend
Diffstat (limited to 'Src/exec.c')
-rw-r--r-- | Src/exec.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/Src/exec.c b/Src/exec.c index 978470251..289c7b1fd 100644 --- a/Src/exec.c +++ b/Src/exec.c @@ -1149,7 +1149,7 @@ execpline(Estate state, wordcode slcode, int how, int last1) } else { close(synch[0]); - entersubsh(Z_ASYNC, 0, 0); + entersubsh(Z_ASYNC, 0, 0, 0); if (jobtab[list_pipe_job].procs) { if (setpgrp(0L, mypgrp = jobtab[list_pipe_job].gleader) == -1) { @@ -1258,7 +1258,7 @@ execpline2(Estate state, wordcode pcode, } else { zclose(pipes[0]); close(synch[0]); - entersubsh(how, 2, 0); + entersubsh(how, 2, 0, 0); close(synch[1]); execcmd(state, input, pipes[1], how, 0); _exit(lastval); @@ -2060,7 +2060,7 @@ execcmd(Estate state, int input, int output, int how, int last1) } /* pid == 0 */ close(synch[0]); - entersubsh(how, (type != WC_SUBSH) && !(how & Z_ASYNC) ? 2 : 1, 0); + entersubsh(how, (type != WC_SUBSH) && !(how & Z_ASYNC) ? 2 : 1, 0, 0); close(synch[1]); forked = 1; if (sigtrapped[SIGINT] & ZSIG_IGNORED) @@ -2277,7 +2277,9 @@ execcmd(Estate state, int input, int output, int how, int last1) * exit) in case there is an error return. */ if (is_exec) - entersubsh(how, (type != WC_SUBSH) ? 2 : 1, 1); + entersubsh(how, (type != WC_SUBSH) ? 2 : 1, 1, + (do_exec || (type >= WC_CURSH && last1 == 1)) + && !forked); if (type >= WC_CURSH) { if (last1 == 1) do_exec = 1; @@ -2536,7 +2538,7 @@ forklevel; /**/ static void -entersubsh(int how, int cl, int fake) +entersubsh(int how, int cl, int fake, int revertpgrp) { int sig, monitor; @@ -2580,6 +2582,8 @@ entersubsh(int how, int cl, int fake) } if (!fake) subsh = 1; + if (revertpgrp && getpid() == mypgrp) + release_pgrp(); if (SHTTY != -1) { shout = NULL; zclose(SHTTY); @@ -2769,7 +2773,7 @@ getoutput(char *cmd, int qt) zclose(pipes[0]); redup(pipes[1], 1); opts[MONITOR] = 0; - entersubsh(Z_SYNC, 1, 0); + entersubsh(Z_SYNC, 1, 0, 0); cmdpush(CS_CMDSUBST); execode(prog, 0, 1); cmdpop(); @@ -2900,7 +2904,7 @@ getoutputfile(char *cmd) /* pid == 0 */ redup(fd, 1); opts[MONITOR] = 0; - entersubsh(Z_SYNC, 1, 0); + entersubsh(Z_SYNC, 1, 0, 0); cmdpush(CS_CMDSUBST); execode(prog, 0, 1); cmdpop(); @@ -2980,10 +2984,10 @@ getproc(char *cmd) zerr("can't open %s: %e", pnam, errno); _exit(1); } - entersubsh(Z_ASYNC, 1, 0); + entersubsh(Z_ASYNC, 1, 0, 0); redup(fd, out); #else - entersubsh(Z_ASYNC, 1, 0); + entersubsh(Z_ASYNC, 1, 0, 0); redup(pipes[out], out); closem(0); /* this closes pipes[!out] as well */ #endif @@ -3012,7 +3016,7 @@ getpipe(char *cmd) zclose(pipes[out]); return pipes[!out]; } - entersubsh(Z_ASYNC, 1, 0); + entersubsh(Z_ASYNC, 1, 0, 0); redup(pipes[out], out); closem(0); /* this closes pipes[!out] as well */ cmdpush(CS_CMDSUBST); |