xref: /original-bsd/local/toolchest/ksh/sh/apollo.c (revision 7c0785ab)
1*7c0785abSmarc /*
2*7c0785abSmarc 
3*7c0785abSmarc  *      Copyright (c) 1984, 1985, 1986 AT&T
4*7c0785abSmarc  *      All Rights Reserved
5*7c0785abSmarc 
6*7c0785abSmarc  *      THIS IS UNPUBLISHED PROPRIETARY SOURCE
7*7c0785abSmarc  *      CODE OF AT&T.
8*7c0785abSmarc  *      The copyright notice above does not
9*7c0785abSmarc  *      evidence any actual or intended
10*7c0785abSmarc  *      publication of such source code.
11*7c0785abSmarc 
12*7c0785abSmarc  */
13*7c0785abSmarc /*
14*7c0785abSmarc  * UNIX ksh
15*7c0785abSmarc  *
16*7c0785abSmarc  * D. G. Korn
17*7c0785abSmarc  * Bell Telephone Laboratories
18*7c0785abSmarc  * adapted from APOLLO changes to Bourne Shell
19*7c0785abSmarc  *
20*7c0785abSmarc  */
21*7c0785abSmarc 
22*7c0785abSmarc #include	<invoke.h>
23*7c0785abSmarc #include	<errno.h>
24*7c0785abSmarc #include	<sys/types.h>
25*7c0785abSmarc #include	<sys/stat.h>
26*7c0785abSmarc #include        "defs.h"
27*7c0785abSmarc #include        "brkincr.h"
28*7c0785abSmarc #include	"stak.h"
29*7c0785abSmarc 
30*7c0785abSmarc 
31*7c0785abSmarc #define PATHLEN	256
32*7c0785abSmarc 
33*7c0785abSmarc 
34*7c0785abSmarc extern int errno;
35*7c0785abSmarc extern void	failed();
36*7c0785abSmarc extern void	fault();
37*7c0785abSmarc extern char	*fullname();
38*7c0785abSmarc extern void	p_prp();
39*7c0785abSmarc extern void	p_setout();
40*7c0785abSmarc extern char	**setenv();
41*7c0785abSmarc extern void	sync_io();
42*7c0785abSmarc extern MSG	*sysmsg[];
43*7c0785abSmarc 
44*7c0785abSmarc 
45*7c0785abSmarc static int conlist[] = {0,1,2,3,-1};
46*7c0785abSmarc 
exec_here(com)47*7c0785abSmarc int exec_here(com)
48*7c0785abSmarc register char **com;
49*7c0785abSmarc {
50*7c0785abSmarc 	register char *prog = com[1];
51*7c0785abSmarc 	char **arge;
52*7c0785abSmarc 	register char *path;
53*7c0785abSmarc 	char iname[PATHLEN];
54*7c0785abSmarc 	int (*oldsig)();
55*7c0785abSmarc 	int sig;
56*7c0785abSmarc 	int xitval;
57*7c0785abSmarc 	path = prog;
58*7c0785abSmarc 	/* see if program name contains a / */
59*7c0785abSmarc 	if(strchr(prog,'/')==0)
60*7c0785abSmarc 	{
61*7c0785abSmarc 		if((path = fullname(prog))==NULL)
62*7c0785abSmarc 			failed(prog,notfound);
63*7c0785abSmarc 		endstak(path+strlen(path));
64*7c0785abSmarc 	}
65*7c0785abSmarc 	arge = setenv();
66*7c0785abSmarc 	oldsig = signal(SIGQUIT,SIG_DFL);
67*7c0785abSmarc 	sync_io();
68*7c0785abSmarc 	errno = 0;
69*7c0785abSmarc 	xitval = invokeve(path,INV_WAIT,conlist,com+1,arge);
70*7c0785abSmarc 	if(errno==ENOEXEC)
71*7c0785abSmarc 	{
72*7c0785abSmarc 		char *savcom = com[0];
73*7c0785abSmarc 		if(get_shell(path,iname)<0)
74*7c0785abSmarc 			failed(badexec);
75*7c0785abSmarc 		com[0] = iname;
76*7c0785abSmarc 		xitval = invokeve(iname,INV_WAIT,conlist,com,arge);
77*7c0785abSmarc 		com[0] = savcom;
78*7c0785abSmarc 	}
79*7c0785abSmarc 	signal(SIGQUIT,oldsig);
80*7c0785abSmarc 	if(xitval>=0)
81*7c0785abSmarc 	{
82*7c0785abSmarc 		if(sig=(xitval&0177))
83*7c0785abSmarc 		{
84*7c0785abSmarc 			if(sig==2)
85*7c0785abSmarc 				fault(sig);
86*7c0785abSmarc 			if(*sysmsg[sig])
87*7c0785abSmarc 			{
88*7c0785abSmarc 				if(output!=stderr)
89*7c0785abSmarc 					p_setout(stderr);
90*7c0785abSmarc 				if((states&PROMPT)==0)
91*7c0785abSmarc 					p_prp(itos(getpid()),SP);
92*7c0785abSmarc 				fputs(sysmsg[sig],output);
93*7c0785abSmarc 				newline();
94*7c0785abSmarc 				p_setout(output);
95*7c0785abSmarc 				xitval = sig|SIGFLG;
96*7c0785abSmarc 			}
97*7c0785abSmarc 		}
98*7c0785abSmarc 		else
99*7c0785abSmarc 			xitval >>= 8;
100*7c0785abSmarc 	}
101*7c0785abSmarc 	else if(xitval == -1)
102*7c0785abSmarc 		failed(prog,badexec);
103*7c0785abSmarc 	return(xitval);
104*7c0785abSmarc }
105*7c0785abSmarc 
106