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

Defined functions

cmp defined in line 73; used 6 times
ex defined in line 121; used 1 times
  • in line 65
init defined in line 137; used 1 times
  • in line 52
main defined in line 25; never used
number defined in line 239; used 3 times
slp defined in line 110; used 2 times

Defined variables

crontab defined in line 15; used 3 times
flag defined in line 21; used 6 times
list defined in line 22; used 13 times
listsize defined in line 23; used 4 times
loct defined in line 17; used 7 times

Defined macros

ANY defined in line 11; used 1 times
EOS defined in line 14; used 3 times
EXACT defined in line 10; used 1 times
LIST defined in line 12; used 4 times
LISTS defined in line 8; used 4 times
RANGE defined in line 13; used 1 times
Last modified: 1979-05-05
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 773
Valid CSS Valid XHTML 1.0 Strict