1: #define ANY -1
2: #define LIST -2
3: #define RANGE -3
4: #define EOF -4
5: char *crontab "/usr/lib/crontab";
6: char *crontmp "/tmp/crontmp";
7: char *aend;
8: char *itime[2];
9: int *loct;
10: int *localtime();
11: int reset();
12: int flag;
13:
14: main()
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:
31: loop:
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:
58: cmp(p, v)
59: char *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:
89: slp()
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:
100: ex(s)
101: char *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:
122: init()
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:
139: loop:
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:
220: ignore:
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: }
Defined functions
cmp
defined in line
58; used 5 times
ex
defined in line
100; used 1 times
init
defined in line
122; used 1 times
main
defined in line
14;
never used
slp
defined in line
89; used 2 times
Defined variables
aend
defined in line
7; used 7 times
flag
defined in line
12; used 5 times
itime
defined in line
8; used 12 times
loct
defined in line
9; used 6 times
Defined macros
ANY
defined in line
1; used 1 times
EOF
defined in line
4; used 3 times
LIST
defined in line
2; used 4 times
RANGE
defined in line
3; used 1 times