BSD 1 development
[unix-history] / ashell / sh_sem.c
#include "sh.h"
execute(t, pf1, pf2)
int *t, *pf1, *pf2;
{
int i, f, pv[2];
register *t1;
char *cp1, *cp2;
char *scp;
if (t == 0)
return;
switch(t[DTYP]) {
case TCOM:
i = 100;
do
if (func(t))
return;
while (--i && alias(&t[DCOM]));
if (i == 0) {
bferr2(t[DCOM], ": Alias loop detected");
return;
}
case TPAR:
t1 = t;
f = t1[DFLG];
i = 0;
if ((f&FPAR) == 0)
i = fork();
if (i == -1) {
err("No more processes");
return;
}
if (i != 0) {
if ((f&FPIN) != 0) {
close(pf1[0]);
close(pf1[1]);
}
if ((f&FPRS) != 0) {
prn(i);
prs("\n");
set(pcs, putn(i));
}
if ((f&FAND) != 0)
return;
if ((f&FPOU) == 0)
pwait(i);
return;
}
set(prompt,"");
unsetv(prompt);
if ((cp1 = t1[DLEF]) != 0) {
close(0);
cp1 = globone(cp1);
if (cp1 == 0)
exit(1);
strip(cp1);
if (open(cp1, 0) < 0) {
prs(cp1);
err(": Cannot open");
exit(1);
}
}
if ((cp2 = t1[DRIT]) != 0) {
while (*cp2)
*cp2++ =& 0177;
strip(cp2);
cp2 = t1[DRIT];
close(1);
if ((f&FCAT) != 0 && open(cp2, 1) >= 0)
seek(1, 0, 2);
else if (creat(cp2, 0644) < 0) {
prs(t1[DRIT]);
err(": Cannot create");
exit(1);
}
}
if ((f&FPIN) != 0) {
close(0);
dup(pf1[0]);
close(pf1[0]);
close(pf1[1]);
}
if ((f&FPOU) != 0) {
close(1);
dup(pf2[1]);
close(pf2[0]);
close(pf2[1]);
}
if (f&FDIAG) {
close(2);
dup(1);
}
if ((f&FINT)!=0 && t1[DLEF]==0 && (f&FPIN)==0) {
close(0);
open("/dev/null", 0);
}
if ((f&FINT) == 0 && setintr) {
signal(INTR, 0);
signal(QUIT, 0);
}
if (t1[DTYP] == TPAR) {
if (t1 = t1[DSPR])
t1[DFLG] =| f&FINT;
execute(t1);
exit(1);
}
doexec(t1);
/* no return */
case TFIL:
f = t[DFLG];
pipe(pv);
t1 = t[DLEF];
t1[DFLG] =| FPOU | (f&(FPIN|FINT|FPRS|FDIAG));
execute(t1, pf1, pv);
t1 = t[DRIT];
t1[DFLG] =| FPIN | (f&(FPOU|FINT|FAND|FPRS));
execute(t1, pv, pf2);
return;
case TLST:
f = t[DFLG]&FINT;
if (t1 = t[DLEF])
t1[DFLG] =| f;
execute(t1);
if (t1 = t[DRIT])
t1[DFLG] =| f;
execute(t1);
return;
}
}
strip(cp)
register char *cp;
{
while (*cp++ =& 0177)
continue;
}