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 >
Wrap
C/C++ Source or Header
|
1987-12-04
|
4KB
|
208 lines
#include <ctype.h>
#include <procid.h>
#define EVENTNUM 24 /* maximum number of events */
#define TERM -1
#define WILD -2
#define RANGE -3 /* followed by start & finish */
int event_count;
struct event {
int ev_pid;
int ev_time, ev_date;
char ev_minute[61];
char ev_hour[25];
char ev_day[32];
char ev_month[13];
char ev_weekday[8];
char ev_string[256];
} events[EVENTNUM];
main (argc, argv)
char *argv[];
{
int curtime, curdate, tick;
short curday;
int min_wait;
int i, j, k;
struct pdsc buffer;
readcron ();
while (1) {
_sysdate (0, &curtime, &curdate, &curday, &tick);
for (i = 0; i < event_count; i++) {
if (events[i].ev_pid != 0 &&
_get_process_desc (events[i].ev_pid, sizeof (buffer), &buffer) != -1 &&
buffer._state & (1 << 8))
while (events[i].ev_pid) {
j = wait (0);
for (k = 0; k < event_count; k++)
if (events[k].ev_pid == j)
events[k].ev_pid = 0; /* It's dead, Jim */
}
if (events[i].ev_pid == 0 &&
test (&events[i], curtime, curdate, curday))
events[i].ev_pid = os9fork ("shell",
strlen (events[i].ev_string)+1, events[i].ev_string,
0, 0, 0, 0);
}
_sysdate (0, &curtime, &curdate, &curday, &tick);
sleep (61 - (curtime & 0xff));
}
}
test (target, time, date, day)
struct event *target;
int time, date, day;
{
int i;
return (test_field (target->ev_minute, (time >> 8) & 0xff) &&
test_field (target->ev_hour, (time >> 16) & 0xff) &&
test_field (target->ev_day, date & 0xff) &&
test_field (target->ev_month, (date >> 8) & 0xff) &&
test_field (target->ev_weekday, day));
}
test_field (field, val)
char *field;
{
for ( ; *field != TERM; field++) {
if (*field == WILD)
break;
else if (*field == RANGE) {
field += 2;
if (*(field-1) > *field) {
if (val <= *(field-1) || *field <= val)
break;
}
else
if (*(field-1) <= val && val <= *field)
break;
}
else if (*field == val)
break;
}
return (*field != TERM);
}
/* Read /dd/misc/crontab and build event array. */
readcron ()
{
int f, len;
char line[300], field[80], *p;
if ((f = open ("/dd/misc/crontab", 1)) < 0)
exit (0);
for (event_count = 0; event_count < EVENTNUM; event_count++) {
if ((len = readln (f, line, 300)) <= 0)
break;
line[len-1] = '\0';
p = line;
p += scanword (p, field, 80);
getvals (field, events[event_count].ev_minute);
p += scanword (p, field, 80);
getvals (field, events[event_count].ev_hour);
p += scanword (p, field, 80);
getvals (field, events[event_count].ev_day);
p += scanword (p, field, 80);
getvals (field, events[event_count].ev_month);
p += scanword (p, field, 80);
getvals (field, events[event_count].ev_weekday);
while (*p && isspace (*p))
p++;
strncpy (events[event_count].ev_string, p, 256);
}
close (f);
}
getvals (str, vals)
char *str, *vals;
{
char *i, *p;
i = vals;
p = str;
while (*p) {
if (*p == '*') {
*i++ = WILD;
p++;
}
else if (*p == '-') {
*i = *(i-1);
*(i-1) = RANGE;
i++;
p++;
}
else if (isdigit (*p)) {
*i++ = atoi (p);
while (isdigit (*p))
p++;
}
else
p++;
}
*i = TERM;
return;
}
scanword (s, d, len)
char *s, *d;
{
char *p;
int num = 0;
while (*s && isspace (*s)) {
s++;
num++;
}
p = d;
while (*s && !isspace (*s)) {
if (p - d < len - 1) *p++ = *s;
s++;
num++;
}
*p = '\0';
return (num);
}
strncpy (s1, s2, len)
char *s1, *s2;
{
while (*s2 && --len)
*s1++ = *s2++;
*s1 = '\0';
}
/*
dumpcron ()
{
int i, j;
for (i = 0; i < event_count; i++) {
printf ("event %d\n", i);
printf (" minute: ");
for (j = 0; events[i].ev_minute[j] != TERM; j++)
printf (" %d", events[i].ev_minute[j]);
printf ("\n");
printf (" hour: ");
for (j = 0; events[i].ev_hour[j] != TERM; j++)
printf (" %d", events[i].ev_hour[j]);
printf ("\n");
printf (" day: ");
for (j = 0; events[i].ev_day[j] != TERM; j++)
printf (" %d", events[i].ev_day[j]);
printf ("\n");
printf (" month: ");
for (j = 0; events[i].ev_month[j] != TERM; j++)
printf (" %d", events[i].ev_month[j]);
printf ("\n");
printf (" weekday: ");
for (j = 0; events[i].ev_weekday[j] != TERM; j++)
printf (" %d", events[i].ev_weekday[j]);
printf ("\n");
printf ("string: %s\n\n", events[i].ev_string);
}
}
*/