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