1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
|
diff -u -x CVS -x work -x core -x *.core -x #* -x *~ -x *.orig -x *.rej -I $Id.*$ -I $.+BSD.*$ defs.h.orig defs.h
--- defs.h.orig Tue Jun 22 01:43:19 2004
+++ defs.h Tue Jun 22 01:55:49 2004
@@ -1,8 +1,32 @@
#
/*
* UNIX shell
+ *
+ * S. R. Bourne
+ * Bell Telephone Laboratories
+ *
*/
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/times.h>
+#include <sys/wait.h>
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <setjmp.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <string.h>
+#if defined(ULTRIX)
+#if (__FreeBSD_version - 0) >= 500005
+#include <ulimit.h>
+#else
+#include "ulimit.h"
+#endif
+#endif
+#include <unistd.h>
+
/* error exits from various parts of shell */
#define ERROR 1
#define SYNBAD 2
@@ -51,11 +75,22 @@
#define SYSNULL 16
#define SYSREAD 17
#define SYSTST 18
-#define SYSUMASK 19
+#define SYSUMASK 19
+#if defined(SYSIII)
+#define SYSNEWGRP 20
+#endif
+#if defined(ULTRIX)
+#define SYSULIMIT 21
+#endif
+
+#if defined(SYSIII)
+/* builtin table */
+#define TEST 127
+#endif
/* used for input and output of shell */
-#define INIO 10
-#define OTIO 11
+#define INIO 18 /* V7 - 10 */
+#define OTIO 19 /* V7 - 11 */
/*io nodes*/
#define USERIO 10
@@ -77,35 +112,145 @@
/* result type declarations */
-#define alloc malloc
-ADDRESS alloc();
-VOID addblok();
-STRING make();
-STRING movstr();
-TREPTR cmd();
-TREPTR makefork();
-NAMPTR lookup();
-VOID setname();
-VOID setargs();
-DOLPTR useargs();
-REAL expr();
-STRING catpath();
-STRING getpath();
-STRING *scan();
-STRING mactrim();
-STRING macro();
-STRING execs();
-VOID await();
-VOID post();
-STRING copyto();
-VOID exname();
-STRING staknam();
-VOID printnam();
-VOID printflg();
-VOID prs();
-VOID prc();
-VOID getenv();
-STRING *setenv();
+/* args.c */
+PROC INT options(INT, STRING *);
+PROC VOID setargs(STRING *);
+PROC DOLPTR freeargs(DOLPTR);
+PROC VOID clearup(VOID);
+PROC DOLPTR useargs(VOID);
+/* blok.c */
+PROC ADDRESS alloc(POS);
+PROC VOID addblok(POS);
+#define free free_
+PROC VOID free(BLKPTR);
+/* builtin.c */
+#if defined(SYSIII)
+PROC VOID builtin(INT, INT, STRING *);
+#else /* V7 */
+PROC INT builtin(INT, STRING *);
+#endif
+PROC VOID bfailed(CSTRING, CSTRING, CSTRING);
+/* cmd.c */
+PROC TREPTR makefork(INT, TREPTR);
+PROC TREPTR cmd(INT, INT);
+/* error.c */
+PROC VOID exitset(VOID);
+PROC VOID sigchk(VOID);
+PROC VOID failed(CSTRING, CSTRING);
+PROC VOID error(CSTRING);
+PROC VOID exitsh(INT);
+PROC VOID done(VOID);
+PROC VOID rmtemp(IOPTR);
+/* expand.c */
+PROC INT expand(STRING, INT);
+PROC INT gmatch(STRING, STRING);
+PROC VOID makearg(ARGPTR);
+/* expr.c */
+/* PROC REAL expr(); */
+/* fault.c */
+PROC VOID fault(INT);
+PROC VOID stdsigs(VOID);
+PROC SIGPTR ignsig(INT);
+PROC VOID getsig(INT);
+PROC VOID oldsigs(VOID);
+PROC VOID clrsig(INT);
+PROC VOID chktrap(VOID);
+/* io.c */
+PROC VOID initf(UFD);
+PROC INT estabf(STRING);
+PROC VOID push(FILEPTR);
+PROC INT pop(VOID);
+PROC VOID chkpipe(INT *);
+PROC INT chkopen(CSTRING);
+#define rename rename_
+PROC VOID rename(INT, INT);
+PROC INT create(STRING);
+PROC INT tmpfil(VOID);
+PROC VOID copy(IOPTR);
+/* macro.c */
+PROC STRING macro(STRING);
+PROC VOID subst(INT, INT);
+/* main.c */
+PROC VOID chkpr(INT);
+PROC VOID settmp(VOID);
+/* name.c */
+PROC INT syslook(STRING, SYSTAB);
+PROC VOID setlist(ARGPTR, INT);
+#if defined(SYSIII)
+PROC INT setname(STRING, INT);
+#else /* V7 */
+PROC VOID setname(STRING, INT);
+#endif
+PROC VOID replace(STRING *, CSTRING);
+PROC VOID dfault(NAMPTR, CSTRING);
+PROC VOID assign(NAMPTR, CSTRING);
+PROC INT readvar(STRING *);
+PROC VOID assnum(STRING *, INT);
+PROC STRING make(CSTRING);
+PROC NAMPTR lookup(CSTRING);
+PROC VOID namscan(VOID(*)(NAMPTR));
+PROC VOID printnam(NAMPTR);
+PROC VOID exname(NAMPTR);
+PROC VOID printflg(NAMPTR);
+#define getenv getenv_
+#if defined(SYSIII)
+PROC INT getenv(VOID);
+#else /* V7 */
+PROC VOID getenv(VOID);
+#endif
+#define setenv setenv_
+PROC STRING *setenv(VOID);
+/* print.c */
+PROC VOID newline(VOID);
+PROC VOID blank(VOID);
+PROC VOID prp(VOID);
+PROC VOID prs(CSTRING);
+PROC VOID prc(INT);
+PROC VOID prt(CLOCK);
+PROC VOID prn(INT);
+PROC VOID prl(LONG);
+PROC VOID itos(INT);
+PROC VOID ltos(LONG);
+PROC INT stoi(CSTRING);
+/* service.c */
+PROC VOID initio(IOPTR);
+#if defined(SYSIII)
+PROC CSTRING simple(CSTRING);
+#endif
+PROC CSTRING getpath(CSTRING);
+PROC INT pathopen(CSTRING, CSTRING);
+PROC CSTRING catpath(CSTRING, CSTRING);
+PROC VOID execa(STRING *);
+PROC VOID postclr(VOID);
+PROC VOID post(INT);
+#if defined(SYSIII)
+PROC VOID await(INT, INT);
+#else /* V7 */
+PROC VOID await(INT);
+#endif
+PROC VOID trim(STRING);
+PROC STRING mactrim(STRING);
+PROC STRING *scan(INT);
+PROC INT getarg(COMPTR);
+/* setbrk.c */
+PROC BYTPTR setbrk(INT);
+/* stak.c -> stak.h */
+/* string.c */
+PROC STRING movstr(CSTRING, STRING);
+PROC INT any(INT, CSTRING);
+PROC INT cf(CSTRING, CSTRING);
+PROC INT length(CSTRING);
+/* test.c */
+#if defined(SYSIII)
+PROC INT test(INT, STRING *);
+#endif
+/* word.c */
+PROC INT word(VOID);
+PROC INT nextc(INT);
+PROC INT readc(VOID);
+/* xec.c */
+PROC INT execute(TREPTR, INT, INT *, INT *);
+PROC VOID execexp(STRING, UFD);
#define attrib(n,f) (n->namflg |= f)
#define round(a,b) (((int)((ADR(a)+b)-1))&~((b)-1))
@@ -115,16 +260,20 @@
#define assert(x) ;
/* temp files and io */
-UFD output;
-INT ioset;
-IOPTR iotemp; /* files to be deleted sometime */
-IOPTR iopend; /* documents waiting to be read at NL */
+EXTERN UFD output;
+EXTERN INT ioset;
+EXTERN IOPTR iotemp; /* files to be deleted sometime */
+EXTERN IOPTR iopend; /* documents waiting to be read at NL */
+#if defined(SYSIII)
+EXTERN INT stripflg;
+#endif
+EXTERN BOOL nosubst;
/* substitution */
-INT dolc;
-STRING *dolv;
-DOLPTR argfor;
-ARGPTR gchain;
+EXTERN INT dolc;
+EXTERN STRING *dolv;
+EXTERN DOLPTR argfor;
+EXTERN ARGPTR gchain;
/* stack */
#define BLK(x) ((BLKPTR)(x))
@@ -136,68 +285,77 @@
#include "stak.h"
/* string constants */
-MSG atline;
-MSG readmsg;
-MSG colon;
-MSG minus;
-MSG nullstr;
-MSG sptbnl;
-MSG unexpected;
-MSG endoffile;
-MSG synmsg;
+EXTERN CMSG atline;
+EXTERN CMSG readmsg;
+EXTERN CMSG colon;
+EXTERN CMSG minus;
+EXTERN CMSG nullstr;
+EXTERN CMSG sptbnl;
+EXTERN CMSG unexpected;
+EXTERN CMSG endoffile;
+EXTERN CMSG endofline;
+EXTERN CMSG synmsg;
/* name tree and words */
-SYSTAB reserved;
-INT wdval;
-INT wdnum;
-ARGPTR wdarg;
-INT wdset;
-BOOL reserv;
+EXTERN SYSTAB reserved;
+EXTERN SYSTAB commands;
+#if defined(SYSIII)
+EXTERN SYSTAB builtins;
+#endif
+EXTERN INT wdval;
+EXTERN INT wdnum;
+EXTERN ARGPTR wdarg;
+EXTERN INT wdset;
+EXTERN BOOL reserv;
/* prompting */
-MSG stdprompt;
-MSG supprompt;
-MSG profile;
+EXTERN CMSG stdprompt;
+EXTERN CMSG supprompt;
+EXTERN CMSG profile;
+#if defined(SYSIII)
+EXTERN CMSG sysprofile;
+#endif
/* built in names */
-NAMNOD fngnod;
-NAMNOD ifsnod;
-NAMNOD homenod;
-NAMNOD mailnod;
-NAMNOD pathnod;
-NAMNOD ps1nod;
-NAMNOD ps2nod;
+EXTERN NAMNOD fngnod;
+EXTERN NAMNOD ifsnod;
+EXTERN NAMNOD homenod;
+EXTERN NAMNOD mailnod;
+EXTERN NAMNOD pathnod;
+EXTERN NAMNOD ps1nod;
+EXTERN NAMNOD ps2nod;
/* special names */
-MSG flagadr;
-STRING cmdadr;
-STRING exitadr;
-STRING dolladr;
-STRING pcsadr;
-STRING pidadr;
+EXTERN MSG flagadr;
+EXTERN STRING cmdadr;
+EXTERN STRING exitadr;
+EXTERN STRING dolladr;
+EXTERN STRING pcsadr;
+EXTERN STRING pidadr;
-MSG defpath;
+EXTERN CMSG defpath;
/* names always present */
-MSG mailname;
-MSG homename;
-MSG pathname;
-MSG fngname;
-MSG ifsname;
-MSG ps1name;
-MSG ps2name;
+EXTERN CMSG mailname;
+EXTERN CMSG homename;
+EXTERN CMSG pathname;
+EXTERN CMSG fngname;
+EXTERN CMSG ifsname;
+EXTERN CMSG ps1name;
+EXTERN CMSG ps2name;
/* transput */
-CHAR tmpout[];
-STRING tmpnam;
-INT serial;
+EXTERN CHAR tmpout[];
+#define tmpnam tmpnam_
+EXTERN STRING tmpnam;
+EXTERN INT serial;
#define TMPNAM 7
-FILE standin;
+EXTERN FILEPTR standin;
#define input (standin->fdes)
#define eof (standin->feof)
-INT peekc;
-STRING comdiv;
-MSG devnull;
+EXTERN INT peekc;
+EXTERN STRING comdiv;
+EXTERN CMSG devnull;
/* flags */
#define noexec 01
@@ -211,77 +369,122 @@
#define rshflg 0400
#define waiting 01000
#define stdflg 02000
+#define STDFLG 's'
+#define STDFLGLOC 4
#define execpr 04000
#define readpr 010000
#define keyflg 020000
-INT flags;
+EXTERN INT flags;
+#if defined(SYSIII)
+EXTERN BOOL rwait;
+EXTERN BOOL wasintr; /* used to tell if break or delete is hit
+ while executing a wait */
+#endif
/* error exits from various parts of shell */
-#include <setjmp.h>
-jmp_buf subshell;
-jmp_buf errshell;
+EXTERN jmp_buf subshell;
+EXTERN jmp_buf errshell;
+#if defined(RENO)
+EXTERN jmp_buf INTbuf;
+#endif
/* fault handling */
#include "brkincr.h"
-POS brkincr;
+EXTERN INT brkincr;
#define MINTRAP 0
-#define MAXTRAP 17
+#define MAXTRAP 33
-#define INTR 2
-#define QUIT 3
-#define MEMF 11
-#define ALARM 14
-#define KILL 15
+#define INTR SIGINT
+#define QUIT SIGQUIT
+#define MEMF SIGSEGV
+#define ALARM SIGALRM
+#define KILL SIGTERM
#define TRAPSET 2
#define SIGSET 4
#define SIGMOD 8
-
-VOID fault();
-BOOL trapnote;
-STRING trapcom[];
-BOOL trapflg[];
+#if defined(SYSIII)
+#define SIGCAUGHT 16
+#endif
+
+EXTERN BOOL trapnote;
+EXTERN STRING trapcom[];
+EXTERN BOOL trapflg[];
+#if defined(RENO)
+EXTERN BOOL trapjmp[];
+#endif
/* name tree and words */
-STRING *environ;
-CHAR numbuf[];
-MSG export;
-MSG readonly;
+EXTERN STRING *environ;
+EXTERN CHAR numbuf[];
+EXTERN CMSG export;
+EXTERN CMSG readonly;
/* execflgs */
-INT exitval;
-BOOL execbrk;
-INT loopcnt;
-INT breakcnt;
+EXTERN INT exitval;
+EXTERN BOOL execbrk;
+EXTERN INT loopcnt;
+EXTERN INT breakcnt;
/* messages */
-MSG mailmsg;
-MSG coredump;
-MSG badopt;
-MSG badparam;
-MSG badsub;
-MSG nospace;
-MSG notfound;
-MSG badtrap;
-MSG baddir;
-MSG badshift;
-MSG illegal;
-MSG restricted;
-MSG execpmsg;
-MSG notid;
-MSG wtfailed;
-MSG badcreate;
-MSG piperr;
-MSG badopen;
-MSG badnum;
-MSG arglist;
-MSG txtbsy;
-MSG toobig;
-MSG badexec;
-MSG notfound;
-MSG badfile;
+EXTERN CMSG mailmsg;
+EXTERN CMSG coredump;
+EXTERN CMSG badopt;
+EXTERN CMSG badparam;
+#if defined(SYSIII)
+EXTERN CMSG unset;
+#endif
+EXTERN CMSG badsub;
+EXTERN CMSG nospace;
+EXTERN CMSG badtrap;
+EXTERN CMSG memfault;
+EXTERN CMSG baddir;
+EXTERN CMSG badshift;
+EXTERN CMSG illegal;
+EXTERN CMSG restricted;
+EXTERN CMSG execpmsg;
+EXTERN CMSG notid;
+EXTERN CMSG badulimit;
+EXTERN CMSG wtfailed;
+EXTERN CMSG badcreate;
+#if defined(SYSIII)
+EXTERN CMSG nofork;
+EXTERN CMSG noswap;
+#endif
+EXTERN CMSG piperr;
+EXTERN CMSG badopen;
+EXTERN CMSG badnum;
+EXTERN CMSG arglist;
+#if defined(SYSIII)
+EXTERN CMSG argcount;
+#endif
+EXTERN CMSG txtbsy;
+EXTERN CMSG toobig;
+EXTERN CMSG badexec;
+EXTERN CMSG notfound;
+EXTERN CMSG badfile;
+EXTERN CSTRING sysmsg[];
+#if defined(RENO)
+EXTERN INT num_sysmsg;
+#endif
+
+#if defined(SYSIII)
+/* 'builtin' error messages */
+EXTERN CMSG btest;
+EXTERN CMSG badop;
+#endif
+
+#if defined(SYSIII)
+/* fork constant */
+#define FORKLIM 32
+#endif
+
+#if defined(SYSIII) || defined(RENO)
+/* comment delimeter */
+#define COMCHAR '#'
+#endif
-address end[];
+EXTERN address end[];
#include "ctype.h"
|