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