150 lines
2.7 KiB
C
150 lines
2.7 KiB
C
#ifndef lint
|
|
static char sccsid[] = "@(#)systat.c 5.4 (Berkeley) 6/23/85";
|
|
#endif
|
|
|
|
#include "uucp.h"
|
|
|
|
#define STATNAME(f, n) sprintf(f, "%s/%s/%s", Spool, "STST", n)
|
|
#define S_SIZE 100
|
|
|
|
/*LINTLIBRARY*/
|
|
|
|
/*
|
|
* make system status entry
|
|
* return codes: none
|
|
*/
|
|
systat(name, type, text)
|
|
char *name, *text;
|
|
int type;
|
|
{
|
|
char filename[MAXFULLNAME], line[S_SIZE];
|
|
int count, oldtype;
|
|
register FILE *fp;
|
|
time_t prestime, rtry;
|
|
|
|
if (type == 0)
|
|
return;
|
|
line[0] = '\0';
|
|
time(&prestime);
|
|
count = 0;
|
|
STATNAME(filename, name);
|
|
|
|
fp = fopen(filename, "r");
|
|
if (fp != NULL) {
|
|
fgets(line, S_SIZE, fp);
|
|
sscanf(line, "%d %d", &oldtype, &count);
|
|
if (count <= 0)
|
|
count = 0;
|
|
fclose(fp);
|
|
/* If merely 'wrong time', don't change existing STST */
|
|
if (type == SS_WRONGTIME && oldtype != SS_INPROGRESS)
|
|
return;
|
|
}
|
|
|
|
rtry = Retrytime;
|
|
/* if failures repeat, don't try so often,
|
|
* to forstall a 'MAX RECALLS' situation.
|
|
*/
|
|
if (type == SS_FAIL) {
|
|
count++;
|
|
if (count > 5) {
|
|
rtry = rtry * (count-5);
|
|
if (rtry > ONEDAY/2)
|
|
rtry = ONEDAY/2;
|
|
}
|
|
}
|
|
|
|
|
|
#ifdef VMS
|
|
unlink(filename);
|
|
#endif
|
|
fp = fopen(filename, "w");
|
|
ASSERT(fp != NULL, "SYSTAT OPEN FAIL", filename, 0);
|
|
fprintf(fp, "%d %d %ld %ld %s %s\n", type, count, prestime, rtry, text, name);
|
|
fclose(fp);
|
|
return;
|
|
}
|
|
|
|
/***
|
|
* rmstat(name) remove system status entry
|
|
* char *name;
|
|
*
|
|
* return codes: none
|
|
*/
|
|
|
|
rmstat(name)
|
|
char *name;
|
|
{
|
|
char filename[MAXFULLNAME];
|
|
|
|
STATNAME(filename, name);
|
|
unlink(filename);
|
|
}
|
|
|
|
/*
|
|
* check system status for call
|
|
*
|
|
* return codes 0 - ok | >0 system status
|
|
*/
|
|
|
|
callok(name)
|
|
char *name;
|
|
{
|
|
char filename[MAXFULLNAME], line[S_SIZE];
|
|
register FILE *fp;
|
|
time_t lasttime, prestime, retrytime;
|
|
long t1, t2;
|
|
int count, type;
|
|
|
|
STATNAME(filename, name);
|
|
fp = fopen(filename, "r");
|
|
if (fp == NULL)
|
|
return(SS_OK);
|
|
|
|
if (fgets(line, S_SIZE, fp) == NULL) {
|
|
/* no data */
|
|
fclose(fp);
|
|
unlink(filename);
|
|
return(SS_OK);
|
|
}
|
|
|
|
fclose(fp);
|
|
time(&prestime);
|
|
sscanf(line, "%d%d%ld%ld", &type, &count, &t1, &t2);
|
|
lasttime = t1;
|
|
retrytime = t2;
|
|
|
|
switch(type) {
|
|
case SS_BADSEQ:
|
|
case SS_CALLBACK:
|
|
case SS_NODEVICE:
|
|
case SS_INPROGRESS: /*let LCK take care of it */
|
|
return(SS_OK);
|
|
|
|
case SS_FAIL:
|
|
if (count > MAXRECALLS) {
|
|
logent("MAX RECALLS", "NO CALL");
|
|
DEBUG(4, "MAX RECALL COUNT %d\n", count);
|
|
if (Debug) {
|
|
logent("debugging", "continuing anyway");
|
|
return SS_OK;
|
|
}
|
|
return type;
|
|
}
|
|
|
|
if (prestime - lasttime < retrytime) {
|
|
logent("RETRY TIME NOT REACHED", "NO CALL");
|
|
DEBUG(4, "RETRY TIME (%ld) NOT REACHED\n", retrytime);
|
|
if (Debug) {
|
|
logent("debugging", "continuing anyway");
|
|
return SS_OK;
|
|
}
|
|
return type;
|
|
}
|
|
|
|
return SS_OK;
|
|
default:
|
|
return SS_OK;
|
|
}
|
|
}
|