Research V6 development
[unix-history] / usr / source / s1 / cron.c
CommitLineData
e3bebcb1
KT
1#define ANY -1
2#define LIST -2
3#define RANGE -3
4#define EOF -4
5char *crontab "/usr/lib/crontab";
6char *crontmp "/tmp/crontmp";
7char *aend;
8char *itime[2];
9int *loct;
10int *localtime();
11int reset();
12int flag;
13
14main()
15{
16 register i, t;
17 register char *cp;
18 extern char end[];
19
20 setuid(1);
21 itime[0] = fork();
22 if(itime[0])
23 exit();
24 setexit();
25 signal(1, reset);
26 time(itime);
27 while(*localtime(itime))
28 if(itime[1]-- == 0)
29 itime[0]--;
30
31loop:
32 init();
33 for(i=60; i; i--) {
34 loct = localtime(itime);
35 for(cp = end; *cp != EOF;) {
36 flag = 0;
37 cp = cmp(cp, loct[1]); /* minute */
38 cp = cmp(cp, loct[2]); /* hour */
39 cp = cmp(cp, loct[3]); /* day */
40 cp = cmp(cp, loct[4]); /* month */
41 cp = cmp(cp, loct[6]); /* day of week */
42 if(flag == 0) {
43 slp();
44 ex(cp);
45 }
46 while(*cp++ != 0)
47 ;
48 }
49 t = itime[1] + 60;
50 if(t < itime[1])
51 itime[0]++;
52 itime[1] = t;
53 }
54 slp();
55 goto loop;
56}
57
58cmp(p, v)
59char *p;
60{
61 register char *cp;
62
63 cp = p;
64 switch(*cp++) {
65
66 case ANY:
67 return(cp);
68
69 case LIST:
70 while(*cp != LIST)
71 if(*cp++ == v) {
72 while(*cp++ != LIST)
73 ;
74 return(cp);
75 }
76 flag++;
77 return(cp+1);
78
79 case RANGE:
80 if(*cp > v || cp[1] < v)
81 flag++;
82 return(cp+2);
83 }
84 if(cp[-1] != v)
85 flag++;
86 return(cp);
87}
88
89slp()
90{
91 register i;
92 int t[2];
93
94 time(t);
95 i = itime[1] - t[1];
96 if(i > 0)
97 sleep(i);
98}
99
100ex(s)
101char *s;
102{
103 register i;
104
105 if(fork()) {
106 wait();
107 return;
108 }
109 for(i=0; s[i]; i++);
110 close(0);
111 creat(crontmp, 0600);
112 write(0, s, i);
113 close(0);
114 open(crontmp, 0);
115 unlink(crontmp);
116 if(fork())
117 exit();
118 execl("/bin/sh", "sh", "-t", 0);
119 exit();
120}
121
122init()
123{
124 int ib[259], t[10];
125 register i, c;
126 register char *cp;
127 char *ocp;
128 int n;
129 extern char end[];
130
131 if(fopen(crontab, ib) < 0) {
132 write(1, "cannot open table\n", 18);
133 exit();
134 }
135 cp = end;
136 if(aend == 0)
137 aend = cp;
138
139loop:
140 ocp = cp;
141 if(cp+100 > aend) {
142 aend =+ 512;
143 brk(aend);
144 }
145 for(i=0;; i++) {
146 do
147 c = getc(ib);
148 while(c == ' ' || c == '\t');
149 if(c <= 0 || c == '\n')
150 goto ignore;
151 if(i == 5)
152 break;
153 if(c == '*') {
154 *cp++ = ANY;
155 continue;
156 }
157 n = 0;
158 while(c >= '0' && c <= '9') {
159 n = n*10 + c-'0';
160 c = getc(ib);
161 }
162 if(n < 0 || n > 100)
163 goto ignore;
164 if(c == ',')
165 goto list;
166 if(c == '-')
167 goto range;
168 if(c != '\t' && c != ' ')
169 goto ignore;
170 *cp++ = n;
171 continue;
172
173 list:
174 *cp++ = LIST;
175 *cp++ = n;
176 list1:
177 n = 0;
178 c = getc(ib);
179 while(c >= '0' && c <= '9') {
180 n = n*10 + c-'0';
181 c = getc(ib);
182 }
183 if(n < 0 || n > 100)
184 goto ignore;
185 *cp++ = n;
186 if(c == ',')
187 goto list1;
188 if(c != '\t' && c != ' ')
189 goto ignore;
190 *cp++ = LIST;
191 continue;
192
193 range:
194 *cp++ = RANGE;
195 *cp++ = n;
196 n = 0;
197 c = getc(ib);
198 while(c >= '0' && c <= '9') {
199 n = n*10 + c-'0';
200 c = getc(ib);
201 }
202 if(n < 0 || n > 100)
203 goto ignore;
204 if(c != '\t' && c != ' ')
205 goto ignore;
206 *cp++ = n;
207 }
208 while(c != '\n') {
209 if(c <= 0)
210 goto ignore;
211 if(c == '%')
212 c = '\n';
213 *cp++ = c;
214 c = getc(ib);
215 }
216 *cp++ = '\n';
217 *cp++ = 0;
218 goto loop;
219
220ignore:
221 cp = ocp;
222 while(c != '\n') {
223 if(c <= 0) {
224 close(ib[0]);
225 *cp++ = EOF;
226 *cp++ = EOF;
227 aend = cp;
228 brk(aend);
229 return;
230 }
231 c = getc(ib);
232 }
233 goto loop;
234}