home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / TELECOM / OSKBox.lzh / MAILBOX / CC / cron.c < prev    next >
C/C++ Source or Header  |  1987-12-04  |  4KB  |  208 lines

  1. #include <ctype.h>
  2. #include <procid.h>
  3.  
  4. #define EVENTNUM 24            /* maximum number of events */
  5.  
  6. #define TERM -1
  7. #define WILD -2
  8. #define RANGE -3            /* followed by start & finish */
  9.  
  10. int event_count;
  11. struct event {
  12.     int ev_pid;
  13.     int ev_time, ev_date;
  14.     char ev_minute[61];
  15.     char ev_hour[25];
  16.     char ev_day[32];
  17.     char ev_month[13];
  18.     char ev_weekday[8];
  19.     char ev_string[256];
  20.     } events[EVENTNUM];
  21.  
  22. main (argc, argv)
  23. char *argv[];
  24. {
  25.     int curtime, curdate, tick;
  26.     short curday;
  27.     int min_wait;
  28.     int i, j, k;
  29.     struct pdsc buffer;
  30.  
  31.     readcron ();
  32.     while (1) {
  33.         _sysdate (0, &curtime, &curdate, &curday, &tick);
  34.         for (i = 0; i < event_count; i++) {
  35.             if (events[i].ev_pid != 0 &&
  36.         _get_process_desc (events[i].ev_pid, sizeof (buffer), &buffer) != -1 &&
  37.                     buffer._state & (1 << 8))
  38.                 while (events[i].ev_pid) {
  39.                     j = wait (0);
  40.                     for (k = 0; k < event_count; k++)
  41.                         if (events[k].ev_pid == j)
  42.                             events[k].ev_pid = 0;    /* It's dead, Jim */
  43.                     }
  44.             if (events[i].ev_pid == 0 &&
  45.                     test (&events[i], curtime, curdate, curday))
  46.                 events[i].ev_pid = os9fork ("shell",
  47.                     strlen (events[i].ev_string)+1, events[i].ev_string, 
  48.                     0, 0, 0, 0);
  49.             }
  50.         _sysdate (0, &curtime, &curdate, &curday, &tick);
  51.         sleep (61 - (curtime & 0xff));
  52.         }
  53.     }
  54.  
  55. test (target, time, date, day)
  56. struct event *target;
  57. int time, date, day;
  58. {
  59.     int i;
  60.  
  61.     return (test_field (target->ev_minute, (time >> 8) & 0xff) &&
  62.             test_field (target->ev_hour, (time >> 16) & 0xff) &&
  63.             test_field (target->ev_day, date & 0xff) &&
  64.             test_field (target->ev_month, (date >> 8) & 0xff) &&
  65.             test_field (target->ev_weekday, day));
  66.     }
  67.  
  68. test_field (field, val)
  69. char *field;
  70. {
  71.     for ( ; *field != TERM; field++) {
  72.         if (*field == WILD)
  73.             break;
  74.         else if (*field == RANGE) {
  75.             field += 2;
  76.             if (*(field-1) > *field) {
  77.                 if (val <= *(field-1) || *field <= val)
  78.                     break;
  79.                 }
  80.             else
  81.                 if (*(field-1) <= val && val <= *field)
  82.                     break;
  83.             }
  84.         else if (*field == val)
  85.             break;
  86.         }
  87.     return (*field != TERM);
  88.     }
  89.  
  90. /* Read /dd/misc/crontab and build event array. */
  91. readcron ()
  92. {
  93.     int f, len;
  94.     char line[300], field[80], *p;
  95.  
  96.     if ((f = open ("/dd/misc/crontab", 1)) < 0)
  97.         exit (0);
  98.     for (event_count = 0; event_count < EVENTNUM; event_count++) {
  99.         if ((len = readln (f, line, 300)) <= 0)
  100.             break;
  101.         line[len-1] = '\0';
  102.         p = line;
  103.         p += scanword (p, field, 80);
  104.         getvals (field, events[event_count].ev_minute);
  105.         p += scanword (p, field, 80);
  106.         getvals (field, events[event_count].ev_hour);
  107.         p += scanword (p, field, 80);
  108.         getvals (field, events[event_count].ev_day);
  109.         p += scanword (p, field, 80);
  110.         getvals (field, events[event_count].ev_month);
  111.         p += scanword (p, field, 80);
  112.         getvals (field, events[event_count].ev_weekday);
  113.         while (*p && isspace (*p))
  114.             p++;
  115.         strncpy (events[event_count].ev_string, p, 256);
  116.         }
  117.     close (f);
  118.     }
  119.  
  120. getvals (str, vals)
  121. char *str, *vals;
  122. {
  123.     char *i, *p;
  124.  
  125.     i = vals;
  126.     p = str;
  127.     while (*p) {
  128.         if (*p == '*') {
  129.             *i++ = WILD;
  130.             p++;
  131.             }
  132.         else if (*p == '-') {
  133.             *i = *(i-1);
  134.             *(i-1) = RANGE;
  135.             i++;
  136.             p++;
  137.             }
  138.         else if (isdigit (*p)) {
  139.             *i++ = atoi (p);
  140.             while (isdigit (*p))
  141.                 p++;
  142.             }
  143.         else
  144.             p++;
  145.         }
  146.     *i = TERM;
  147.     return;
  148.     }
  149.  
  150. scanword (s, d, len)
  151. char *s, *d;
  152. {
  153.     char *p;
  154.     int num = 0;
  155.  
  156.     while (*s && isspace (*s)) {
  157.         s++;
  158.         num++;
  159.         }
  160.     p = d;
  161.     while (*s && !isspace (*s)) {
  162.         if (p - d < len - 1) *p++ = *s;
  163.         s++;
  164.         num++;
  165.         }
  166.     *p = '\0';
  167.     return (num);
  168.     }
  169.  
  170. strncpy (s1, s2, len)
  171. char *s1, *s2;
  172. {
  173.     while (*s2 && --len)
  174.         *s1++ = *s2++;
  175.     *s1 = '\0';
  176.     }
  177. /*
  178. dumpcron ()
  179. {
  180.     int i, j;
  181.  
  182.     for (i = 0; i < event_count; i++) {
  183.         printf ("event %d\n", i);
  184.         printf ("  minute: ");
  185.         for (j = 0; events[i].ev_minute[j] != TERM; j++)
  186.             printf (" %d", events[i].ev_minute[j]);
  187.         printf ("\n");
  188.         printf ("  hour: ");
  189.         for (j = 0; events[i].ev_hour[j] != TERM; j++)
  190.             printf (" %d", events[i].ev_hour[j]);
  191.         printf ("\n");
  192.         printf ("  day: ");
  193.         for (j = 0; events[i].ev_day[j] != TERM; j++)
  194.             printf (" %d", events[i].ev_day[j]);
  195.         printf ("\n");
  196.         printf ("  month: ");
  197.         for (j = 0; events[i].ev_month[j] != TERM; j++)
  198.             printf (" %d", events[i].ev_month[j]);
  199.         printf ("\n");
  200.         printf ("  weekday: ");
  201.         for (j = 0; events[i].ev_weekday[j] != TERM; j++)
  202.             printf (" %d", events[i].ev_weekday[j]);
  203.         printf ("\n");
  204.         printf ("string: %s\n\n", events[i].ev_string);
  205.         }
  206.     }
  207. */
  208.