diff -rc zsh-4.0.6.orig/Src/init.c zsh-4.0.6/Src/init.c *** zsh-4.0.6.orig/Src/init.c Fri Aug 9 06:30:22 2002 --- zsh-4.0.6/Src/init.c Fri Oct 25 19:28:31 2002 *************** *** 459,477 **** opts[USEZLE] = 0; #ifdef JOB_CONTROL ! /* If interactive, make the shell the foreground process */ if (opts[MONITOR] && interact && (SHTTY != -1)) { if ((mypgrp = GETPGRP()) > 0) { while ((ttpgrp = gettygrp()) != -1 && ttpgrp != mypgrp) { - sleep(1); /* give parent time to change pgrp */ mypgrp = GETPGRP(); ! if (mypgrp == mypid) ! attachtty(mypgrp); if (mypgrp == gettygrp()) break; ! killpg(mypgrp, SIGTTIN); mypgrp = GETPGRP(); } } else opts[MONITOR] = 0; } else --- 459,498 ---- opts[USEZLE] = 0; #ifdef JOB_CONTROL ! /* If interactive, make sure the shell is in the foreground and is the ! * process group leader. ! */ ! mypid = (zlong)getpid(); if (opts[MONITOR] && interact && (SHTTY != -1)) { if ((mypgrp = GETPGRP()) > 0) { + sigset_t blockset, oldset; + sigemptyset(&blockset); + sigaddset(&blockset, SIGTTIN); + sigaddset(&blockset, SIGTTOU); + sigaddset(&blockset, SIGTSTP); + oldset = signal_block(blockset); while ((ttpgrp = gettygrp()) != -1 && ttpgrp != mypgrp) { mypgrp = GETPGRP(); ! if (mypgrp == mypid) { ! signal_setmask(oldset); ! attachtty(mypgrp); /* Might generate SIGT* */ ! signal_block(blockset); ! } if (mypgrp == gettygrp()) break; ! signal_setmask(oldset); ! read(0, NULL, 0); /* Might generate SIGT* */ ! signal_block(blockset); mypgrp = GETPGRP(); } + if (mypgrp != mypid) { + if (setpgrp(0, 0) == 0) { + mypgrp = mypid; + attachtty(mypgrp); + } else + opts[MONITOR] = 0; + } + signal_setmask(oldset); } else opts[MONITOR] = 0; } else