Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 7445888659893398b01d014bc633b458 > files > 31

ksh-20100621-18.el5.src.rpm

diff -up ksh-20100621/src/cmd/ksh93/sh/jobs.c.jobfix002 ksh-20100621/src/cmd/ksh93/sh/jobs.c
--- ksh-20100621/src/cmd/ksh93/sh/jobs.c.jobfix002	2012-11-02 14:38:16.001706540 +0100
+++ ksh-20100621/src/cmd/ksh93/sh/jobs.c	2012-11-02 14:41:16.846287794 +0100
@@ -305,11 +305,14 @@ int job_reap(register int sig)
 			pid = waitpid((pid_t)-1,&wstat,flags&=~WCONTINUED);
 		sh_sigcheck();
 		if(pid<0 && errno==EINTR && (sig||job.savesig))
+		{
+			errno=0;
 			continue;
+		}
 		if(pid<=0)
 			break;
-		/*if(pid==0)
-			job_chksave(pid);*/
+		if(wstat==0)
+			job_chksave(pid);
 		flags |= WNOHANG;
 		job.waitsafe++;
 		jp = 0;
@@ -344,6 +347,10 @@ int job_reap(register int sig)
 			pw->p_flag &= ~(P_NOTIFY|P_SIGNALLED|P_STOPPED);
 		else if(WIFSTOPPED(wstat))
 		{
+			pw->p_flag |= (P_NOTIFY|P_SIGNALLED|P_STOPPED);
+			pw->p_exit = WSTOPSIG(wstat);
+			if(pw->p_pgrp && pw->p_pgrp==job.curpgid && sh_isstate(SH_STOPOK))
+				kill(getpid(),pw->p_exit); 
 			if(px)
 			{
 				/* move to top of job list */
@@ -351,10 +358,6 @@ int job_reap(register int sig)
 				px->p_nxtjob = job.pwlist;
 				job.pwlist = px;
 			}
-			pw->p_flag |= (P_NOTIFY|P_SIGNALLED|P_STOPPED);
-			pw->p_exit = WSTOPSIG(wstat);
-			if(pw->p_pgrp && pw->p_pgrp==job.curpgid && sh_isstate(SH_STOPOK))
-				sh_fault(pw->p_exit); 
 			continue;
 		}
 		else
@@ -1860,14 +1863,14 @@ void job_fork(pid_t parent)
 		jobfork++;
 		break;
 	case 0:
+		jobfork=0;
 		job_unlock();
-		jobfork--;
 		job.waitsafe = 0;
 		job.in_critical = 0;
 		break;
 	default:
-		jobfork--;
-// 		job_chksave(parent);
+		job_chksave(parent);
+		jobfork=0;
 		job_unlock();
 		break;
 	}