|
|
1.1 root 1: #ifndef lint
2: static char *sccsid = "@(#)cron.c 4.8 (Berkeley) 8/14/83";
3: #endif
4:
5: #include <sys/types.h>
6: #include <stdio.h>
7: #include <ctype.h>
8: #include <signal.h>
9: #include <sys/time.h>
10: #include <sys/stat.h>
11:
12: #define LISTS (2*BUFSIZ)
13: #define MAXLIN BUFSIZ
14:
15: #define EXACT 100
16: #define ANY 101
17: #define LIST 102
18: #define RANGE 103
19: #define EOS 104
20: char crontab[] = "/usr/lib/crontab";
21: time_t itime;
22: struct tm *loct;
23: struct tm *localtime();
24: char *malloc();
25: char *realloc();
26: int flag;
27: char *list;
28: unsigned listsize;
29:
30: main()
31: {
32: register char *cp;
33: char *cmp();
34: time_t filetime = 0;
35:
36: /* setuid(1); */
37: if (fork())
38: exit(0);
39: chdir("/");
40: freopen(crontab, "r", stdin);
41: freopen("/", "r", stdout);
42: freopen("/", "r", stderr);
43: signal(SIGHUP, SIG_IGN);
44: signal(SIGINT, SIG_IGN);
45: signal(SIGQUIT, SIG_IGN);
46: time(&itime);
47: itime -= localtime(&itime)->tm_sec;
48: fclose(stdin);
49:
50: for (;; itime+=60, slp()) {
51: struct stat cstat;
52:
53: if (stat(crontab, &cstat) == -1)
54: continue;
55: if (cstat.st_mtime > filetime) {
56: filetime = cstat.st_mtime;
57: init();
58: }
59: loct = localtime(&itime);
60: loct->tm_mon++; /* 1-12 for month */
61: if (loct->tm_wday == 0)
62: loct->tm_wday = 7; /* sunday is 7, not 0 */
63: for(cp = list; *cp != EOS;) {
64: flag = 0;
65: cp = cmp(cp, loct->tm_min);
66: cp = cmp(cp, loct->tm_hour);
67: cp = cmp(cp, loct->tm_mday);
68: cp = cmp(cp, loct->tm_mon);
69: cp = cmp(cp, loct->tm_wday);
70: if(flag == 0)
71: ex(cp);
72: while(*cp++ != 0)
73: ;
74: }
75: }
76: }
77:
78: char *
79: cmp(p, v)
80: char *p;
81: {
82: register char *cp;
83:
84: cp = p;
85: switch(*cp++) {
86:
87: case EXACT:
88: if (*cp++ != v)
89: flag++;
90: return(cp);
91:
92: case ANY:
93: return(cp);
94:
95: case LIST:
96: while(*cp != LIST)
97: if(*cp++ == v) {
98: while(*cp++ != LIST)
99: ;
100: return(cp);
101: }
102: flag++;
103: return(cp+1);
104:
105: case RANGE:
106: if(*cp > v || cp[1] < v)
107: flag++;
108: return(cp+2);
109: }
110: if(cp[-1] != v)
111: flag++;
112: return(cp);
113: }
114:
115: slp()
116: {
117: register i;
118: time_t t;
119:
120: time(&t);
121: i = itime - t;
122: if(i < -60 * 60 || i > 60 * 60) {
123: itime = t;
124: i = 60 - localtime(&itime)->tm_sec;
125: itime += i;
126: }
127: if(i > 0)
128: sleep(i);
129: }
130:
131: ex(s)
132: char *s;
133: {
134: int st;
135:
136: if(fork()) {
137: wait(&st);
138: return;
139: }
140: if(fork())
141: exit(0);
142: freopen("/", "r", stdin);
143: execl("/bin/sh", "sh", "-c", s, 0);
144: exit(0);
145: }
146:
147: init()
148: {
149: register i, c;
150: register char *cp;
151: register char *ocp;
152: register int n;
153:
154: freopen(crontab, "r", stdin);
155: if (list) {
156: free(list);
157: list = realloc(list, LISTS);
158: } else
159: list = malloc(LISTS);
160: listsize = LISTS;
161: cp = list;
162:
163: loop:
164: if(cp > list+listsize-MAXLIN) {
165: char *olist;
166: listsize += LISTS;
167: olist = list;
168: free(list);
169: list = realloc(list, listsize);
170: cp = list + (cp - olist);
171: }
172: ocp = cp;
173: for(i=0;; i++) {
174: do
175: c = getchar();
176: while(c == ' ' || c == '\t')
177: ;
178: if(c == EOF || c == '\n')
179: goto ignore;
180: if(i == 5)
181: break;
182: if(c == '*') {
183: *cp++ = ANY;
184: continue;
185: }
186: if ((n = number(c)) < 0)
187: goto ignore;
188: c = getchar();
189: if(c == ',')
190: goto mlist;
191: if(c == '-')
192: goto mrange;
193: if(c != '\t' && c != ' ')
194: goto ignore;
195: *cp++ = EXACT;
196: *cp++ = n;
197: continue;
198:
199: mlist:
200: *cp++ = LIST;
201: *cp++ = n;
202: do {
203: if ((n = number(getchar())) < 0)
204: goto ignore;
205: *cp++ = n;
206: c = getchar();
207: } while (c==',');
208: if(c != '\t' && c != ' ')
209: goto ignore;
210: *cp++ = LIST;
211: continue;
212:
213: mrange:
214: *cp++ = RANGE;
215: *cp++ = n;
216: if ((n = number(getchar())) < 0)
217: goto ignore;
218: c = getchar();
219: if(c != '\t' && c != ' ')
220: goto ignore;
221: *cp++ = n;
222: }
223: while(c != '\n') {
224: if(c == EOF)
225: goto ignore;
226: if(c == '%')
227: c = '\n';
228: *cp++ = c;
229: c = getchar();
230: }
231: *cp++ = '\n';
232: *cp++ = 0;
233: goto loop;
234:
235: ignore:
236: cp = ocp;
237: while(c != '\n') {
238: if(c == EOF) {
239: *cp++ = EOS;
240: *cp++ = EOS;
241: fclose(stdin);
242: return;
243: }
244: c = getchar();
245: }
246: goto loop;
247: }
248:
249: number(c)
250: register c;
251: {
252: register n = 0;
253:
254: while (isdigit(c)) {
255: n = n*10 + c - '0';
256: c = getchar();
257: }
258: ungetc(c, stdin);
259: if (n>100)
260: return(-1);
261: return(n);
262: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.