Lines Matching refs:pw

169 #   define job_unstop(pw)
184 register struct process *pw,*pwnext;
191 for(pw=job.pwlist;pw;pw=pwnext)
193 pwnext = pw->p_nxtjob;
194 if((pw->p_flag&(P_BG|P_DONE)) != (P_BG|P_DONE))
196 pw->p_flag &= ~P_BG;
199 shp->bckpid = pw->p_pid;
200 shp->savexit = pw->p_exit;
201 if(pw->p_flag&P_SIGNALLED)
204 if(pw->p_pid==bckpid && unpost)
205 job_unpost(pw,0);
247 register struct process *pw;
299 if(!(pw=job_bypid(pid)))
302 sfprintf(sfstderr,"ksh: job line %4d: reap pid=%d critical=%d unknown job pid=%d pw=%x\n",__LINE__,getpid(),job.in_critical,pid,pw);
306 pw = &dummy;
307 pw->p_exit = 0;
308 pw->p_pgrp = 0;
309 pw->p_exitmin = 0;
313 pw->p_flag = 0;
314 lastpid = pw->p_pid = pid;
324 px=job_byjid(pw->p_job);
334 pw->p_flag |= (P_NOTIFY|P_SIGNALLED|P_STOPPED);
335 pw->p_exit = WSTOPSIG(wstat);
336 if(pw->p_pgrp && pw->p_pgrp==job.curpgid && sh_isstate(SH_STOPOK))
337 sh_fault(pw->p_exit);
341 pw->p_flag &= ~(P_NOTIFY|P_SIGNALLED|P_STOPPED);
356 pw->p_flag &= ~(P_STOPPED|P_SIGNALLED);
359 pw->p_flag |= (P_DONE|P_NOTIFY|P_SIGNALLED);
361 pw->p_flag |= P_COREDUMP;
362 pw->p_exit = WTERMSIG(wstat);
366 if(pw->p_pgrp && pw->p_pgrp==job.curpgid && pw->p_exit==SIGINT && sh_isstate(SH_STOPOK))
368 pw->p_flag &= ~P_NOTIFY;
376 pw->p_flag |= (P_DONE|P_NOTIFY);
377 pw->p_exit = pw->p_exitmin;
378 if(WEXITSTATUS(wstat) > pw->p_exitmin)
379 pw->p_exit = WEXITSTATUS(wstat);
382 if((pw->p_flag&P_DONE) && (pw->p_flag&P_BG))
394 pw->p_flag &= ~P_BG;
397 if(pw->p_pgrp==0)
398 pw->p_flag &= ~P_NOTIFY;
400 if(jp && pw== &dummy)
402 jp->exitval = pw->p_exit;
403 if(pw->p_flag&P_SIGNALLED)
407 sfprintf(sfstderr,"ksh: job line %4d: reap pid=%d critical=%d job %d with pid %d flags=%o complete with status=%x exit=%d\n",__LINE__,getpid(),job.in_critical,pw->p_job,pid,pw->p_flag,wstat,pw->p_exit);
411 if(px && pw != px)
412 pw->p_flag &= ~P_NOTIFY;
413 if(pid==pw->p_fgrp && pid==tcgetpgrp(JOBTTY))
415 px = job_byjid((int)pw->p_job);
440 job_list(pw,JOB_NFLAG|JOB_NLFLAG);
441 job_unpost(pw,1);
613 register struct process *pw;
624 for(pw=job.pwlist;pw;pw=pw->p_nxtjob)
626 if(!(pw->p_flag&P_STOPPED))
628 if(!(pw->p_flag&P_DONE))
633 killpg(pw->p_pgrp,SIGTERM);
688 static void job_set(register struct process *pw)
692 if(pw->p_flag&P_STTY)
695 tty_set(job.fd,TCSAFLUSH,&pw->p_stty);
698 if((pw->p_flag&P_STOPPED) || tcgetpgrp(job.fd) == sh.pid)
699 tcsetpgrp(job.fd,pw->p_fgrp);
701 job_unstop(pw);
705 static void job_reset(register struct process *pw)
709 job_fgrp(pw,tcgetpgrp(job.fd));
714 if(!(pw->p_flag&P_FG))
716 if(pw && (pw->p_flag&P_SIGNALLED) && pw->p_exit!=SIGHUP)
718 if(tty_get(job.fd,&pw->p_stty) == 0)
719 pw->p_flag |= P_STTY;
734 register struct process *pw;
744 pw = job_bystring(jp);
746 if(pw)
747 pid = pw->p_pid;
765 register struct process *pw;
773 pw = job.pwlist;
777 for(;pw;pw=px)
779 px = pw->p_nxtjob;
780 if(pw->p_env != sh.jobenv)
782 if((*fun)(pw,arg))
789 while(pw && (pw->p_env!=sh.jobenv || pw->p_pgrp==0))
790 pw = pw->p_nxtjob;
791 if((*fun)(pw,arg))
800 pw = job_bystring(jobid);
810 if(!(pw = job_bypid(pid)))
812 pw = &dummy;
813 pw->p_pid = pid;
814 pw->p_pgrp = pid;
818 if((*fun)(pw,arg))
829 int job_terminate(register struct process *pw,register int sig)
831 if(pw->p_pgrp && !(pw->p_flag&P_DISOWN))
832 job_kill(pw,sig);
843 int job_list(struct process *pw,register int flag)
845 register struct process *px = pw;
849 if(!pw || pw->p_job<=0)
851 if(pw->p_env != sh.jobenv)
911 hist_list(sh.hist_ptr,outfile,pw->p_name,0,";");
926 register struct process *pw=job.pwlist;
928 if(*ajob++ != '%' || !pw)
932 pw = job_byjid((int)strtol(ajob, (char**)0, 10));
937 if(pw)
938 pw = job.pwlist->p_nxtjob;
941 pw = job_byname(ajob);
942 if(pw && pw->p_flag)
943 return(pw);
951 int job_kill(register struct process *pw,register int sig)
963 if(pw==0)
965 pid = pw->p_pid;
983 if(pw->p_flag&P_STOPPED)
984 pw->p_flag &= ~(P_STOPPED|P_SIGNALLED);
993 job_unstop(job_bypid(pw->p_pid));
1008 if(pid = pw->p_pgrp)
1013 job_unstop(pw);
1018 while(pw && pw->p_pgrp==0 && (r=kill(pw->p_pid,sig))>=0)
1022 kill(pw->p_pid,SIGCONT);
1024 pw = pw->p_nxtproc;
1030 if(pw && by_number)
1051 register struct process *pw = job.pwlist;
1060 for(;pw;pw=pw->p_nxtjob)
1062 if(hist_match(sh.hist_ptr,pw->p_name,cp,flag)>=0)
1066 pz = pw;
1085 register struct process *pw, *px;
1090 for(pw=job.pwlist; pw; pw=pwnext)
1092 pwnext = pw->p_nxtjob;
1093 while(px=pw)
1095 pw = pw->p_nxtproc;
1129 register struct process *pw;
1153 if(pw = job_bypid(pid))
1154 job_unpost(pw,0);
1155 if(join && (pw=job_bypid(join)))
1158 if((pw=job_byjid(pw->p_job)) != job.pwlist)
1160 job_unlink(pw);
1161 pw->p_nxtjob = job.pwlist;
1162 job.pwlist = pw;
1165 if(pw=freelist)
1166 freelist = pw->p_nxtjob;
1168 pw = new_of(struct process,0);
1169 pw->p_flag = 0;
1174 pw->p_nxtjob = job.pwlist->p_nxtjob;
1175 pw->p_nxtproc = job.pwlist;
1176 pw->p_job = job.pwlist->p_job;
1181 while((pw->p_job = job_alloc()) < 0)
1183 pw->p_nxtjob = job.pwlist;
1184 pw->p_nxtproc = 0;
1186 job.pwlist = pw;
1187 pw->p_env = sh.curenv;
1188 pw->p_pid = pid;
1190 pw->p_flag = P_EXITSAVE;
1191 pw->p_exitmin = sh.xargexit;
1192 pw->p_exit = 0;
1197 pw->p_fgrp = job.curpgid;
1200 pw->p_fgrp = 0;
1201 pw->p_pgrp = pw->p_fgrp;
1203 sfprintf(sfstderr,"ksh: job line %4d: post pid=%d critical=%d job=%d pid=%d pgid=%d savesig=%d join=%d\n",__LINE__,getpid(),job.in_critical,pw->p_job,
1204 pw->p_pid,pw->p_pgrp,job.savesig,join);
1209 pw->p_name=hist_tell(sh.hist_ptr,(int)hp->histind-1);
1211 pw->p_name = -1;
1215 pw->p_exit = val;
1216 if(pw->p_exit==SH_STOPSIG)
1218 pw->p_flag |= (P_SIGNALLED|P_STOPPED);
1219 pw->p_exit = 0;
1221 else if(pw->p_exit >= SH_EXITSIG)
1223 pw->p_flag |= P_DONE|P_SIGNALLED;
1224 pw->p_exit &= SH_EXITMASK;
1227 pw->p_flag |= (P_DONE|P_NOTIFY);
1230 if(bg && !(pw->p_flag&P_DONE))
1231 pw->p_flag |= P_BG;
1235 return(pw->p_job);
1244 register struct process *pw, *px;
1245 for(pw=job.pwlist; pw; pw=pw->p_nxtjob)
1246 for(px=pw; px; px=px->p_nxtproc)
1260 register struct process *pw;
1261 for(pw=job.pwlist;pw; pw = pw->p_nxtjob)
1263 if(pw->p_job==jobid)
1266 return(pw);
1272 static void job_prmsg(register struct process *pw)
1274 if(pw->p_exit!=SIGINT && pw->p_exit!=SIGPIPE)
1277 msg = job_sigmsg((int)(pw->p_exit));
1279 if(pw->p_flag&P_COREDUMP)
1286 errormsg(SH_DICT,2,"%d: %s%s",pw->p_pid,msg,dump);
1300 register struct process *pw=0,*px;
1316 if(!(pw=job_bypid(pid)))
1325 else if(intr && pw->p_env!=sh.curenv)
1331 jobid = pw->p_job;
1333 pw->p_flag &= ~P_EXITSAVE;
1334 if(pw->p_pgrp && job.parent!= (pid_t)-1)
1337 pwfg = pw;
1340 if(pw)
1341 sfprintf(sfstderr,"ksh: job line %4d: wait pid=%d critical=%d flags=%o\n",__LINE__,getpid(),job.in_critical,pw->p_flag);
1356 if(px!=pw && (px->p_flag&P_NOTIFY))
1372 if(pw && (pw->p_flag&(P_DONE|P_STOPPED)))
1375 if(pw->p_flag&P_STOPPED)
1377 pw->p_flag |= P_EXITSAVE;
1380 if( pw->p_exit!=SIGTTIN && pw->p_exit!=SIGTTOU)
1383 killpg(pw->p_pgrp,SIGCONT);
1386 pw->p_flag &= ~(P_NOTIFY|P_SIGNALLED|P_STOPPED|P_EXITSAVE);
1391 if(pw->p_flag&P_SIGNALLED)
1393 pw->p_flag &= ~P_NOTIFY;
1394 job_prmsg(pw);
1396 else if(pw->p_flag&P_DONE)
1397 pw->p_flag &= ~P_NOTIFY;
1398 if(pw->p_job==jobid)
1411 px = pw;
1413 else if(px!=pw)
1424 px = job_unpost(pw,1);
1427 pw = px;
1448 if(pw->p_pgrp)
1450 job_reset(pw);
1452 if((pw->p_flag&P_SIGNALLED) && pw->p_exit==SIGINT && !(sh.sigflag[SIGINT]&SH_SIGOFF))
1455 else if((pw->p_flag&P_STOPPED) && pw->p_exit==SIGTSTP)
1464 if(pw->p_pid == tcgetpgrp(JOBTTY))
1466 if(pw->p_pgrp==0)
1467 pw->p_pgrp = pw->p_pid;
1468 job_reset(pw);
1478 for(pw=job.pwlist; pw; pw=px)
1480 px = pw->p_nxtjob;
1481 job_unpost(pw,0);
1494 int job_switch(register struct process *pw,int bgflag)
1498 if(!pw || !(pw=job_byjid((int)pw->p_job)))
1505 for(; pw; pw=pw->p_nxtproc)
1506 pw->p_flag |= P_DISOWN;
1513 sfprintf(outfile,"[%d]\t",(int)pw->p_job);
1514 sh.bckpid = pw->p_pid;
1516 pw->p_flag |= P_BG;
1522 job_unlink(pw);
1523 pw->p_nxtjob = job.pwlist;
1524 job.pwlist = pw;
1527 hist_list(sh.hist_ptr,outfile,pw->p_name,'&',";");
1532 if(!(pw=job_unpost(pw,1)))
1538 pw->p_flag |= P_FG;
1540 pw->p_flag &= ~P_BG;
1542 job_wait(pw->p_pid);
1545 else if(pw->p_flag&P_STOPPED)
1546 job_unstop(pw);
1558 static void job_fgrp(register struct process *pw, int newgrp)
1560 for(; pw; pw=pw->p_nxtproc)
1561 pw->p_fgrp = newgrp;
1570 register struct process *pw;
1572 for(pw=px ;pw ;pw=pw->p_nxtproc)
1574 if(pw->p_flag&P_STOPPED)
1577 pw->p_flag &= ~(P_STOPPED|P_SIGNALLED|P_NOTIFY);
1599 register struct process *pw;
1605 pwtop = pw = job_byjid((int)pwtop->p_job);
1607 if(pw->p_flag&P_BG)
1608 return(pw);
1610 for(; pw && (pw->p_flag&P_DONE)&&(notify||!(pw->p_flag&P_NOTIFY)||pw->p_env); pw=pw->p_nxtproc);
1611 if(pw)
1612 return(pw);
1615 for(pw=pwtop; pw; pw=pw->p_nxtproc)
1618 if((pw->p_flag&P_EXITSAVE) || pw->p_pid==sh.spid)
1622 if(jp = jobsave_create(pw->p_pid))
1624 jp->exitval = pw->p_exit;
1625 if(pw->p_flag&P_SIGNALLED)
1628 pw->p_flag &= ~P_EXITSAVE;
1630 pw->p_flag &= ~P_DONE;
1632 pw->p_nxtjob = freelist;
1633 freelist = pw;
1647 static void job_unlink(register struct process *pw)
1650 if(pw==job.pwlist)
1652 job.pwlist = pw->p_nxtjob;
1657 if(px->p_nxtjob == pw)
1659 px->p_nxtjob = pw->p_nxtjob;
1679 register struct process *pw;
1682 if((pw=job_byjid(j))&& !job_unpost(pw,0))
1795 register struct process *pw, *px, *pwnext;
1810 for(pw=job.pwlist; pw; pw=pwnext)
1812 pwnext = pw->p_nxtjob;
1813 if(pw->p_env != sh.curenv || pw->p_pid==sh.pipepid)
1815 for(px=pw; px; px=px->p_nxtproc)
1817 job_unpost(pw,0);