#include "uucp.h" #include #define STATNAME(f, n) sprintf(f, "%s/%s.%.7s", Spool, "STST", n) #define S_SIZE 100 /******* * systat(name, type, text) make system status entry * char *name, *text; * int type. * * return codes: none */ systat(name, type, text) char *name, *text; int type; { char filename[MAXFULLNAME], line[S_SIZE]; int count; FILE *fp; time_t prestime; 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[2], "%d", &count); if (count <= 0) count = 0; fclose(fp); } if (type == SS_FAIL) count++; fp = fopen(filename, "w"); ASSERT(fp != NULL, "SYSTAT OPEN FAIL %s", ""); chmod(filename, 0666); fprintf(fp, "%d %d %D %s %s\n", type, count, prestime, 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); } /*** * callok(name) check system status for call * char *name; * * return codes 0 - ok | >0 system status */ callok(name) char *name; { char filename[MAXFULLNAME], line[S_SIZE]; FILE *fp; time_t lasttime, prestime; 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%D", &type, &count, &lasttime); switch(type) { case SS_BADSEQ: case SS_CALLBACK: return(SS_OK); case SS_NODEVICE: return(SS_OK); case SS_INPROGRESS: if (prestime - lasttime < INPROGTIME) { DEBUG(4, "CALL IN PROGRESS %s\n", ""); return(type); } else return(SS_OK); case SS_FAIL: if (count > MAXRECALLS) { logent("MAX RECALLS", "NO CALL"); DEBUG(4, "MAX RECALL COUNT %d\n", count); return(type); } if (prestime - lasttime < RETRYTIME) { logent("RETRY TIME NOT REACHED", "NO CALL"); DEBUG(4, "RETRY TIME (%d) NOT REACHED\n", RETRYTIME); return(type); } return(SS_OK); default: return(SS_OK); } }