home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V6 / usr / source / s1 / cron.c < prev    next >
Encoding:
C/C++ Source or Header  |  1975-05-13  |  3.1 KB  |  235 lines

  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. }
  235.