113672Ssam #ifndef lint 2*17838Sralph static char sccsid[] = "@(#)systat.c 5.2 (Berkeley) 01/22/85"; 313672Ssam #endif 413672Ssam 513672Ssam #include "uucp.h" 613672Ssam #include <sys/types.h> 713672Ssam 813672Ssam extern time_t time(); 913672Ssam 10*17838Sralph #define STATNAME(f, n) sprintf(f, "%s/%s/%.7s", Spool, "STST", n) 1113672Ssam #define S_SIZE 100 1213672Ssam 1313672Ssam /******* 1413672Ssam * systat(name, type, text) make system status entry 1513672Ssam * char *name, *text; 1613672Ssam * int type. 1713672Ssam * 1813672Ssam * return codes: none 1913672Ssam */ 2013672Ssam 2113672Ssam systat(name, type, text) 2213672Ssam char *name, *text; 2313672Ssam int type; 2413672Ssam { 2513672Ssam char filename[MAXFULLNAME], line[S_SIZE]; 26*17838Sralph int count, oldtype; 2713672Ssam register FILE *fp; 28*17838Sralph time_t prestime, rtry; 2913672Ssam 3013672Ssam if (type == 0) 3113672Ssam return; 3213672Ssam line[0] = '\0'; 3313672Ssam time(&prestime); 3413672Ssam count = 0; 3513672Ssam STATNAME(filename, name); 3613672Ssam 3713672Ssam fp = fopen(filename, "r"); 3813672Ssam if (fp != NULL) { 3913672Ssam fgets(line, S_SIZE, fp); 40*17838Sralph sscanf(line, "%d %d", &oldtype, &count); 4113672Ssam if (count <= 0) 4213672Ssam count = 0; 4313672Ssam fclose(fp); 44*17838Sralph /* If merely 'wrong time', don't change existing STST */ 45*17838Sralph if (type == SS_WRONGTIME && oldtype != SS_INPROGRESS) 46*17838Sralph return; 4713672Ssam } 4813672Ssam 49*17838Sralph rtry = Retrytime; 50*17838Sralph /* if failures repeat, don't try so often, 51*17838Sralph * to forstall a 'MAX RECALLS' situation. 52*17838Sralph */ 53*17838Sralph if (type == SS_FAIL) { 5413672Ssam count++; 55*17838Sralph if (count > 5) { 56*17838Sralph rtry = rtry * (count-5); 57*17838Sralph if (rtry > ONEDAY/2) 58*17838Sralph rtry = ONEDAY/2; 59*17838Sralph } 60*17838Sralph } 6113672Ssam 62*17838Sralph 63*17838Sralph #ifdef VMS 64*17838Sralph unlink(filename); 65*17838Sralph #endif VMS 6613672Ssam fp = fopen(filename, "w"); 67*17838Sralph ASSERT(fp != NULL, "SYSTAT OPEN FAIL", filename, 0); 68*17838Sralph fprintf(fp, "%d %d %ld %ld %s %s\n", type, count, prestime, rtry, text, name); 6913672Ssam fclose(fp); 7013672Ssam return; 7113672Ssam } 7213672Ssam 7313672Ssam /*** 7413672Ssam * rmstat(name) remove system status entry 7513672Ssam * char *name; 7613672Ssam * 7713672Ssam * return codes: none 7813672Ssam */ 7913672Ssam 8013672Ssam rmstat(name) 8113672Ssam char *name; 8213672Ssam { 8313672Ssam char filename[MAXFULLNAME]; 8413672Ssam 8513672Ssam STATNAME(filename, name); 8613672Ssam unlink(filename); 8713672Ssam } 8813672Ssam 8913672Ssam /*** 9013672Ssam * callok(name) check system status for call 9113672Ssam * char *name; 9213672Ssam * 9313672Ssam * return codes 0 - ok | >0 system status 9413672Ssam */ 9513672Ssam 9613672Ssam callok(name) 9713672Ssam char *name; 9813672Ssam { 9913672Ssam char filename[MAXFULLNAME], line[S_SIZE]; 10013672Ssam register FILE *fp; 101*17838Sralph time_t lasttime, prestime, retrytime; 102*17838Sralph long t1, t2; 10313672Ssam int count, type; 10413672Ssam 10513672Ssam STATNAME(filename, name); 10613672Ssam fp = fopen(filename, "r"); 10713672Ssam if (fp == NULL) 10813672Ssam return(SS_OK); 10913672Ssam 11013672Ssam if (fgets(line, S_SIZE, fp) == NULL) { 11113672Ssam /* no data */ 11213672Ssam fclose(fp); 11313672Ssam unlink(filename); 11413672Ssam return(SS_OK); 11513672Ssam } 11613672Ssam 11713672Ssam fclose(fp); 11813672Ssam time(&prestime); 119*17838Sralph sscanf(line, "%d%d%ld%ld", &type, &count, &t1, &t2); 120*17838Sralph lasttime = t1; 121*17838Sralph retrytime = t2; 12213672Ssam 12313672Ssam switch(type) { 12413672Ssam case SS_BADSEQ: 12513672Ssam case SS_CALLBACK: 12613672Ssam case SS_NODEVICE: 12713672Ssam case SS_INPROGRESS: /*let LCK take care of it */ 12813672Ssam return(SS_OK); 12913672Ssam 13013672Ssam case SS_FAIL: 13113672Ssam if (count > MAXRECALLS) { 13213672Ssam logent("MAX RECALLS", "NO CALL"); 13313672Ssam DEBUG(4, "MAX RECALL COUNT %d\n", count); 134*17838Sralph if (Debug) { 135*17838Sralph logent("debugging", "continuing anyway"); 136*17838Sralph return SS_OK; 137*17838Sralph } 138*17838Sralph return type; 13913672Ssam } 14013672Ssam 14113672Ssam if (prestime - lasttime < retrytime) { 14213672Ssam logent("RETRY TIME NOT REACHED", "NO CALL"); 143*17838Sralph DEBUG(4, "RETRY TIME (%ld) NOT REACHED\n", retrytime); 144*17838Sralph if (Debug) { 145*17838Sralph logent("debugging", "continuing anyway"); 146*17838Sralph return SS_OK; 147*17838Sralph } 148*17838Sralph return type; 14913672Ssam } 15013672Ssam 151*17838Sralph return SS_OK; 15213672Ssam default: 153*17838Sralph return SS_OK; 15413672Ssam } 15513672Ssam } 156