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