-static char *sccsid = "@(#)proc.c 4.8 (Berkeley) 83/02/03";
+static char *sccsid = "@(#)proc.c 4.12 (Berkeley) 83/07/01";
#include "sh.h"
#include "sh.dir.h"
#include "sh.proc.h"
-#include <wait.h>
+#include <sys/wait.h>
#include <sys/ioctl.h>
/*
register struct process *fp;
int jobflags, reason;
+ while (pp->p_pid != pp->p_jobid)
+ pp = pp->p_friends;
fp = pp;
do {
if ((fp->p_flags&(PFOREGND|PRUNNING)) == PRUNNING)
while((fp = (fp->p_friends)) != pp);
if ((jobflags & PRUNNING) == 0)
break;
- sigpause(SIGCHLD);
+ sigpause(sigblock(0) &~ mask(SIGCHLD));
}
sigrelse(SIGCHLD);
if (tpgrp > 0)
loop:
sighold(SIGCHLD);
for (pp = proclist.p_next; pp; pp = pp->p_next)
- if (pp->p_pid && pp->p_pid == pp->p_jobid &&
+ if (pp->p_pid && /* pp->p_pid == pp->p_jobid && */
pp->p_flags&PRUNNING) {
- sigpause(SIGCHLD);
+ sigpause(sigblock(0) &~ mask(SIGCHLD));
goto loop;
}
sigrelse(SIGCHLD);
register struct process *pp, *np;
register int jobflags = 0;
int pid;
+ char *cp;
extern char *sys_errlist[];
int err = 0;
sighold(SIGINT);
sighold(SIGCHLD);
while (*v) {
- if (**v == '%') {
- np = pp = pfind(*v);
+ cp = globone(*v);
+ if (*cp == '%') {
+ np = pp = pfind(cp);
do
jobflags |= np->p_flags;
while ((np = np->p_friends) != pp);
case SIGTTIN:
case SIGTTOU:
if ((jobflags & PRUNNING) == 0) {
- printf("%s: Already stopped\n", *v);
+ printf("%s: Already stopped\n", cp);
err++;
goto cont;
}
killpg(pp->p_jobid, signum);
if (signum == SIGTERM || signum == SIGHUP)
killpg(pp->p_jobid, SIGCONT);
- } else if (!digit(**v))
+ } else if (!digit(*cp))
bferr("Arguments should be jobs or process id's");
else {
- pid = atoi(*v);
+ pid = atoi(cp);
if (kill(pid, signum) < 0) {
printf("%d: ", pid);
printf("%s\n", sys_errlist[errno]);
kill(pid, SIGCONT);
}
cont:
+ xfree(cp);
v++;
}
sigrelse(SIGCHLD);