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
|
/* defs 4.2 85/10/28 */
#define _POSIX_SOURCE
#define _RESEARCH_SOURCE
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
#include <dirent.h>
#include <limits.h>
#include <stdio.h>
#include <ctype.h>
#ifndef SHELLCOM
#define SHELLCOM "/bin/sh"
#endif
typedef char flag; /* represent a few bit flag */
#define NO 0
#define YES 1
#define equal(a,b) (! strcmp(a,b))
#define HASHSIZE 1021
#define NLEFTS 512
#define NCHARS 500
#define NINTS 250
#define INMAX 20000
#define OUTMAX 20000
#define QBUFMAX 20000
#define MAXDIR 10
#define MAXPROC 100
#define MAXINCLUDE 17
#define PROCLIMIT 3
#define ALLDEPS 1
#define SOMEDEPS 2
#define META 01
#define TERMINAL 02
extern char funny[128];
#define ALLOC(x) (struct x *) ckalloc(sizeof(struct x))
#define CHNULL (char *) NULL
extern int sigivalue;
extern int sigqvalue;
extern int dbgflag;
extern int prtrflag;
extern int silflag;
extern int noexflag;
extern int keepgoing;
extern int noruleflag;
extern int touchflag;
extern int questflag;
extern int oldflag;
extern int ndocoms;
extern int ignerr;
extern int okdel;
extern int forceshell;
extern int inarglist;
extern char **envpp; /* points to slot in environment vector */
extern char *prompt;
extern int nopdir;
typedef struct nameblock *nameblkp;
typedef struct depblock *depblkp;
typedef struct lineblock *lineblkp;
typedef struct chain *chainp;
struct nameblock
{
nameblkp nxtnameblock;
char *namep;
lineblkp linep;
flag done;
flag septype;
flag isarch;
flag isdir;
time_t modtime;
};
extern nameblkp mainname;
extern nameblkp firstname;
extern nameblkp *hashtab;
extern int nhashed;
extern int hashsize;
extern int hashthresh;
struct lineblock
{
lineblkp nxtlineblock;
struct depblock *depp;
struct shblock *shp;
};
extern lineblkp sufflist;
struct depblock
{
depblkp nxtdepblock;
nameblkp depname;
char nowait;
} ;
struct shblock
{
struct shblock *nxtshblock;
char *shbp;
};
struct varblock
{
struct varblock *nxtvarblock;
char *varname;
char *varval;
char **export;
flag noreset;
flag used;
};
extern struct varblock *firstvar;
struct pattern
{
struct pattern *nxtpattern;
char *patval;
};
extern struct pattern *firstpat;
struct dirhd
{
struct dirhd *nxtdirhd;
time_t dirtime;
int dirok;
DIR * dirfc;
char *dirn;
};
extern struct dirhd *firstod;
struct chain
{
chainp nextp;
char *datap;
};
struct wild
{
struct wild *next;
lineblkp linep;
char *left;
char *right;
int llen;
int rlen;
int totlen;
};
typedef struct wild *wildp;
extern wildp firstwild;
extern wildp lastwild;
/* date for processes */
extern int proclimit; /* maximum spawned processes allowed alive at one time */
extern int proclive; /* number of spawned processes awaited */
extern int nproc; /* next slot in process stack to use */
extern struct process
{
int pid;
flag nohalt;
flag nowait;
flag done;
} procstack[ ];
extern void intrupt(int);
extern void enbint(void (*)(int));
extern int doname(nameblkp, int, time_t *, int);
extern int docom(struct shblock *, int, int);
extern int dosys(char *, int, int, char *);
extern int waitstack(int);
extern void touch(int, char*);
extern time_t exists(char *);
extern time_t prestime(void);
extern depblkp srchdir(char*, int, depblkp);
extern time_t lookarch(char *);
extern void dirsrch(char *);
extern void baddirs(void);
extern nameblkp srchname(char *);
extern nameblkp makename(char *);
extern int hasparen(char *);
extern void newhash(int);
extern nameblkp chkname(char *);
extern char *copys(char *);
extern char *concat(char *, char *, char *);
extern int suffix(char *, char *, char *);
extern int *ckalloc(int);
extern char *subst(char *, char *);
extern void setvar(char *, char *, int);
extern void set3var(char *, char *);
extern int eqsign(char *);
extern struct varblock *varptr(char *);
extern int dynmacro(char *);
extern void fatal1(char *, char *);
extern void fatal(char *);
extern chainp appendq(chainp, char *);
extern char *mkqlist(chainp, char *);
extern wildp iswild(char *);
extern char *wildmatch(wildp, char *, int);
extern char *wildsub(char *, char *);
extern int parse(char *);
extern int yylex(void);
|