#ident "%Z%%M% %I% %E% SMI"
#include "uucp.h"
#define STATNAME(f, n) ((void)sprintf(f, "%s/%s", STATDIR, n))
#define S_SIZE 100
void
systat(name, type, text, retry)
register int type;
char *name, *text;
long retry;
{
register FILE *fp;
int count;
char filename[MAXFULLNAME], line[S_SIZE];
time_t prestime;
long presretry = 0;
char *vec[5];
line[0] = '\0';
(void) time(&prestime);
count = 0;
STATNAME(filename, name);
fp = fopen(filename, "r");
if (fp != NULL) {
if (fgets(line, S_SIZE, fp) != NULL)
if (getargs(line, vec, 4) == 4) {
count = atoi(vec[1]);
presretry = atol(vec[3]);
}
if (count <= 0)
count = 0;
fclose(fp);
}
switch (type) {
case SS_TIME_WRONG:
case SS_LOCKED_DEVICE:
case SS_CANT_ACCESS_DEVICE:
if (count > 1)
return;
break;
case SS_OK:
case SS_INPROGRESS:
case SS_CONVERSATION:
retry = 0;
count = 0;
break;
case SS_STARTUP:
retry = MAXRETRYTIME;
count = 0;
break;
default:
count++;
if (!retry) {
if (presretry < RETRYTIME)
retry = RETRYTIME;
else {
retry = presretry + presretry;
if (retry > MAXRETRYTIME)
retry = MAXRETRYTIME;
}
}
else {
if (retry < RETRYTIME)
retry = RETRYTIME;
}
break;
}
fp = fopen(filename, "w");
if (fp == NULL) {
errent(Ct_OPEN, filename, errno, __FILE__, __LINE__);
cleanup(FAIL);
}
(void) chmod(filename, PUB_FILEMODE);
(void) fprintf(fp, "%d %d %ld %ld %s %s\n",
type, count, prestime, retry, text, name);
(void) fclose(fp);
return;
}
int
callok(name)
char *name;
{
register FILE *fp;
register int t;
long retrytime;
int count, type;
char filename[MAXFULLNAME], line[S_SIZE];
time_t lasttime, prestime;
STATNAME(filename, name);
fp = fopen(filename, "r");
if (fp == NULL)
return(SS_OK);
if (fgets(line, S_SIZE, fp) == NULL) {
fclose(fp);
(void) unlink(filename);
return(SS_OK);
}
fclose(fp);
(void) time(&prestime);
sscanf(line, "%d%d%ld%ld", &type, &count, &lasttime, &retrytime);
t = type;
switch(t) {
case SS_SEQBAD:
case SS_LOGIN_FAILED:
case SS_DIAL_FAILED:
case SS_BAD_LOG_MCH:
case SS_BADSYSTEM:
case SS_CANT_ACCESS_DEVICE:
case SS_WRONG_MCH:
case SS_RLOCKED:
case SS_RUNKNOWN:
case SS_RLOGIN:
case SS_UNKNOWN_RESPONSE:
case SS_CHAT_FAILED:
case SS_CALLBACK_LOOP:
if (prestime - lasttime < retrytime) {
logent("RETRY TIME NOT REACHED", "NO CALL");
CDEBUG(4, "RETRY TIME (%ld) NOT REACHED\n", retrytime);
return(type);
}
return(SS_OK);
default:
return(SS_OK);
}
}