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