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