1: #ifndef lint
2: static char sccsid[] = "@(#)main.c 4.3 3/19/85";
3: #endif
4:
5: #
6: /*
7: * UNIX shell
8: *
9: * S. R. Bourne
10: * Bell Telephone Laboratories
11: *
12: */
13:
14: #include "defs.h"
15: #include "sym.h"
16: #include "timeout.h"
17: #include <sys/types.h>
18: #include <sys/stat.h>
19: #include <sgtty.h>
20: #include <signal.h>
21:
22: UFD output = 2;
23: LOCAL BOOL beenhere = FALSE;
24: CHAR tmpout[20] = "/tmp/sh-";
25: FILEBLK stdfile;
26: FILE standin = &stdfile;
27: #ifdef stupid
28: #include <execargs.h>
29: #endif
30:
31: PROC VOID exfile();
32:
33:
34:
35:
36: main(c, v)
37: INT c;
38: STRING v[];
39: {
40: REG INT rflag=ttyflg;
41:
42: /* initialise storage allocation */
43: stdsigs();
44: setbrk(BRKINCR);
45: addblok((POS)0);
46:
47: /* set names from userenv */
48: setupenv();
49:
50: /* look for restricted */
51: /* IF c>0 ANDF any('r', *v) THEN rflag=0 FI */
52:
53: /* look for options */
54: dolc=options(c,v);
55: IF dolc<2 THEN flags |= stdflg FI
56: IF (flags&stdflg)==0
57: THEN dolc--;
58: FI
59: dolv=v+c-dolc; dolc--;
60:
61: /* return here for shell file execution */
62: setjmp(subshell);
63:
64: /* number of positional parameters */
65: assnum(&dolladr,dolc);
66: cmdadr=dolv[0];
67:
68: /* set pidname */
69: assnum(&pidadr, getpid());
70:
71: /* set up temp file names */
72: settmp();
73:
74: /* default ifs */
75: dfault(&ifsnod, sptbnl);
76:
77: IF (beenhere++)==FALSE
78: THEN /* ? profile */
79: IF *cmdadr=='-'
80: ANDF (input=pathopen(nullstr, profile))>=0
81: THEN exfile(rflag); flags &= ~ttyflg;
82: FI
83: IF rflag==0 THEN flags |= rshflg FI
84:
85: /* open input file if specified */
86: IF comdiv
87: THEN estabf(comdiv); input = -1;
88: ELSE input=((flags&stdflg) ? 0 : chkopen(cmdadr));
89: comdiv--;
90: FI
91: #ifdef stupid
92: ELSE *execargs=dolv; /* for `ps' cmd */
93: #endif
94: FI
95:
96: exfile(0);
97: done();
98: }
99:
100: LOCAL VOID exfile(prof)
101: BOOL prof;
102: {
103: REG L_INT mailtime = 0;
104: REG INT userid;
105: struct stat statb;
106:
107: /* move input */
108: IF input>0
109: THEN Ldup(input,INIO);
110: input=INIO;
111: FI
112:
113: /* move output to safe place */
114: IF output==2
115: THEN Ldup(dup(2),OTIO);
116: output=OTIO;
117: FI
118:
119: userid=getuid();
120:
121: /* decide whether interactive */
122: IF (flags&intflg) ORF ((flags&oneflg)==0 ANDF gtty(output,&statb)==0 ANDF gtty(input,&statb)==0)
123: THEN dfault(&ps1nod, (userid?stdprompt:supprompt));
124: dfault(&ps2nod, readmsg);
125: flags |= ttyflg|prompt; ignsig(KILL);
126: /*
127: {
128: #include <signal.h>
129: signal(SIGTTIN, SIG_IGN);
130: signal(SIGTTOU, SIG_IGN);
131: signal(SIGTSTP, SIG_IGN);
132: }
133: */
134: ELSE flags |= prof; flags &= ~prompt;
135: FI
136:
137: IF setjmp(errshell) ANDF prof
138: THEN close(input); return;
139: FI
140:
141: /* error return here */
142: loopcnt=breakcnt=peekc=0; iopend=0;
143: IF input>=0 THEN initf(input) FI
144:
145: /* command loop */
146: LOOP tdystak(0);
147: stakchk(); /* may reduce sbrk */
148: exitset();
149: IF (flags&prompt) ANDF standin->fstak==0 ANDF !eof
150: THEN IF mailnod.namval
151: ANDF stat(mailnod.namval,&statb)>=0 ANDF statb.st_size
152: ANDF (statb.st_mtime != mailtime)
153: ANDF mailtime
154: THEN prs(mailmsg)
155: FI
156: mailtime=statb.st_mtime;
157: prs(ps1nod.namval);
158: FI
159:
160: trapnote=0; peekc=readc();
161: IF eof
162: THEN return;
163: FI
164: execute(cmd(NL,MTFLG),0);
165: eof |= (flags&oneflg);
166: POOL
167: }
168:
169: chkpr(eor)
170: char eor;
171: {
172: IF (flags&prompt) ANDF standin->fstak==0 ANDF eor==NL
173: THEN prs(ps2nod.namval);
174: FI
175: }
176:
177: settmp()
178: {
179: itos(getpid()); serial=0;
180: tmpnam=movstr(numbuf,&tmpout[TMPNAM]);
181: }
182:
183: Ldup(fa, fb)
184: REG INT fa, fb;
185: {
186: dup2(fa, fb);
187: close(fa);
188: ioctl(fb, FIOCLEX, 0);
189: }
Defined functions
Ldup
defined in line
183; used 2 times
main
defined in line
36;
never used
Defined variables
sccsid
defined in line
2;
never used