- else {
- savint = signal(SIGINT, SIG_IGN);
- ochild = child; osetintr = setintr;
- ohaderr = haderr; otimflg = timflg;
- odidfds = didfds; odidcch = didcch;
- oSHIN = SHIN; oSHOUT = SHOUT;
- oSHDIAG = SHDIAG; oOLDSTD = OLDSTD;
- Vsav = Vdp = 0; Vav = 0;
- isvfork++;
- pid = vfork();
- if (pid < 0) {
- signal(SIGINT, savint);
- error("No more processes");
- }
- if (pid == 0) {
- child++;
- signal(SIGINT, shudint ? SIG_DFL : savint);
- if (!shudhup)
- signal(SIGHUP, SIG_IGN);
- } else {
- child = ochild; setintr = osetintr;
- haderr = ohaderr; timflg = otimflg;
- didfds = odidfds; didcch = odidcch;
- SHIN = oSHIN; SHOUT = oSHOUT;
- SHDIAG = oSHDIAG; OLDSTD = oOLDSTD;
- xfree(Vsav), Vsav = 0;
- xfree(Vdp), Vdp = 0;
- xfree(Vav), Vav = 0;
- signal(SIGINT, savint);
+ else {
+ int vffree();
+ int ochild, osetintr, ohaderr, odidfds, odidcch;
+ int oSHIN, oSHOUT, oSHDIAG, oOLDSTD, otpgrp;
+
+ sighold(SIGCHLD);
+ ochild = child; osetintr = setintr;
+ ohaderr = haderr; odidfds = didfds; odidcch = didcch;
+ oSHIN = SHIN; oSHOUT = SHOUT;
+ oSHDIAG = SHDIAG; oOLDSTD = OLDSTD; otpgrp = tpgrp;
+ Vsav = Vdp = 0; Vav = 0;
+ pid = vfork();
+ if (pid < 0) {
+ sigrelse(SIGCHLD);
+ error("No more processes");
+ }
+ forked++;
+ if (pid) {
+ child = ochild; setintr = osetintr;
+ haderr = ohaderr; didfds = odidfds;
+ didcch = odidcch; SHIN = oSHIN;
+ SHOUT = oSHOUT; SHDIAG = oSHDIAG;
+ OLDSTD = oOLDSTD; tpgrp = otpgrp;
+ xfree(Vsav); Vsav = 0;
+ xfree(Vdp); Vdp = 0;
+ xfree(Vav); Vav = 0;
+ /* this is from pfork() */
+ palloc(pid, t);
+ sigrelse(SIGCHLD);
+ } else {
+ /* this is from pfork() */
+ int pgrp;
+ bool ignint = 0;
+
+ if (setintr)
+ ignint =
+ (tpgrp == -1 && (t->t_dflg&FINT))
+ || gointr && eq(gointr, "-");
+ pgrp = pcurrjob ? pcurrjob->p_jobid : getpid();
+ child++;
+ if (setintr) {
+ setintr = 0;
+ sigsys(SIGCHLD, SIG_DFL);
+ sigsys(SIGINT, ignint ? SIG_IGN : vffree);
+ sigsys(SIGQUIT, ignint ? SIG_IGN : SIG_DFL);
+ if (wanttty >= 0) {
+ sigsys(SIGTSTP, SIG_DFL);
+ sigsys(SIGTTIN, SIG_DFL);
+ sigsys(SIGTTOU, SIG_DFL);
+ }
+ sigsys(SIGTERM, parterm);
+ } else if (tpgrp == -1 && (t->t_dflg&FINT)) {
+ sigsys(SIGINT, SIG_IGN);
+ sigsys(SIGQUIT, SIG_IGN);