static char sccsid
[] = "@(#)service.c 4.8 4/14/90";
* Bell Telephone Laboratories
/* service routines for `execute' */
ion
=mactrim(iop
->ioname
);
IF
*ion
ANDF (flags
&noexec
)==0
THEN
subst(chkopen(ion
),(fd
=tmpfil()));
close(fd
); fd
=chkopen(tmpout
); unlink(tmpout
);
ELIF (fd
=stoi(ion
))>=USERIO
THEN
failed(ion
,badfile
);
THEN
failed(ion
,restricted
);
(fd
=open(ion
,O_WRONLY
|O_APPEND
))<0
THEN
rename(fd
,iof
&IOUFD
);
THEN
failed(s
, restricted
);
ELIF (path
= pathnod
.namval
)==0
THEN
return(_PATH_DEFPATH
);
ELSE
return(cpystak(path
));
REP path
=catpath(path
,name
);
PER (f
=open(curstak(),0))<0 ANDF path DONE
STRING
catpath(path
,name
)
/* leaves result on top of stack */
WHILE
*scanp ANDF
*scanp
!=COLON DO
*argp
++ = *scanp
++ OD
IF scanp
!=path THEN
*argp
++='/' FI
IF
*scanp
==COLON THEN scanp
++ FI
path
=(*scanp
? scanp
: 0); scanp
=name
;
WHILE (*argp
++ = *scanp
++) DONE
THEN xecmsg
=notfound
; path
=getpath(*t
);
WHILE path
=execs(path
,t
) DONE
execve(p
, &t
[0] ,xecenv
);
clearup(); /* remove open files and for loop junk */
IF input THEN
close(input
) FI
/* band aid to get csh... 2/26/79 */
lseek(input
, (long) 0, 0);
register char **t
, *cp
, **xecenv
;
execve(_PATH_CSHELL
, newt
, xecenv
);
/* for processes to be waited for */
THEN WHILE
*pw DO pw
++ OD
THEN trapjmp
[INTR
] = 1; p
=wait(&w
);
WHILE pw
<= &pwlist
[ipwc
]
IF p
== -1 THEN
continue FI
THEN IF sig
== 0177 /* ptrace! return */
IF sig
< num_sysmsg ANDF sysmsg
[sig
]
THEN IF i
!=p
ORF (flags
&prompt
)==0
THEN
prp(); prn(p
); blank()
IF w
&0200 THEN
prs(coredump
) FI
THEN rc
= (sig
? sig
|SIGFLG
: w_hi
);
DO
*p
++=c
&STRIP
; q
|= c OD
REG ARGPTR argp
= Rcheat(gchain
)&~ARGMK
;
REG STRING
*comargn
, *comargm
;
comargn
=getstak(BYTESPERWORD
*argn
+BYTESPERWORD
); comargm
= comargn
+= argn
; *comargn
= ENDARGS
;
DO
*--comargn
= argp
->argval
;
IF argp
==0 ORF
Rcheat(argp
)&ARGMK
THEN
gsort(comargn
,comargm
);
/* Lcheat(argp) &= ~ARGMK; */
argp
= Rcheat(argp
)&~ARGMK
;
LOCAL VOID
gsort(from
,to
)
IF (n
=to
-from
)<=1 THEN
return FI
DO REG STRING
*fromi
; fromi
= &from
[i
];
IF
cf(fromi
[m
],fromi
[0])>0
ELSE STRING s
; s
=fromi
[m
]; fromi
[m
]=fromi
[0]; fromi
[0]=s
;
/* Argument list generation */
DO count
+= split(macro(argp
->argval
));
LOOP
sigchk(); argp
=locstak()+BYTESPERWORD
;
WHILE (c
= *s
++, !any(c
,ifsnod
.namval
) && c
)
IF argp
==staktop
+BYTESPERWORD
IF c
=expand(((ARGPTR
)(argp
=endstak(argp
)))->argval
,0)
ELSE
/* assign(&fngnod, argp->argval); */