static char sccsid
[] = "@(#)xec.c 4.7 5/8/89";
* Bell Telephone Laboratories
/* ======== command execution ========*/
execute(argt
, execflg
, pf1
, pf2
)
/* `stakbot' is preserved by this routine */
IF (t
=argt
) ANDF execbrk
==0
treeflgs
= t
->tretyp
; type
= treeflgs
&COMMSK
;
oldexit
=exitval
; exitval
=0;
a1
=com
[1]; gchain
=schain
;
IF argn
==0 ORF (internal
=syslook(com
[0],commands
))
THEN
setlist(t
->comnod
.comset
, 0);
IF argn
ANDF (flags
&noexec
)==0
THEN
/* print command if execpr */
THEN argn
=0; prs(execpmsg
);
DO
prs(com
[argn
++]); blank() OD
IF (f
=pathopen(getpath(a1
), a1
)) < 0
THEN
failed(a1
,notfound
);
prt(t
[2]); blank(); prt(t
[3]); newline();
exitsh(a1
?stoi(a1
):oldexit
);
execbrk
= -loopcnt
; break;
IF (execbrk
=loopcnt
) ANDF a1
IF (i
=stoi(*com
))>=MAXTRAP ORF i
<MINTRAP
THEN
failed(*com
,badtrap
);
ELSE
replace(&trapcom
[i
],a1
);
ELSE
/* print out current traps */
THEN
prn(i
); prs(colon
); prs(trapcom
[i
]); newline();
initio(io
); ioset
=0; io
=0;
oldsigs(); execa(com
); done();
THEN
failed(com
[0],restricted
);
ELIF (a1
==0 ANDF (a1
=homenod
.namval
)==0) ORF
chdir(a1
)<0
exitval
=readvar(&com
[1]);
argc
= options(argn
,com
);
THEN
setargs(com
+argn
-argc
);
THEN
/*scan name chain and print*/
IF exitval
==0 THEN exitval
=N_EXPORT
; FI
DO
attrib(lookup(*com
), exitval
) OD
THEN
execexp(a1
,&com
[2]);
while ((c
= *a1
++) >= '0' &&
for (j
= 6; j
>= 0; j
-= 3)
internal
=builtin(argn
,com
);
THEN IF io THEN
error(illegal
) FI
IF execflg
ANDF (treeflgs
&(FAMP
|FPOU
))==0
ELSE
WHILE (parent
=fork()) == -1
DO
sigchk(); alarm(10); pause() OD
THEN
/* This is the parent branch of fork; */
/* it may or may not wait for the child. */
IF treeflgs
&FPRS ANDF flags
&ttyflg
THEN
prn(parent
); newline();
IF treeflgs
&FPCL THEN
closepipe(pf1
) FI
IF (treeflgs
&(FAMP
|FPOU
))==0
ELSE
assnum(&pcsadr
, parent
);
ELSE
/* this is the forked branch (child) of execute */
flags
|= forked
; iotemp
=0;
/* Turn off INTR and QUIT if `FINT' */
/* Reset ramaining signals to parent */
/* except for those `lost' by trap */
THEN
signal(INTR
,1); signal(QUIT
,1);
THEN
rename(pf1
[INPIPE
],0);
THEN
rename(pf2
[OTPIPE
],1);
/* default std input for & */
IF treeflgs
&FINT ANDF ioset
==0
THEN
rename(chkopen(_PATH_DEVNULL
),0);
THEN
execute(t
->forknod
.forktre
,1);
THEN
setlist(t
->comnod
.comset
,N_EXPORT
);
execute(t
->parnod
.partre
,execflg
);
IF
execute(t
->lstnod
.lstlef
, 0, pf1
, pv
)==0
THEN
execute(t
->lstnod
.lstrit
, execflg
, pv
, pf2
);
execute(t
->lstnod
.lstlef
,0);
execute(t
->lstnod
.lstrit
,execflg
);
IF
execute(t
->lstnod
.lstlef
,0)==0
THEN
execute(t
->lstnod
.lstrit
,execflg
);
IF
execute(t
->lstnod
.lstlef
,0)!=0
THEN
execute(t
->lstnod
.lstrit
,execflg
);
NAMPTR n
= lookup(t
->fornod
.fornam
);
ELSE ARGPTR schain
=gchain
;
trim((args
=scan(getarg(t
->fornod
.forlst
)))[0]);
WHILE
*args
!=ENDARGS ANDF execbrk
==0
execute(t
->fornod
.fortre
,0);
IF execbrk
<0 THEN execbrk
=0 FI
IF breakcnt THEN breakcnt
-- FI
execbrk
=breakcnt
; loopcnt
--;
i
=execute(t
->whnod
.whtre
,0);
IF (i
==0)!=(type
==TWH
) THEN
break FI
i
=execute(t
->whnod
.dotre
,0);
IF execbrk
<0 THEN execbrk
=0 FI
IF breakcnt THEN breakcnt
-- FI
execbrk
=breakcnt
; loopcnt
--; exitval
=i
;
i
=execute(t
->ifnod
.iftre
,0);
THEN
execute(t
->ifnod
.thtre
,execflg
);
ELSE
execute(t
->ifnod
.eltre
,execflg
);
REG STRING r
= mactrim(t
->swnod
.swarg
);
REG REGPTR eg
= t
->swnod
.swlst
;
DO ARGPTR rex
=eg
->regptr
;
IF
gmatch(r
,s
=macro(rex
->argval
)) ORF (trim(s
), eq(r
,s
))
THEN
execute(eg
->regcom
,0);
IF eg THEN eg
=eg
->regnxt FI
THEN
estabf(s
); fb
.feval
=f
;
execute(cmd(NL
, NLFLG
|MTFLG
),0);