1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-10-28 05:00:59 +01:00

18319: Philippe Troin: fix use of process groups with su and suspend

This commit is contained in:
Peter Stephenson 2003-03-07 12:17:49 +00:00
parent 1c300357f5
commit a7dc5d386c
4 changed files with 92 additions and 49 deletions

View file

@ -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);